Долго воевал с потерей прерываний от переполнения TCNT2 (MEGA168), работающим от часового кварца в асинхронном режиме, пока не сообразил посмотреть эрраты. Да, при модификации регистров таймера в момент переполнения именно такая ситуация как раз и возможна (а я как раз энергично дергаю OCR2). Но какой же выход предлагает Atmel - проверять TCNT2 на FF перед любой модификацией регистров. Сделал. Стало еще хуже. Стал выяснять, почему. Получается странная картина - флаг TOV2 устанавливается через 1/32768 sec после момента перехода TCNT2 FF->00, и, если я терпеливо жду, когда TCNT2 выйдет из состояния FF, то как раз попадаю в момент, когда таймер стал равен 00, а TOV2 еще не установился. Пишу в OCR2 - и _гарантированно_ теряю прерывание переполнения ! Посмотрел последнюю версию даташита - они предлагают все тот же способ обхода проблемы, контролем на FF. Ну и что делать ? Ждать FF->00, а потом появления TOV2, и лишь потом трогать регистры ?
Это я не понимаю, как оно работает, или разработчики сами не понимают, как обойти столь изощренные грабли ?
|