-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathTimerList.cpp
More file actions
117 lines (88 loc) · 3.56 KB
/
TimerList.cpp
File metadata and controls
117 lines (88 loc) · 3.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <Arduino.h>
#include <util/atomic.h>
#include "TimerList.h"
// глобально создается пустой, остановленный список щёччиков
TTimerList TimerList; // число таймеров = MAXTIMERSCOUNT
// Настройка таймеров для первого использования
// на срабатывание каждую 1 миллисекунду
// для Uno, Nano и прочих Micro с ATMega168, ATMega328, и на Mega2560 работает на таймере #0
// на Atmega8 работает на таймере 1, на таймере 0 нет прерывания по совпадению
// на других протестировать нет возможности
#if defined(__AVR_ATmega2560__)
void TTimerList::Init()
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
TCCR0A = TCCR0A & 0b11111100;
OCR0A = TIMER0_ONE_MS;
TIMSK0 |= 0x3;
TIFR0 = TIFR0 | 0x2;
}
}
#elif defined(__AVR_ATmega328P__)
void TTimerList::Init()
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
TCCR0A = TCCR0A & 0b11111100; // Таймер в режиме Normal
OCR0A = TIMER0_ONE_MS; // загрузим регистр совпадения
TIMSK0 |= 0x3; // установить OCIE0A и TOIE0, разрешим совпадение А и переполнение
TIFR0 |= 0x2; // очистим флаг OCF0A если до этого он был установлен, ждём следущего совпадения
}
}
#elif defined(__AVR_ATmega32__)
void TTimerList::Init()
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
TCCR0 = TCCR0 & 0b11111100; // Таймер в режиме Normal
OCR0 = TIMER0_ONE_MS; // загрузим регистр совпадения
TIMSK |= 0x3; // установить OCIE0A и TOIE0, разрешим совпадение А и переполнение
TIFR |= 0x2; // очистим флаг OCF0A если до этого он был установлен, ждём следущего совпадения
}
}
#elif defined(__AVR_ATmega32U4__)
void TTimerList::Init()
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
TCCR0A = TCCR0A & 0b11111100; // Таймер в режиме Normal
OCR0A = TIMER0_ONE_MS; // загрузим регистр совпадения
TIMSK0 |= 0x3; // установить OCIE0A и TOIE0, разрешим совпадение А и переполнение
TIFR0 |= 0x2; // очистим флаг OCF0A если до этого он был установлен, ждём следущего совпадения
}
}
#elif defined(__AVR_ATmega168__)
void TTimerList::Init()
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
TCCR0A = TCCR0A & 0b11111100;
OCR0A = TIMER0_ONE_MS;
TIMSK0 |= 0x3;
TIFR0 = TIFR0 | 0x2;
}
}
#elif defined(__AVR_ATmega8__)
void TTimerList::Init()
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
TCCR1A = 0; TCCR1B = 2;
TCNT1 = 0;
OCR1A = _1MSCONST;
TCCR1B |= (1 << WGM12);
TIMSK |= (1 << OCIE1A);
}
}
#endif
#if defined(__AVR_ATmega8__)
ISR(TIMER1_COMPA_vect){
OCR1A = _1MSCONST;
TimerList.Tick();
}
#elif defined(__AVR_ATmega32__)
ISR(TIMER0_COMP_vect) {
TCNT0 = 0xFF; // чтоб на следующем шаге сработало переполнение и посчитался millis
TimerList.Tick();
}
#else
ISR(TIMER0_COMPA_vect){
TCNT0 = 0xFF; // чтоб на следующем шаге сработало переполнение и посчитался millis
TimerList.Tick();
}
#endif