можно было выбирать таймер. Т.е. какие значения надо писать для каких таймеров? Если правильно понимаю — то в этой строчке выбирается таймер и режим его работы
В зависимости от аппаратной реализации на конкретной модели микроконтроллера есть несколько таймеров. У простеньких моделей обычно по 2 (один 8-митный и один 16-битный).
Указывая какие регистры вы меняете, ведется управление этими таймерами. Обычно цифра в названии регистра указывает какой таймер используется. Каждое прерывание жестко привязано к определенному таймеру в коде коллеге ocelot:
ISR (TIMER<b>0</b>_COMPA_vect)
указывает, что TIMER
0_COMPA_vect — идет для таймера 0.
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
Но нам для изменения (плавного) частоты его работы надо задать не переполнение, а, видимо, совпадение с определенным значением и менять это значение?
все правильно. Когда таймер отсчитал нужное количество тиков, превышающих установленное пороговое значение (в примере
OCR0A = 123; // Верхняя граница счета. Диапазон от 0 до 255
и
OCR1A = 2678; // Верхняя граница счета. Диапазон от 0 до 65535
: тут кстати заметна разница между испольтованием 8и и 16и битных значений).
Соотвественно и нужно выставлять флаги, какое прерывание должно сработать: по переполнению или по совпадению. я не вижу особой разницы без использования внешнего тактирования между обеими методами, ведь переполнение всего лишь на единицу больше сравнения. Еще одна деталь: при сравнении могут использоваться одновременно 2 значения (А и В, в примере все сделано для А). Поётому прерывание будет вызываться для обейх совпадений.
И не совсем понятно как привязывается обработчик прерывания к конкретному счетчику
Это делается записью значения в регистр TIMSKх (х — номер таимера). В этот регистр записывается байт у кототого выставляются биты нужных прерываний:
Bit 2 – TOIE1: Timer/Counter1, Overflow Interrupt Enable — прерывание по переполнению.
Bit 3 – OCIE1B: Timer/Counter1, Output Compare B Match Interrupt Enable — по совпаденияу значения В.
Bit 4 – OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable — по совпадению значения в А.