Режим работы таймера CTC (сброс при совпадении) это когда в регистр OCR микроконтроллера загружается число, а счетный регистр TCNT сравнивает свое значение с числом регистра OCR и при совпадении происходит прерывание. При этом в обработчик прерывания исполняет помещенный в него код.
Рассмотрим режим работы CTC таймера на примере микроконтроллера ATmega328.
bool led_stat = true; void setup() { pinMode(13, OUTPUT); digitalWrite(13, LOW); cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; // (16000000/((31249+1)x256))=2 Hz OCR1A = 31249; TCCR1B |= (1 << WGM12); // Prescaler 256 TCCR1B |= (1 << CS12); TIMSK1 |= (1 << OCIE1A); sei(); } void loop(){} ISR(TIMER1_COMPA_vect){ digitalWrite(13, led_stat); led_stat = !led_stat; }
Выше показан пример скетча демонстрирующий работу таймера 1, частота прерывания таймера 2 Гц, в обработчике прерывания размещен код который заставляет мигать светодиод в такт работы таймера (в первый такт работы таймера светодиод загорается, во второй такт таймера светодиод гаснет).
OCR1A — регистр сравнения, так как таймер 1 микроконтроллера Atmega328 16 бит, то в регистр сравнения можно поместить число от 0 до 65535.
TCCR1B — регистр управления, при помощи этого регистра активируется режим CTC и настраивается предделитель.
Предделитель делит тактовую частоту микроконтроллера, для этого используются биты CS10 CS11 CS12 регистра TCCR1B.
Бит WGM12 активирует режим CTC
TIMSK1 — регистр управления прерываниями
Бит регистра TIMSK1 OCIE1A разрешают прерывания при совпадении с A (OCR1A)
После запуска таймера обработчик прерывания ISR(TIMER1_COMPA_vect) начинает исполнять код который в нем размещен.
В примере скетча таймер будет работать с частотой 2 Гц, частота прерывания таймера зависит от предделителя и счетного регистра:
(16000000/((31249+1)x256))=2 Hz
16000000 — тактовая частота микроконтроллера
31249 — значение счетного регистра
256 — предделитель
При работе с таймерами, например микроконтроллера Atmega328 следует учитывать, что таймер 0 задействован в функциях delay() и millis(), а таймер 2 в функции tone().
Для упрощения работы с таймерами можно воспользоваться онлайн калькулятором.