Асинхронная работа таймера/счетчика0
При синхронной работе таймера/счетчика0 все операции и тактирование идентичны работе таймера/счетчика2. Однако асинхронная работа имеет некоторые особенности.
- Это важно! При переключении между асинхронным и синхронным тактированием таймера/счетчика0 регистры таймера TCNT0, OCR0 и TCCR0 могут быть повреждены. Безопасное переключение выполняется следующей последовательностью действий:
- Запрещаются прерывания OCIE0 и TOIE0 таймера0.
- Соответствующей установкой ASO выбирается источник тактового сигнала.
- В TCNT0, OCR0 и TCCR0 записываются новые значения.
- Если выполняется переключение в асинхронный режим: ожидать TCN0UB, OCR0UB и TCR0UB.
- Разрешить прерывания, если это необходимо.
- Генератор оптимизирован под использование часового кристалла с частотой 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 достаточен, необходимо использовать следующий алгоритм:
- Записать значение в TCCR0, TCNT0 или OCR0.
- Подождать пока соответствующий флаг занятого обновления в регистре ASSR не будет сброшен в 0.
- Ввести режим Power Save.
- Генератор частоты 32кГц таймера/счетчика0 работает всегда, за исключением режима Power Down. При восстановления питания или активации из режима Power Down пользователь должен помнить о том, что генератору для стабилизации необходимо время порядка одной секунды. Пользователю рекомендуется выждать не менее одной секунды прежде чем использовать таймер/счетчик0 после подачи питания или активации из режима Power Down.
- Описание активации прибора из режима Power Save при асинхронном тактировании таймера. Когда условия прерывания выполнены, на следующем цикле тактовой частоты таймера начинается процесс активации, т.е. состояние таймера должно увеличиться как минимум на единицу, прежде, чем процессор сможет прочитать состояние счетчика. Флаги прерываний обновляются за три тактовых цикла процессора после запуска тактовой частоты процессора. В течение этих циклов процессор выполняет команды но условия прерывания еще не читаемы и подпрограмма обработки прерывания не может начать выполнение.
Во время асинхронной работы синхронизация флагов прерываний асинхронного таймера занимает три тактовых цикла процессора плюс один цикл таймера. Таким образом содержимое таймера увеличивается минимум на единицу, прежде чем процессор сможет прочитать содержимое таймера вызвавшее установку флага прерывания. Вывод сравнения выхода меняет состояние в соответствии с тактовым сигналом таймера и не синхронизирован с тактовой частотой процессора.
Регистр статуса асинхронного режима - ASSR - (Asynchronous Status Register)