образом, чтобы между пробуждением и сваливаеним в спячку асинхронный
таймер успел отработать несколько своих тактов и выполнил все свои дела.
Примеры:
Контроллер использует режим энергосбережения и отключения ядра, а
пробуждается по прерываниям от асинхронного таймера. Тут надо учитывать
тот факт, что если мы будем изменять значения регистров TCNT2, OCR2 и
TCCR2, то уход в спячку нужно делат ТОЛЬКО после того, как флаги
TCN2UB, OCR2UB и TCR2UB упадут. Иначе получится такая лажа —
асинхронный таймер еще не успел забрать данные из промежуточных
регистров (он же медленный, в сотни раз медленней ядра), а ядро уже
отрубилось. И ладно бы конфигурация новая не применилась, это ерунда.
Хуже то, что на время модификаций регистров TCNT или OCR блокируется
работа блока сравнения, а значит, если ядро уснет раньше, то блок сравнения
так и не запустится — некому его включить будет. И у нас пропадет
прерывание по сравнению. Что черевато тем, что событие мы прошляпим и
будем их терять до следующего пробуждения из спячки.
А если контроллер будится прерыванием по сравнению? То он уснет
окончательно.Вот так!
Вот и лови такой глюк потом.
Так что перед уходом в режимы энергосбережения надо обязательно дать
асинхронному таймеру прожевать введенные значения (если они были
введены) и дождаться обнуления флагов.
Еще один прикол с асинхронным режимом и энергосбережением
заключается в том, что подсистема прерываний при выходе из спячки
стартует за 1 такт медленного генератора. Так что даже если мы ничего не
меняли, то обратно в спячку сваливаться нельзя — не проснемся, т.к.
прерывания не успеют запуститься.