Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

Некорректная работа таймера ATMega16A

Вт июл 10, 2012 06:51:20

Захотел сделать часы. МК работает на 16МГц. Выбрал таймер T2, делитель 1024, режим СТС, прерывание на 125. Внутри прерывания крутиться переменная, которая доходя до 125 увеличивает счётчик секунд.
125*125*1024=16000000. Таким образом получается чёткий один герц. Но в реальности на "секунду" уходит около 3.9 секунд :facepalm: (таймер тормозит в 3.9), засекал секундомером на большом промежутке. почему так? или CLKsys это не частота МК а что-то другое? тогда что?

кусочки кода:

interrupt [TIM2_COMP] void timer_comp(void) //прерывание по совпадению
{
if(++ps==125) //переменная ps обеспечивает ещё одно разделение на 125
{
ps=0;
sec++;
}
}

void Start_Clock(void) //инициализация таймера
{
TIMSK |=(1<<OCIE2); //разрешаем прерывание по совпадению
TCCR2 |=(1<<CTC2)|(1<<CS20)|(1<<CS21)|(1<<CS22); //режим СТС, тактовый сигнал=CLKsys / 1024
OCR2=125; //прерывание при дохождении до 125
}

ЗЫ. При использовании функции delay_ms из библиотеки delay.h на примере моргающего светодиода такая же фигня - моргает он куда медленнее, чем указанная частота. Хотя кварц стоит на 16.000, в настройках CVAVR частота указана правильно.
ЗЫЫ. Для вывода используется дисплейчик от Нокии3310, библиотеку я взял чужую и без особого разбора подключил. Хотя странно, но вдруг в ней дело? подскажите, знающие люди!)

Re: Некорректная работа таймера ATMega16A

Вт июл 10, 2012 07:07:35

Счетчик таймера TCNT2 сбрасывать надо в обработчике прерывания , иначе он по кругу гоняет пока его не остановишь или не сбросишь.

Re: Некорректная работа таймера ATMega16A

Вт июл 10, 2012 07:18:53

zero648 писал(а):Счетчик таймера TCNT2 сбрасывать надо в обработчике прерывания , иначе он по кругу гоняет пока его не остановишь или не сбросишь.

Исходя из названия режима это странно по понятным причинам.
Но даже если так, это объясняет тормоза только в два раза, а не в четыре.

Да, сделал сброс TCNT2 в обработчике прерывания - ничего не изменилось, та же проблема.

Re: Некорректная работа таймера ATMega16A

Вт июл 10, 2012 07:33:19

Petr57, Вы про фьюзы ничего не сказали. Вполне возможно, что МК у Вас работает от внутреннего ггенератора.

Re: Некорректная работа таймера ATMega16A

Вт июл 10, 2012 08:07:46

U235 писал(а):Petr57, Вы про фьюзы ничего не сказали. Вполне возможно, что МК у Вас работает от внутреннего ггенератора.

опа опа оппапа! Кажется Вы правы. Не подскажите, где можно найти русскоязычное описание фьюзов на мегу16?

Re: Некорректная работа таймера ATMega16A

Вт июл 10, 2012 08:12:41

Как ничего не изменилось, даже в два раза быстрее считать не стал чтоли?
У вас кварц на 16МГц стоит или что? Тактируется МК от чего?

Re: Некорректная работа таймера ATMega16A

Вт июл 10, 2012 08:14:53

Да и вообще внутренний генератор не точный частота может колебаться.

Re: Некорректная работа таймера ATMega16A

Вт июл 10, 2012 09:53:18

1) Подключенный снаружи кварц ещё не гарантия тактования от него!
2) В режиме СТС не нужно в прерывании трогать счетчик таймера - на то он и СТС!
3) насколько я знаю.....из 16000000 тяжело получить точную секунду....лучше используйте часовой кварц
4) не забывайте что таймер считает 0-1-2-3 а не 1-2-3 !! внимательнее с этим надо быть
5) Ваш программный делитель до 125 не досчитывает и там путаницы с нулём нет!

Re: Некорректная работа таймера ATMega16A

Вт июл 10, 2012 11:57:00

Ух, намучался.. Искал какие же всё-таки фьюзы нужно выставлять, в результате прошил на работу от внешнего генератора.. :o . Думал всё, конец, перепробовал кучу методов и всё таки нашёл решение! взял завалявшуюся тиньку2313 прошил в неё код
while(1)
{
PORTB.0=0;
PORTB.0=1;
}
и подключил этот выход на XTAL1 меги. :shock: Ура!! этого хватило, чтобы снять злополучные фьюзы! может кому-нибудь пригодится такой метод. 8)

Действительно, она работала не на 16МГц. Нашёл какие фьюзы ставить - теперь часики отлично тикают :))
Всем большое спасибо, и извините за такую глупость :)
Тема закрыта