Skip to content

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexGyver committed Feb 22, 2020
1 parent e4b844f commit 2e81918
Show file tree
Hide file tree
Showing 10 changed files with 1,529 additions and 1 deletion.
1,266 changes: 1,266 additions & 0 deletions GyverTimers/GyverTimers.h

Large diffs are not rendered by default.

Binary file added GyverTimers/docs/timers.xlsx
Binary file not shown.
64 changes: 64 additions & 0 deletions GyverTimers/examples/all_functions/all_functions.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// Демонстрация всех функций библиотеки

#include <GyverTimers.h>

void setup() {
// Перенастроить таймер и задать ему период или частоту
// Все функции возвращают реальный период / частоту, которые могут отличаться от введенных
Timer2.setPeriod(1000); // Задать конкретный период 1000 мкс (~ 1000 гц), вернет реальный период в мкс
Timer0.setFrequency(250); // Задать частоту прерываний таймера в Гц, вернет реальную частоту в герцах
Timer1.setFrequencyFloat(50.20); // Задать частоту более точно, в дробных числах, актуально для низких частот и таймера 1
// С этого момента таймер уже перенастроен и гоняет с выьранной частотой / периодом

// Подключить прерывание таймера, с этого момента прерывания начнут вызываться
Timer0.enableISR(); // Подключить стандартное прерывание, канал А, без сдига фаз
Timer2.enableISR(CHANNEL_B, 180); // Подключить прерывание таймера 2, канал B, начальная фаза - 180 градусов
Timer1.enableISR(CHANNEL_A, 60); // Подключить прерывание канала А, задать фазу для канала А доступно только для таймера 1!
Timer1.enableISR(CHANNEL_B, 120); // Подключить второе прерывание таймера 1, и задать фазовый сдвиг для этого потока
// Прерывание уже начнет вызываться

// Если вдруг прерывание нужно отключить, не останавливая таймер
Timer1.disableISR(CHANNEL_B);
// С этого момента прерывание B больше не будет вызываться

// Если нужно приостановить таймер ПОЛНОСТЬЮ, аппаратно
Timer2.pause();
// С этого момента таймер стоит на месте, содержимое счетчика остается нетронутым

// Теперь таймер можно вернуть в строй
Timer2.resume();
// Таймер продолжил считать с того же места

// Если нужно полностью остановить таймер и сбросить содержимое счетчика
Timer1.stop();
// Таймер стоит, счетчик сброшен

// Возвращаем таймер в строй
Timer1.restart();
// Таймер перезапущен, начал считать с начала

// Если нужно вернуть стандартные Arduino - настройки таймера
Timer0.setDefault();
// Теперь таймер работает в станлартном режиме
}

// векторы прерываний
ISR(TIMER1_A) {

}

ISR(TIMER1_B) {

}

ISR(TIMER2_B) {

}

ISR(TIMER0_A) {

}

void loop() {

}
25 changes: 25 additions & 0 deletions GyverTimers/examples/double_interrupts/double_interrupts.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Пример генерации двухканальных прерываний на таймере с РАВНЫМ периодом, но сдвинутых по фазе
// два потока прерываний с сдвигом 180 градусов (полная инверсия)

#include <GyverTimers.h>

void setup() {
Serial.begin(9600);

Serial.print("Real timer frequency is : "); // Выведем реальную частоту, реальная может отличаться от заданой (ограничено разрешением таймера)
Serial.println(Timer1.setFrequencyFloat(2.50)); // Частота прерываний - 2.5 гц , используй .setFrequency(...) для целых чисел
delay(1000);
Timer1.enableISR(CHANNEL_A, 0); // Первый канал - А, начальная фаза - 0 градусов
Timer1.enableISR(CHANNEL_B, 180); // Второй канал - B, начальная фаза - 180 градусов
}

void loop() {}

// два прерывания на одном таймере
ISR(TIMER1_A) {
Serial.println(" Channel A interrupt !"); // Прерывание А
}

ISR(TIMER1_B) {
Serial.println(" Channel B interrupt !"); // Прерывание B
}
15 changes: 15 additions & 0 deletions GyverTimers/examples/meandr_2tact/meandr_2tact.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Пример генерации двухтактного меандра на таймере 2 (пины D3 и D11)
#include <GyverTimers.h>

void setup() {
pinMode(3, OUTPUT); // настроить пин как выход
pinMode(11, OUTPUT); // настроить пин как выход
Timer2.setFrequency(30000); // настроить частоту таймера в Гц и запустить таймер
Timer2.outputEnable(CHANNEL_A, TOGGLE_PIN); // в момент срабатывания таймера пин будет переключаться
Timer2.outputEnable(CHANNEL_B, TOGGLE_PIN); // в момент срабатывания таймера пин будет переключаться
Timer2.outputState(CHANNEL_A, HIGH); // задаём начальное состояние пина 11
Timer2.outputState(CHANNEL_B, LOW); // задаём начальное состояние пина 3
}

void loop() {
}
11 changes: 11 additions & 0 deletions GyverTimers/examples/meandr_test/meandr_test.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
//Пример генерации меандра на таймере 2 , канале B (D3 на Arduino UNO)
#include <GyverTimers.h>

void setup() {
pinMode(3, OUTPUT); // настроить пин как выход
Timer2.setFrequency(500); // настроить частоту таймера в Гц
Timer2.outputEnable(CHANNEL_B, TOGGLE_PIN); // в момент срабатывания таймера пин будет переключаться
}

void loop() {
}
28 changes: 28 additions & 0 deletions GyverTimers/examples/simple/simple.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Пример простой генерации прерываний аппаратным таймером
#include <GyverTimers.h>

void setup() {
Serial.begin(9600);
Timer1.setFrequency(3); // Высокоточный таймер 1 для первого прерывания, частота - 3 Герца
//Timer1.setPeriod(333333); // то же самое! Частота 3 Гц это период 333 333 микросекунд
//Timer1.setFrequencyFloat(4.22); // Если нужна дробная частота в Гц
Timer1.enableISR(); // Запускаем прерывание (по умолч. канал А)

// запустим второй таймер
Timer2.setPeriod(1000000); // Устанавливаем период таймера 1000000 мкс -> 1 гц
Timer2.enableISR(CHANNEL_A); // Или просто .enableISR(), запускаем прерывание на канале А таймера 2
pinMode(13, OUTPUT); // будем мигать
}

void loop() {}

// Прерывание А таймера 1
ISR(TIMER1_A) { // пишем в сериал
Serial.println("timer1");
}

// Прерывание А таймера 2
ISR(TIMER2_A) { // генерируем меандр 1 кгц, мигаем
digitalWrite(13, !digitalRead(13));
//Serial.println("timer2");
}
62 changes: 62 additions & 0 deletions GyverTimers/keywords.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#######################################
# Syntax Coloring Map For GyverTimers
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################
GyverTimers KEYWORD1

Timer0 KEYWORD1
Timer1 KEYWORD1
Timer2 KEYWORD1
Timer3 KEYWORD1
Timer4 KEYWORD1
Timer5 KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################
ISR KEYWORD2

setPeriod KEYWORD2
setFrequency KEYWORD2
setFrequencyFloat KEYWORD2
enableISR KEYWORD2
disableISR KEYWORD2
pause KEYWORD2
resume KEYWORD2
stop KEYWORD2
restart KEYWORD2
setDefault KEYWORD2
outputEnable KEYWORD2
outputDisable KEYWORD2
outputState KEYWORD2

#######################################
# Constants (LITERAL1)
#######################################
TIMER0_A LITERAL1
TIMER0_B LITERAL1
TIMER1_A LITERAL1
TIMER1_B LITERAL1
TIMER1_C LITERAL1
TIMER2_A LITERAL1
TIMER2_B LITERAL1
TIMER3_A LITERAL1
TIMER3_B LITERAL1
TIMER3_C LITERAL1
TIMER4_A LITERAL1
TIMER4_B LITERAL1
TIMER4_C LITERAL1
TIMER5_A LITERAL1
TIMER5_B LITERAL1
TIMER5_C LITERAL1

CHANNEL_A LITERAL1
CHANNEL_B LITERAL1
CHANNEL_C LITERAL1

TOGGLE_PIN LITERAL1
CLEAR_PIN LITERAL1
SET_PIN LITERAL1
9 changes: 9 additions & 0 deletions GyverTimers/library.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name=GyverTimers
version=1.0
author=AlexGyver <[email protected]>
maintainer=AlexGyver <[email protected]>
sentence=Library for control hardware timer on ATmega328p.
paragraph=Has some functions to control timer run: start, stop, pause, set period and frequency.
category=Timing
url=https://github.com/AlexGyver/GyverLibs
architectures=*
50 changes: 49 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@

### Системное
* [buildTime](#buildTime) - получение времени компиляции в численном виде
* [GyverTimer012](#GyverTimer012) - настройка прерываний по таймерам 0/1/2
* ~~[GyverTimer012](#GyverTimer012) - настройка прерываний по таймерам 0/1/2~~ Вместо неё теперь есть **GyverTimers**
* [GyverTimers](#GyverTimers) - настройка прерываний по аппаратным таймерам ATmega328 и ATmega2560
* [GyverHacks](#GyverHacks) - набор различных хаков с микроконтроллером
* [GyverPower](#GyverPower) - библиотека для управления энергопотреблением МК

Expand Down Expand Up @@ -551,8 +552,55 @@ parseFloat | 1070 | 246 | 824

---

<a id="GyverTimers"></a>
### GyverTimers v1.0 [СКАЧАТЬ](https://github.com/AlexGyver/GyverLibs/releases/download/GyverTimers/GyverTimers.zip), [ДОКУМЕНТАЦИЯ](https://alexgyver.ru/GyverTimers/)
Настройка и контроль прерываний по аппаратным таймерам:
- Поддерживаются все три таймера на ATmega328 и шесть таймеров на ATmega2560;
- Настройка периода (мкс) и частоты (Гц) прерываний:
- 8 бит таймеры: 31 Гц - 1 МГц (32 258 мкс - 1 мкс);
- 16 бит таймеры: 0.11 Гц - 1 МГц (9 000 000 мкс - 1 мкс);
- Автоматическая корректировка настройки периода от частоты тактирования (F_CPU);
- Функция возвращает точный установившийся период/частоту для отладки (частота ограничена разрешением таймера);
- Поддержка многоканального режима работы: один таймер вызывает 2 (ATmega328) или
3 (ATmega2560, таймеры 1, 3, 4, 5) прерывания с настраиваемым сдвигом по фазе 0-360 градусов;
- Настраиваемое действие аппаратного вывода таймера по прерыванию: высокий сигнал, низкий сигнал, переключение.
Позволяет генерировать меандр (одно- и двухтактный);
- Контроль работы таймера: старт/стоп/пауза/продолжить/инициализация;
#### Методы и функции библиотеки
<details>
<summary>РАЗВЕРНУТЬ</summary>
<p>
Смотри примеры в папке examples!

```C
// N - номер таймера (0, 1... 5)
TimerN.setPeriod(период) - установка периода в микросекундах и запуск таймера. Возвращает реальный период (точность ограничена разрешением таймера).
TimerN.setFrequency(частота) - установка частоты в Герцах и запуск таймера. Возвращает реальную частоту (точность ограничена разрешением таймера).
TimerN.setFrequencyFloat(частота float) - установка частоты в Герцах и запуск таймера, разрешены десятичные дроби. Возвращает реальную частоту (точность ограничена разрешением таймера).
TimerN.enableISR(источник, фаза) - включить прерывания, канал прерываний CHANNEL_A или CHANNEL_B (+ CHANNEL_C у Mega2560), сдвиг фазы 0-359 (без указания параметров будет включен канал А и сдвиг фазы 0).
TimerN.disableISR(источник) - выключить прерывания, канал CHANNEL_A или CHANNEL_B. Счёт таймера не останавливается (без указания параметров будет выключен канал А).
TimerN.pause() - приостановить счёт таймера, не сбрасывая счётчик
TimerN.resume() - продолжить счёт после паузы
TimerN.stop() - остановить счёт и сбросить счётчик
TimerN.restart() - перезапустить таймер (сбросить счётчик)
TimerN.setDefault() - установить параметры таймера по умолчанию ("Ардуино-умолчания")
TimerN.outputEnable(канал, режим) - канал: включить выход таймера CHANNEL_A или CHANNEL_B (+ CHANNEL_C у Mega2560). Режим: TOGGLE_PIN, CLEAR_PIN, SET_PIN (переключить/выключить/включить пин по прерыванию)
TimerN.outputDisable(канал) - отключить выход таймера CHANNEL_A или CHANNEL_B (+ CHANNEL_C у Mega2560, см. такблицу таймеров)
TimerN.outputState(канал, состояние) - сменить состояние канала: HIGH / LOW

Прерывание
ISR(TIMERn_A) {
// ваш код
}
```
</p>
</details>
---
<a id="GyverTimer012"></a>
### GyverTimer012 v1.0 [СКАЧАТЬ](https://github.com/AlexGyver/GyverLibs/releases/download/GyverTimer012/GyverTimer012.zip), [ДОКУМЕНТАЦИЯ](https://alexgyver.ru/gyvertimer012/)
~~**Библиотека устарела. Используйте GyverTimers**~~
Лёгкая библиотека для управления всеми тремя таймерами ATmega328
- Генерация прерываний по таймерам 0/1/2
- Настройка частоты или периода прерываний
Expand Down

0 comments on commit 2e81918

Please sign in to comment.