реклама на сайте
подробности

 
 
> ATmega timer2 в асинхронном режиме, что-то я слегка запутался...
rx3apf
сообщение Dec 20 2007, 23:59
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 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, и лишь потом трогать регистры ?

Это я не понимаю, как оно работает, или разработчики сами не понимают, как обойти столь изощренные грабли ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
=GM=
сообщение Dec 21 2007, 11:30
Сообщение #2


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 в прерывании.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Dec 21 2007, 11:37
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 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, это прямой путь к усугублению проблемы...
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 21 2007, 12:08
Сообщение #4


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.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Dec 21 2007, 12:17
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 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. Второй по времени быстрее, но код развесистее и сложнее.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016