Асинхронная работа таймера/счетчика0

Регистры сравнения выхода таймеров/счетчиков

Регистр сравнения выхода таймера/счетчика0 - OCR0 - (Timer/Counter0 Output Compare Register)

Биты
               
$31 ($51)
MSB             LSB
OSR0
Чтение/Запись
R/W R/W R/W R/W R/W R/W R/W R/W
 
Начальное состояние
               
 

Регистр сравнения выхода таймера/счетчика2 - OCR2 - (Timer/Counter2 Output Compare Register)

Биты
               
$23 ($43)
MSB             LSB
OSR2
Чтение/Запись
R/W R/W R/W R/W R/W R/W R/W R/W
 
Начальное состояние
               
 

Регистры сравнения выходов являются 8-разрядными регистрами с возможностью чтения/записи. Выполнение процедуры сравнения определяется регистрами TCCR0 и TCCR2. Совпадение при сравнении произойдет только тогда, когда таймер/счетчик досчитает до значения содержимого OCR. Программная запись одного и того же значения в таймер/счетчик и в регистр сравнения выхода не приведет к формированию совпадения при сравнении.

Совпадение при сравнении приведет к установке флага прерывания по совпадению в течение тактового цикла CPU следующего за совпадением. Необходимо принимать меры предосторожности при работе таймера/счетчика0 в асинхронном режиме, т.е. устанавливать в состояние 1 бит AC0 в регистре ASSR. При записи в регистр OCR0 значение, пересылается в регистр по TCK0 такту, следующему за операцией записи.

Таймеры/счетчики 0 и 2 в ШИМ режиме - Timer/Counter 0 and 2 in PWM mode

При установленном ШИМ режиме таймер/счетчик и регистр сравнения выхода (OCR0 или OCR2) формируют 8-разрядный, без ложных выбросов и с правильной фазой ШИМ сигнал с выходом через PB4(OC0/PWM0) или PB7(OC2/PWM2) выводы. Таймер/счетчик работает как реверсивный счетчик, считающий от $00 до $FF, после чего он считает в обратную сторону до нуля и только после этого начинает новый цикл. Когда состояние счетчика совпадает с содержимым регистра сравнения выхода выводы PB4(OC0/PWM0) или PB7(OC2/PWM2) устанавливаются или очищаются, в соответствии с установленными, в регистрах управления таймерами/счетчиками TCCR0 и TCCR2, битами COM01/COM00 или COM21/COM20. См. таблицу 13.

Таблица 13. Выбор режима сравнения в ШИМ режиме

COMn1 COMn0 Эффект, оказываемый на вывод Compare/PWM
    Не подсоединен
    Не подсоединен
    Очистка при совпадении, счет по нарастанию. Установка при совпадении, счет по убыванию (неинвертирующий ШИМ)
    Очистка при совпадении, счет по убыванию. Установка при совпадении, счет по нарастанию (инвертирующий ШИМ)

Примечания: n = 0 или 2.

В ШИМ режиме при записи содержимое регистра сравнения выхода пересылается на временное хранение. Содержимое фиксируется при достижении таймером/счетчиком состояния $FF. Такой прием предохраняет от появления ШИМ импульсов увеличенной ширины (ложных выбросов) в случае несинхронной записи OCR0 или OCR2. Пример см. на рис.34.

Рис. 34. Эффект несинхронной фиксации OCR

В промежуток времени между операциями записи и фиксации считывание из OCR0 или OCR2 приведет к считыванию из места временного хранения. Это означает, что чаще всего при чтении значения уставки считывание будет производиться из OCR0/2. При состоянии регистра OCR $00 или $FF выход ШИМ будет удерживаться на низком или высоком уровне, в зависимости от установок COM21/COM20 или COM11/COM10. См. таблицу 14.

Таблица 14. Состояния ШИМ выходов при OCRn = $00 или $FF

COMn1 COMn0 OCRn Выход PWMn
    $00 L - низкий уровнье
    $FF H - высокий уровень
    $00 H - высокий уровень
    $FF L - низкий уровень

Примечания: n = 0 или 2.

В ШИМ режиме флаг переполнения таймера (TOV0 или TOV2) устанавливается при смене направления счета при $00. Прерывания по переполнению таймеров 0 и 2 работают так же, как и в нормальном режиме таймеров/счетчиков, т.е. они срабатывают когда TOV0 или TOV2 установлены, и разрешены прерывания по переполнению таймера и глобальному прерыванию. Это относится также к флагам сравнения выхода таймеров и прерываниям.

Частота ШИМ будет соответствовать тактовой частоте таймера деленной на 510.

Асинхронная работа таймера/счетчика0

При синхронной работе таймера/счетчика0 все операции и тактирование идентичны работе таймера/счетчика2. Однако асинхронная работа имеет некоторые особенности.

  • Это важно! При переключении между асинхронным и синхронным тактированием таймера/счетчика0 регистры таймера TCNT0, OCR0 и TCCR0 могут быть повреждены. Безопасное переключение выполняется следующей последовательностью действий:
    1. Запрещаются прерывания OCIE0 и TOIE0 таймера0.
    2. Соответствующей установкой ASO выбирается источник тактового сигнала.
    3. В TCNT0, OCR0 и TCCR0 записываются новые значения.
    4. Если выполняется переключение в асинхронный режим: ожидать TCN0UB, OCR0UB и TCR0UB.
    5. Разрешить прерывания, если это необходимо.
  • Генератор оптимизирован под использование часового кристалла с частотой 32,768 кГц. Внешний тактовый сигнал, подаваемый на этот вывод, проходит через тот же самый усилитель с полосой пропускания 256 кГц. Таким образом, внешний тактовый сигнал должен быть в диапазоне от 0 Гц до 256 кГц. Частота внешнего тактового сигнала, подаваемого на вывод TOSC1, не должна превышать одной четвертой от тактовой частоты CPU. Отметим, что тактовая частота CPU может быть ниже частоты XTAL, если разрешено деление частоты XTAL.
  • При записи в один из регистров TCNT0, OCR0 или TCCR0 записываемая величина пересылается в регистр временного хранения и фиксируется после двух положительных фронтов TOSC1. Пользователь не должен записывать новое значение прежде, чем содержимое регистра временного хранения не будет передано по назначению. Каждый из указанных регистров имеет свой собственный регистр временного хранения, это означает, к примеру, что запись в TCNT0 не исказится при записи в OCR0. Для того, чтобы убедиться в выполнении пересылки в регистр назначения используется регистр статуса асинхронного режима (Asynchronous Status Register - ASSR).
  • При вводе режима Sleep после записи в регистры TCNT0, OCR0 or TCCR0 пользователь должен ожидать пока записываемый регистр не будет обновлен, если таймер/счетчик0 используется для активации прибора. В ином случае MCU перейдет в режим Sleep прежде, чем изменения окажут какой либо эффект. Это особенно важно если для активации прибора используется прерывание по сравнению выхода0; сравнение выхода запрещается во время записи в OCR0 или TCNT0. Если цикл записи не завершен (т.е. пользователь введет режим Sleep прежде, чем бит OCR0UB будет сброшен в 0) прибор никогда не получит совпадения при сравнении и MCU не будет активирован. Если таймер/счетчик0 используется для активации прибора из режима Power Save и если пользователь намеревается возобновить режим Power Save, то необходимо предпринимать меры предосторожности - для сброса логики прерывания необходим один цикл TOSC1. Если время между активацией и восстановлением режима Power Save меньше одного цикла TOSC1 прерывание не произойдет и прибор не будет активирован. Если пользователь сомневается в том, что промежуток времени перед восстановлением режима Power Save достаточен, необходимо использовать следующий алгоритм:
    1. Записать значение в TCCR0, TCNT0 или OCR0.
    2. Подождать пока соответствующий флаг занятого обновления в регистре ASSR не будет сброшен в 0.
    3. Ввести режим Power Save.
  • Генератор частоты 32кГц таймера/счетчика0 работает всегда, за исключением режима Power Down. При восстановления питания или активации из режима Power Down пользователь должен помнить о том, что генератору для стабилизации необходимо время порядка одной секунды. Пользователю рекомендуется выждать не менее одной секунды прежде чем использовать таймер/счетчик0 после подачи питания или активации из режима Power Down.
  • Описание активации прибора из режима Power Save при асинхронном тактировании таймера. Когда условия прерывания выполнены, на следующем цикле тактовой частоты таймера начинается процесс активации, т.е. состояние таймера должно увеличиться как минимум на единицу, прежде, чем процессор сможет прочитать состояние счетчика. Флаги прерываний обновляются за три тактовых цикла процессора после запуска тактовой частоты процессора. В течение этих циклов процессор выполняет команды но условия прерывания еще не читаемы и подпрограмма обработки прерывания не может начать выполнение.

Во время асинхронной работы синхронизация флагов прерываний асинхронного таймера занимает три тактовых цикла процессора плюс один цикл таймера. Таким образом содержимое таймера увеличивается минимум на единицу, прежде чем процессор сможет прочитать содержимое таймера вызвавшее установку флага прерывания. Вывод сравнения выхода меняет состояние в соответствии с тактовым сигналом таймера и не синхронизирован с тактовой частотой процессора.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: