Калькулятор AVR — режим CTC (сброс при совпадении)(Arduino)

Режим работы таймера 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().

Для упрощения работы с таймерами можно воспользоваться онлайн калькулятором.

 

Добавить комментарий

Войти с помощью: