Захотел сделать часы. МК работает на 16МГц. Выбрал таймер T2, делитель 1024, режим СТС, прерывание на 125. Внутри прерывания крутиться переменная, которая доходя до 125 увеличивает счётчик секунд.
125*125*1024=16000000. Таким образом получается чёткий один герц. Но в реальности на "секунду" уходит около 3.9 секунд
(таймер тормозит в 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, библиотеку я взял чужую и без особого разбора подключил. Хотя странно, но вдруг в ней дело? подскажите, знающие люди!)