24 октября 2013 г.

Таймеры Счётчики AVR

У микроконтроллеров AVR есть несколько таймеров-счетчиков. Они могут быть 8 (2^8 = 256) или 16 (2^16 = 65536) разрядными.


  • Таймеры могут тикать с разной скоростью и подсчитывать количество тиков (также могут считать время).
  • Тикать от внешнего кварца.
  • формировать точные временные интервалы.
  • считать длительность и количество внешних импульсов.
  • Генерировать несколько видов ШИМ.
  • формировать прерывания.

Предделитель / делитель частоты
Таймер может считать импульсы с частотой на которой работает МК (микроконтроллер). И для того чтобы не выдумывать как из миллионов герц считать импульсы в 1 герц используют делитель частоты. Делить импульсы можно на 8, 32, 64, 128, 256 и 1024.

Предделитель это 10-битный регистр, который "тикает" с той же частотой что и МК, но мы можем выбрать когда таймер будет увеличивать своё значение относительно предделителя.

К примеру если мы хотим чтобы таймер работал в 2 раза медленнее мы настраиваем его так чтобы он "тикал" когда в 0 бите предделителя появляется 1 -> 00, 01, 10, 11. 
МК тикнул 4 раза, но единичка появилась в 0 бите предделителя лишь 2 раза, значит наш таймер увеличил своё значение лишь на 2.

Предделитель работает всегда, следовательно когда мы начинаем его использовать там не обязательно 0, там может быть любое значение которое он успел насчитать, из-за этого его лучше сбрасывать.

Для разных таймеров можно настроить разные настройки предделителя, но регистр общий на всех, поэтому если его сбросить это повлияет на работу всех таймеров и предделитель начнет считать с 0.

Для того чтобы его сбросить нужно записать 1 в "Регистр специальных функций ввода/вывода" – SFIOR 0 бит == PSR10. Бит сброситься сам когда обнулится предделитель.


Счётный регистр


При поступлении импульса на счётчик, он изменяет значение своего счётного регистра TCNTx на 1  (может увеличивать или уменьшать в зависимости от настройки), где вместо x номер таймера. 

Из этого регистра можно как читать так и задавать значения,  можно сказать таймеру откуда он должен считать, определять сколько времени прошло и определённого момента.

16 разрядный таймер состоит из 2 регистров TCNTxH и TCNTxL - старший и младший байты.
Но значение в 2 регистра нужно записывать одновременно, иначе пройдет 1 такт, таймер изменит значение регистра, записываем 2 байт, а в регистре уже не то значение которое нам нужно.

Инженеры ATMEL сделали регистр TEMP, который является служебным и нам не доступен.
Сначала нужно записать старший байт в TCNTxH, значение на самом деле запишется в TEMP, теперь нужно записать младший байт TCNTxL и в этот момент в настоящий
регистр TCNTxH запишется значение из TEMP. Получается что 2 байта записываются одновременно. Но нужно соблюдать порядок сначала старший, затем младший байт.
Также при записи лучше отключать прерывания, чтобы пока идёт запись 1 байта значение регистров программа не могла изменить.

Регистр управления TCCRx
Через этот регистр мы настраиваем работу таймера. Он является самым важным, именно он определяет частоту делителя, режим работы и источник импульсов. У разных таймеров немного по разному, здесь я опишу для таймера 0


Биты COM01 и COM00 отвечают за то что происходит с ножкой микроконтроллера который связан с данным таймером (1 таймер == OC1A/OC1B, 2 таймер = OC2)


Биты CS02, CS01 и CS00 (Clock Select) определяют коэффициент делителя частоты.


Биты WGM10, WGM00 (Wave Generator Mode) определяют режим работы таймера.

Регистр TIMSK (Timer/Counter Interrupt Mask Register)

Это регистр масок прерываний, если в какой то бит записано 1, значит разрешено определённое прерывание (если конечно прерывания разрешены глобально через 7 бит регистра состояний SREG).

Бит 7 - OCIE2: прерывание по совпадению ТС2
Бит 6 - TOIE2: прерывание по переполнению таймера ТС2
Бит 5 - TICIE1: прерывание по захвату ТС1
Если на выводе ICP1 измениться значение, то значение таймера ТС1 запишется в регистр ICR1 и сработает прерывание.
Бит 4 - OCIE1A: прерывание по совпадению A ТС1
Бит 3 - OCIE1B: прерывание по совпадению В ТС1
Бит 2 - TOIE1: прерывание по переполнению таймера  ТС1
Бит 1 - не используется
Бит 0 - TOIE0: прерывание по переполнению таймера  ТС0

Информация взята отсюда

1 комментарий :