Skip to content

Commit 2e81918

Browse files
committed
upd
1 parent e4b844f commit 2e81918

File tree

10 files changed

+1529
-1
lines changed

10 files changed

+1529
-1
lines changed

GyverTimers/GyverTimers.h

Lines changed: 1266 additions & 0 deletions
Large diffs are not rendered by default.

GyverTimers/docs/timers.xlsx

9.58 KB
Binary file not shown.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Демонстрация всех функций библиотеки
2+
3+
#include <GyverTimers.h>
4+
5+
void setup() {
6+
// Перенастроить таймер и задать ему период или частоту
7+
// Все функции возвращают реальный период / частоту, которые могут отличаться от введенных
8+
Timer2.setPeriod(1000); // Задать конкретный период 1000 мкс (~ 1000 гц), вернет реальный период в мкс
9+
Timer0.setFrequency(250); // Задать частоту прерываний таймера в Гц, вернет реальную частоту в герцах
10+
Timer1.setFrequencyFloat(50.20); // Задать частоту более точно, в дробных числах, актуально для низких частот и таймера 1
11+
// С этого момента таймер уже перенастроен и гоняет с выьранной частотой / периодом
12+
13+
// Подключить прерывание таймера, с этого момента прерывания начнут вызываться
14+
Timer0.enableISR(); // Подключить стандартное прерывание, канал А, без сдига фаз
15+
Timer2.enableISR(CHANNEL_B, 180); // Подключить прерывание таймера 2, канал B, начальная фаза - 180 градусов
16+
Timer1.enableISR(CHANNEL_A, 60); // Подключить прерывание канала А, задать фазу для канала А доступно только для таймера 1!
17+
Timer1.enableISR(CHANNEL_B, 120); // Подключить второе прерывание таймера 1, и задать фазовый сдвиг для этого потока
18+
// Прерывание уже начнет вызываться
19+
20+
// Если вдруг прерывание нужно отключить, не останавливая таймер
21+
Timer1.disableISR(CHANNEL_B);
22+
// С этого момента прерывание B больше не будет вызываться
23+
24+
// Если нужно приостановить таймер ПОЛНОСТЬЮ, аппаратно
25+
Timer2.pause();
26+
// С этого момента таймер стоит на месте, содержимое счетчика остается нетронутым
27+
28+
// Теперь таймер можно вернуть в строй
29+
Timer2.resume();
30+
// Таймер продолжил считать с того же места
31+
32+
// Если нужно полностью остановить таймер и сбросить содержимое счетчика
33+
Timer1.stop();
34+
// Таймер стоит, счетчик сброшен
35+
36+
// Возвращаем таймер в строй
37+
Timer1.restart();
38+
// Таймер перезапущен, начал считать с начала
39+
40+
// Если нужно вернуть стандартные Arduino - настройки таймера
41+
Timer0.setDefault();
42+
// Теперь таймер работает в станлартном режиме
43+
}
44+
45+
// векторы прерываний
46+
ISR(TIMER1_A) {
47+
48+
}
49+
50+
ISR(TIMER1_B) {
51+
52+
}
53+
54+
ISR(TIMER2_B) {
55+
56+
}
57+
58+
ISR(TIMER0_A) {
59+
60+
}
61+
62+
void loop() {
63+
64+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Пример генерации двухканальных прерываний на таймере с РАВНЫМ периодом, но сдвинутых по фазе
2+
// два потока прерываний с сдвигом 180 градусов (полная инверсия)
3+
4+
#include <GyverTimers.h>
5+
6+
void setup() {
7+
Serial.begin(9600);
8+
9+
Serial.print("Real timer frequency is : "); // Выведем реальную частоту, реальная может отличаться от заданой (ограничено разрешением таймера)
10+
Serial.println(Timer1.setFrequencyFloat(2.50)); // Частота прерываний - 2.5 гц , используй .setFrequency(...) для целых чисел
11+
delay(1000);
12+
Timer1.enableISR(CHANNEL_A, 0); // Первый канал - А, начальная фаза - 0 градусов
13+
Timer1.enableISR(CHANNEL_B, 180); // Второй канал - B, начальная фаза - 180 градусов
14+
}
15+
16+
void loop() {}
17+
18+
// два прерывания на одном таймере
19+
ISR(TIMER1_A) {
20+
Serial.println(" Channel A interrupt !"); // Прерывание А
21+
}
22+
23+
ISR(TIMER1_B) {
24+
Serial.println(" Channel B interrupt !"); // Прерывание B
25+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Пример генерации двухтактного меандра на таймере 2 (пины D3 и D11)
2+
#include <GyverTimers.h>
3+
4+
void setup() {
5+
pinMode(3, OUTPUT); // настроить пин как выход
6+
pinMode(11, OUTPUT); // настроить пин как выход
7+
Timer2.setFrequency(30000); // настроить частоту таймера в Гц и запустить таймер
8+
Timer2.outputEnable(CHANNEL_A, TOGGLE_PIN); // в момент срабатывания таймера пин будет переключаться
9+
Timer2.outputEnable(CHANNEL_B, TOGGLE_PIN); // в момент срабатывания таймера пин будет переключаться
10+
Timer2.outputState(CHANNEL_A, HIGH); // задаём начальное состояние пина 11
11+
Timer2.outputState(CHANNEL_B, LOW); // задаём начальное состояние пина 3
12+
}
13+
14+
void loop() {
15+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//Пример генерации меандра на таймере 2 , канале B (D3 на Arduino UNO)
2+
#include <GyverTimers.h>
3+
4+
void setup() {
5+
pinMode(3, OUTPUT); // настроить пин как выход
6+
Timer2.setFrequency(500); // настроить частоту таймера в Гц
7+
Timer2.outputEnable(CHANNEL_B, TOGGLE_PIN); // в момент срабатывания таймера пин будет переключаться
8+
}
9+
10+
void loop() {
11+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Пример простой генерации прерываний аппаратным таймером
2+
#include <GyverTimers.h>
3+
4+
void setup() {
5+
Serial.begin(9600);
6+
Timer1.setFrequency(3); // Высокоточный таймер 1 для первого прерывания, частота - 3 Герца
7+
//Timer1.setPeriod(333333); // то же самое! Частота 3 Гц это период 333 333 микросекунд
8+
//Timer1.setFrequencyFloat(4.22); // Если нужна дробная частота в Гц
9+
Timer1.enableISR(); // Запускаем прерывание (по умолч. канал А)
10+
11+
// запустим второй таймер
12+
Timer2.setPeriod(1000000); // Устанавливаем период таймера 1000000 мкс -> 1 гц
13+
Timer2.enableISR(CHANNEL_A); // Или просто .enableISR(), запускаем прерывание на канале А таймера 2
14+
pinMode(13, OUTPUT); // будем мигать
15+
}
16+
17+
void loop() {}
18+
19+
// Прерывание А таймера 1
20+
ISR(TIMER1_A) { // пишем в сериал
21+
Serial.println("timer1");
22+
}
23+
24+
// Прерывание А таймера 2
25+
ISR(TIMER2_A) { // генерируем меандр 1 кгц, мигаем
26+
digitalWrite(13, !digitalRead(13));
27+
//Serial.println("timer2");
28+
}

GyverTimers/keywords.txt

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#######################################
2+
# Syntax Coloring Map For GyverTimers
3+
#######################################
4+
5+
#######################################
6+
# Datatypes (KEYWORD1)
7+
#######################################
8+
GyverTimers KEYWORD1
9+
10+
Timer0 KEYWORD1
11+
Timer1 KEYWORD1
12+
Timer2 KEYWORD1
13+
Timer3 KEYWORD1
14+
Timer4 KEYWORD1
15+
Timer5 KEYWORD1
16+
17+
#######################################
18+
# Methods and Functions (KEYWORD2)
19+
#######################################
20+
ISR KEYWORD2
21+
22+
setPeriod KEYWORD2
23+
setFrequency KEYWORD2
24+
setFrequencyFloat KEYWORD2
25+
enableISR KEYWORD2
26+
disableISR KEYWORD2
27+
pause KEYWORD2
28+
resume KEYWORD2
29+
stop KEYWORD2
30+
restart KEYWORD2
31+
setDefault KEYWORD2
32+
outputEnable KEYWORD2
33+
outputDisable KEYWORD2
34+
outputState KEYWORD2
35+
36+
#######################################
37+
# Constants (LITERAL1)
38+
#######################################
39+
TIMER0_A LITERAL1
40+
TIMER0_B LITERAL1
41+
TIMER1_A LITERAL1
42+
TIMER1_B LITERAL1
43+
TIMER1_C LITERAL1
44+
TIMER2_A LITERAL1
45+
TIMER2_B LITERAL1
46+
TIMER3_A LITERAL1
47+
TIMER3_B LITERAL1
48+
TIMER3_C LITERAL1
49+
TIMER4_A LITERAL1
50+
TIMER4_B LITERAL1
51+
TIMER4_C LITERAL1
52+
TIMER5_A LITERAL1
53+
TIMER5_B LITERAL1
54+
TIMER5_C LITERAL1
55+
56+
CHANNEL_A LITERAL1
57+
CHANNEL_B LITERAL1
58+
CHANNEL_C LITERAL1
59+
60+
TOGGLE_PIN LITERAL1
61+
CLEAR_PIN LITERAL1
62+
SET_PIN LITERAL1

GyverTimers/library.properties

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=GyverTimers
2+
version=1.0
3+
author=AlexGyver <[email protected]>
4+
maintainer=AlexGyver <[email protected]>
5+
sentence=Library for control hardware timer on ATmega328p.
6+
paragraph=Has some functions to control timer run: start, stop, pause, set period and frequency.
7+
category=Timing
8+
url=https://github.com/AlexGyver/GyverLibs
9+
architectures=*

README.md

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626

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

@@ -551,8 +552,55 @@ parseFloat | 1070 | 246 | 824
551552

552553
---
553554

555+
<a id="GyverTimers"></a>
556+
### GyverTimers v1.0 [СКАЧАТЬ](https://github.com/AlexGyver/GyverLibs/releases/download/GyverTimers/GyverTimers.zip), [ДОКУМЕНТАЦИЯ](https://alexgyver.ru/GyverTimers/)
557+
Настройка и контроль прерываний по аппаратным таймерам:
558+
- Поддерживаются все три таймера на ATmega328 и шесть таймеров на ATmega2560;
559+
- Настройка периода (мкс) и частоты (Гц) прерываний:
560+
- 8 бит таймеры: 31 Гц - 1 МГц (32 258 мкс - 1 мкс);
561+
- 16 бит таймеры: 0.11 Гц - 1 МГц (9 000 000 мкс - 1 мкс);
562+
- Автоматическая корректировка настройки периода от частоты тактирования (F_CPU);
563+
- Функция возвращает точный установившийся период/частоту для отладки (частота ограничена разрешением таймера);
564+
- Поддержка многоканального режима работы: один таймер вызывает 2 (ATmega328) или
565+
3 (ATmega2560, таймеры 1, 3, 4, 5) прерывания с настраиваемым сдвигом по фазе 0-360 градусов;
566+
- Настраиваемое действие аппаратного вывода таймера по прерыванию: высокий сигнал, низкий сигнал, переключение.
567+
Позволяет генерировать меандр (одно- и двухтактный);
568+
- Контроль работы таймера: старт/стоп/пауза/продолжить/инициализация;
569+
#### Методы и функции библиотеки
570+
<details>
571+
<summary>РАЗВЕРНУТЬ</summary>
572+
<p>
573+
Смотри примеры в папке examples!
574+
575+
```C
576+
// N - номер таймера (0, 1... 5)
577+
TimerN.setPeriod(период) - установка периода в микросекундах и запуск таймера. Возвращает реальный период (точность ограничена разрешением таймера).
578+
TimerN.setFrequency(частота) - установка частоты в Герцах и запуск таймера. Возвращает реальную частоту (точность ограничена разрешением таймера).
579+
TimerN.setFrequencyFloat(частота float) - установка частоты в Герцах и запуск таймера, разрешены десятичные дроби. Возвращает реальную частоту (точность ограничена разрешением таймера).
580+
TimerN.enableISR(источник, фаза) - включить прерывания, канал прерываний CHANNEL_A или CHANNEL_B (+ CHANNEL_C у Mega2560), сдвиг фазы 0-359 (без указания параметров будет включен канал А и сдвиг фазы 0).
581+
TimerN.disableISR(источник) - выключить прерывания, канал CHANNEL_A или CHANNEL_B. Счёт таймера не останавливается (без указания параметров будет выключен канал А).
582+
TimerN.pause() - приостановить счёт таймера, не сбрасывая счётчик
583+
TimerN.resume() - продолжить счёт после паузы
584+
TimerN.stop() - остановить счёт и сбросить счётчик
585+
TimerN.restart() - перезапустить таймер (сбросить счётчик)
586+
TimerN.setDefault() - установить параметры таймера по умолчанию ("Ардуино-умолчания")
587+
TimerN.outputEnable(канал, режим) - канал: включить выход таймера CHANNEL_A или CHANNEL_B (+ CHANNEL_C у Mega2560). Режим: TOGGLE_PIN, CLEAR_PIN, SET_PIN (переключить/выключить/включить пин по прерыванию)
588+
TimerN.outputDisable(канал) - отключить выход таймера CHANNEL_A или CHANNEL_B (+ CHANNEL_C у Mega2560, см. такблицу таймеров)
589+
TimerN.outputState(канал, состояние) - сменить состояние канала: HIGH / LOW
590+
591+
Прерывание
592+
ISR(TIMERn_A) {
593+
// ваш код
594+
}
595+
```
596+
</p>
597+
</details>
598+
599+
---
600+
554601
<a id="GyverTimer012"></a>
555602
### GyverTimer012 v1.0 [СКАЧАТЬ](https://github.com/AlexGyver/GyverLibs/releases/download/GyverTimer012/GyverTimer012.zip), [ДОКУМЕНТАЦИЯ](https://alexgyver.ru/gyvertimer012/)
603+
~~**Библиотека устарела. Используйте GyverTimers**~~
556604
Лёгкая библиотека для управления всеми тремя таймерами ATmega328
557605
- Генерация прерываний по таймерам 0/1/2
558606
- Настройка частоты или периода прерываний

0 commit comments

Comments
 (0)