Например TDA7294

Форум РадиоКот :: Просмотр темы - Некорректная работа таймера ATMega16A
Форум РадиоКот
https://radiokot.ru/forum/

Некорректная работа таймера ATMega16A
https://radiokot.ru/forum/viewtopic.php?f=20&t=75404
Страница 1 из 1

Автор:  Petr57 [ Вт июл 10, 2012 06:51:20 ]
Заголовок сообщения:  Некорректная работа таймера ATMega16A

Захотел сделать часы. МК работает на 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, библиотеку я взял чужую и без особого разбора подключил. Хотя странно, но вдруг в ней дело? подскажите, знающие люди!)

Автор:  zero648 [ Вт июл 10, 2012 07:07:35 ]
Заголовок сообщения:  Re: Некорректная работа таймера ATMega16A

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

Автор:  Petr57 [ Вт июл 10, 2012 07:18:53 ]
Заголовок сообщения:  Re: Некорректная работа таймера ATMega16A

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

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

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

Автор:  U235 [ Вт июл 10, 2012 07:33:19 ]
Заголовок сообщения:  Re: Некорректная работа таймера ATMega16A

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

Автор:  Petr57 [ Вт июл 10, 2012 08:07:46 ]
Заголовок сообщения:  Re: Некорректная работа таймера ATMega16A

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

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

Автор:  zero648 [ Вт июл 10, 2012 08:12:41 ]
Заголовок сообщения:  Re: Некорректная работа таймера ATMega16A

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

Автор:  zero648 [ Вт июл 10, 2012 08:14:53 ]
Заголовок сообщения:  Re: Некорректная работа таймера ATMega16A

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

Автор:  clawham [ Вт июл 10, 2012 09:53:18 ]
Заголовок сообщения:  Re: Некорректная работа таймера ATMega16A

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

Автор:  Petr57 [ Вт июл 10, 2012 11:57:00 ]
Заголовок сообщения:  Re: Некорректная работа таймера ATMega16A

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

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/