Коллекция глюков Здесь публикуются все известные глюки, баги микроконтроллеров, памяти, АЦП и т.д. |
11.03.2010, 20:45
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
"Глюк" AVR таймера от кварца 32768 Гц
Это не глюк, это просто грабля, на которую наступают почти все, кто добирается до работы таймера AVR микропроцессора в асинхронном режиме. Этот режим используется для реализации "спящих" часов реального времени, когда контроллер большую часть времени спит, а часы себе тикают и время и дату считают.
Асинхронный режим подразумевает подключение кварца к пинам TOSC1 и TOSC2. А теперь внимание, сладкие грабельки!
Прочитав даташит и написав код инициализации таймера в этом режиме все прекрасно работает. Почти работает. Но иногда при подаче питания таймер не стартует, прерывания не генерируются. В некоторых случаях таймер не стартует вообще, не запускаясь и с 100-ой попытки. Вообщем возникает ощущение, что какой-то плохой кварц, контроллер, корпус контроллера, флюс или что-то в этом духе (где-то здесь на Казусе была ветка об этом, но найти не могу).
А решается все просто. Нужно дождаться завершения инициализации таймера перед разрешением прерываний. В моем случае для процессора ATmega48PA это выглядит так:
Код:
|
// Таймер 2 работает с частотой 1 Гц.
// 32768 / 128 / 256 = 1 Гц.
Mcu.TimerCounter2.ASSR.AS2.Set();
// Предварительный делитель 128.
Mcu.TimerCounter2.TCCR2A.Value = (byte)(Mcu.TimerCounter2.TCCR2A.WGM21.Mask);
Mcu.TimerCounter2.TCCR2B.Value = (byte)(Mcu.TimerCounter2.TCCR2B.CS22.Mask | Mcu.TimerCounter2.TCCR2B.CS20.Mask);
Mcu.TimerCounter2.OCR2A.Value = 256 - 1;
Mcu.TimerCounter2.CompareMatchA += new InterruptEventHandler(TimerCounter2_CompareMatchB) ;
// Ждем завершения инициализации таймера
// ------------------------------------------------------
// Datasheet page 156
while (Mcu.TimerCounter2.ASSR.TCR2AUB.Value)
;
while (Mcu.TimerCounter2.ASSR.TCR2BUB.Value)
;
while (Mcu.TimerCounter2.ASSR.OCR2AUB.Value)
;
while (Mcu.TimerCounter2.ASSR.TCN2UB.Value)
;
// Разрешение прерываний таймера
Mcu.TimerCounter2.TIFR2.OCF2A.Reset();
Mcu.TimerCounter2.TIMSK2.OCIE2A.Set();
// ------------------------------------------------------
// Готово, таймер готов к использованию! |
Эта грабелька часто возникает из-за того, что в даташите там где описываются режимы таймера нет явной прямой ссылки на необходимость ожидания инициализации таймера в асинхронном режиме. Эта информация конечно-же в даташите имеется, но она "запакована" далековато от описания пинов управления режимами таймера. Поэтому каждый, кто хочет сделать наноамперные часы реального времени прямо на AVR, стабильно на эту граблю наступает и заканчивается все использованием DS1307
Но теперь вы предупреждены - если часовой генератор не работает или работает неустойчиво - см. в код инициализации таймера
--------------------------
В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
Последний раз редактировалось alexgap; 11.03.2010 в 21:32.
|
|
|
Эти 12 пользователя(ей) сказали Спасибо alexgap за это сообщение:
|
alekseyb (12.03.2010), Arjuna1008 (29.07.2011), DVD-RW (13.03.2010), forbidden (03.01.2011), hillar (12.03.2010), Ibaness (13.03.2010), makakus (12.03.2010), pinco (25.07.2011), sergrushka (22.07.2011), servillio (22.07.2011), Uz_Sleep_Walker (12.03.2010), _Artem_ (22.07.2011) |
|
11.03.2010, 21:03
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: "Глюк" AVR таймера от кварца 32768 Гц
У меня проблемы с пиком. Запустил точно так же часы реального времени. Кварц 32768, две емкости по 30пкФ. Часы идут, но отстают на 3 минуты за сутки. Питание хорошее, емкостей куча. Почему так? Кварца два, пробовал оба. Подозреваю, что кварцы дефективные.
|
|
|
|
11.03.2010, 21:25
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
Re: "Глюк" AVR таймера от кварца 32768 Гц
Сообщение от Easyrider83
|
У меня проблемы с пиком. Запустил точно так же часы реального времени. Кварц 32768, две емкости по 30пкФ. Часы идут, но отстают на 3 минуты за сутки. Питание хорошее, емкостей куча. Почему так? Кварца два, пробовал оба. Подозреваю, что кварцы дефективные.
|
Либо кварц с дефектом, либо емкости неправильные. Из-за несоответствия емкостей параметрам кварца его частота резонанса может существенно сместиться. Обычно в каталогах пишут рекомендуемую емкость нагрузки для кварца, чаще всего мне попадаются часовые кварцы с CL = 12.5 пФ. Конденсаторы на пинах кварца расчиывают так:
С = 2 * CL - Cs
где CL - рекомендуемая емкость нагрузки для кварца (см. в паспорте кварца)
Сs - паразитная емкость ножки контроллера
Если у вас С = 30 пФ, то это явно слишком много. Должно быть в районе 0-20 пФ в зависимости от паразитной емкости ножки используемого контроллера. Обычно в даташите на контроллер есть необходимое значение этой емкости или формула для расчета.
Слишком большая емкость С = 30 пФ вполне может объяснять отставание часов, так как с повышением емкости нагрузки кварца его резонансная частота уменьшается.
В моей схеме, например, С = 6 пФ.
__________________
.
В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
Последний раз редактировалось alexgap; 11.03.2010 в 21:36.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо alexgap за это сообщение:
|
|
|
12.03.2010, 01:34
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: "Глюк" AVR таймера от кварца 32768 Гц
Ладно, спасибо. Схему собирал на макетке, у нее емкость связей огромная. И емкости ставил русские. А эти могут прыгать в любом направлении. Но опыт работы с таймером поимел, что и требовалось.
|
|
|
|
12.03.2010, 12:36
|
|
Временная регистрация
Регистрация: 04.04.2008
Сообщений: 49
Сказал спасибо: 29
Сказали Спасибо 10 раз(а) в 8 сообщении(ях)
|
Re: "Глюк" AVR таймера от кварца 32768 Гц
Очень интересно, но вы просто описали один из вариантов граблей! Например я б на эти грабли не когда не стал так как у меня есть жосткая привычка инициализировать всю периферию МК а аж потом разрешать прерывания! И естественно в даташите не будут описывать эту процедура в разделе таймеры так как запрет прерываний нужно делать на всю периферию МК на время ее инициаоизации! И в даташите такая рекомендация есть и нет смысла ее повторять в каждом разделе! Наверное каждый заметил как составляет код генератор начального кода в CVAVR? Аж в самом конце инициализации мк он разрешает прерывания! Естественно если не выполнять рекомендации самого производителя, грабли неизбежны!
Последний раз редактировалось dimka11; 12.03.2010 в 12:43.
|
|
|
Сказали "Спасибо" dimka11
|
|
|
12.03.2010, 13:23
|
|
Прописка
Регистрация: 21.10.2009
Сообщений: 241
Сказал спасибо: 184
Сказали Спасибо 253 раз(а) в 139 сообщении(ях)
|
Re: "Глюк" AVR таймера от кварца 32768 Гц
Сообщение от alexgap
|
Эта грабелька часто возникает из-за того, что в даташите там где описываются режимы таймера нет явной прямой ссылки на необходимость ожидания инициализации таймера в асинхронном режиме.
|
Странно, но в даташите Rev. 8161D–AVR–10/09 в пункте 17.9 это выделено.
Сообщение от dimka11
|
Например я б на эти грабли не когда не стал так как у меня есть жосткая привычка инициализировать всю периферию МК а аж потом разрешать прерывания
|
Эти грабли возникнут (и вы на них встали-бы если не читать даташит) если вы не дождетесь (из даташит: Wait for TCN2xUB, OCR2xUB, and TCR2xUB) инициализации таймера (запуск генератора).
Просто прикиньте сколько тактов пройдет при работе МК на частоте хотя бы 8 МГц пока асинхронный генератор на частоте 32768 получит один импульс от кварца (примерно 244, а до "установившегося" режима еще больше) - этого достаточно, для того чтобы программа ушла из секции инициализации далеко в основной цикл.
|
|
|
|
12.03.2010, 16:03
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
Re: "Глюк" AVR таймера от кварца 32768 Гц
Сообщение от md5sum
|
в даташите Rev. 8161D–AVR–10/09 в пункте 17.9 это выделено
|
Да, так и есть. Однако "плохие" привычки человека бегло читать и полагаться на предыдущий опыт (с синхронными режимами таймера) заставили меня благополучно пропустить секцию 17.9 К сожалению, не я один был пойман в эту "ловушку"
__________________
.
В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
|
|
|
|
13.03.2010, 00:12
|
|
Временная регистрация
Регистрация: 26.06.2007
Сообщений: 71
Сказал спасибо: 7
Сказали Спасибо 41 раз(а) в 21 сообщении(ях)
|
Re: "Глюк" AVR таймера от кварца 32768 Гц
Да да, не далее как вчера менял аж 5! кристаллов на двух контроллерах. Ёмкости туда-сюда ставил, а всё бестолку. Тактовая аж 20 МГц, а я 10 циклов подождал и погнал.
|
|
|
|
13.03.2010, 20:37
|
|
Частый гость
Регистрация: 03.04.2008
Сообщений: 24
Сказал спасибо: 5
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: "Глюк" AVR таймера от кварца 32768 Гц
это точно для авр?
а почему вы на паскале пишете?
|
|
|
|
13.03.2010, 23:40
|
|
Прохожий
Регистрация: 16.10.2009
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: "Глюк" AVR таймера от кварца 32768 Гц
есть еще один вариант глюка - часы отстают при частом "пробуждении" контроллера.
Контроллер Мега88, часы считают чисто бинарное время с максимальным программируемым интервалом 8 сек кварц (32768 / 1024 / 256). Основная программа пробуждается по внешнему прерыванию и сохраняет во внешний EEPROM значения часов и засыпает далее. Интервал поступления событий от 8 сек. до 3 суток, питание батарейное Li-ion. "Отставание" часов не зависит от кол-ва событий, а както странно зависит от частоты их поступления, например - если за сутки набирается 500 событий - отставание часов 1 и более ЧАСА, такое же кол-во событий за 7 суток приводит к отставанию часов на 10 сек ... 1 мин. Может кто-то с таким сталкивался и подскажет что делать.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:01.
|
|