|
ATmega timer2 в асинхронном режиме, что-то я слегка запутался... |
|
|
|
Dec 20 2007, 23:59
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

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

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(rx3apf @ Dec 20 2007, 23:59)  Ждать FF->00, а потом появления TOV2, и лишь потом трогать регистры? Это я не понимаю, как оно работает, или разработчики сами не понимают, как обойти столь изощренные грабли? Всё понять невозможно(:-). Поскольку таймер асинхронный, запись значений в регистры TCNT2, OCR2x, TCCR2x идёт предварительно в соответствующие временные регистры и защёлкивается в регистрах через ДВА положительных фронта вашей асинхронной частоты, как я понимаю, тот же самый синхронизатор, который стоит на всех входных пинах. Для помощи был введён регистр асинхронного статуса ASSR. Проверяете бит3 (OCR2AUB) и вперёд. Или ждёте TOV2 в прерывании.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Dec 21 2007, 11:37
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(=GM= @ Dec 21 2007, 14:30)  Всё понять невозможно(:-). Поскольку таймер асинхронный, запись значений в регистры TCNT2, OCR2x, TCCR2x идёт предварительно в соответствующие временные регистры и защёлкивается в регистрах через ДВА положительных фронта вашей асинхронной частоты, как я понимаю, тот же самый синхронизатор, который стоит на всех входных пинах. Для помощи был введён регистр асинхронного статуса ASSR. Проверяете бит3 (OCR2AUB) и вперёд. Или ждёте TOV2 в прерывании. Статусный бит проверять бесполезно - он отслеживает состояние обновления _после_ записи. Ждать TOV2 тоже накладно - у меня прерывание каждые 250 mS. Короче, пока обошелся проверкой TCNT2 на FF и 00, если одно из них, то кручу цикл, пока таймер не выйдет из этих "запрещенных" вариантов. Меня смущает именно рекомендация Atmel проверять _только_ на FF, это прямой путь к усугублению проблемы...
|
|
|
|
|
Dec 21 2007, 12:08
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(rx3apf @ Dec 21 2007, 11:37)  Статусный бит проверять бесполезно - он отслеживает состояние обновления _после_ записи. Ждать TOV2 тоже накладно - у меня прерывание каждые 250 mS. Короче, пока обошелся проверкой TCNT2 на FF и 00, если одно из них, то кручу цикл, пока таймер не выйдет из этих "запрещенных" вариантов. Меня смущает именно рекомендация Atmel проверять _только_ на FF, это прямой путь к усугублению проблемы... Нашёлся ещё один вариант - обрабатывать прерывание по совпадению, не равному 0xFF, прерывания будут идти с тем же периодом, что и TOV2, но не будет потери прерывания и не надо будет беспокоиться о проверке на 0х00 или 0xFF.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Dec 21 2007, 12:17
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(=GM= @ Dec 21 2007, 15:08)  Нашёлся ещё один вариант - обрабатывать прерывание по совпадению, не равному 0xFF, прерывания будут идти с тем же периодом, что и TOV2, но не будет потери прерывания и не надо будет беспокоиться о проверке на 0х00 или 0xFF. А, в самом деле интересная мысль (да можно было бы и по совпадению на FF или на 00, все равно должно бы работать). Да, на M168 я мог бы сделать именно так (один из OCR2 свободен), но, к сожалению, аналогично надо решать и для M8, а там только один блок сравнения, и его-то и надо перепрограммировать по ходу работы. Так что у меня пока два варианта - проверять на FF и 00, и циклиться, либо проверять переход FF->00 и ждать TOV2. Второй по времени быстрее, но код развесистее и сложнее.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|