Главная » 2015 » Июль » 9 » "Глюк" AVR таймера от кварца 32768 Гц
21:26
"Глюк" 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.

Но теперь вы предупреждены - если часовой генератор не работает или работает неустойчиво - см. в код инициализации таймера

alexgap

Категория: Электроника | Просмотров: 207 | Добавил: graftsv
Всего комментариев: 0
avatar