Господа, пишу программку для подсчета периода импульсов. Могу применять только 8-битный таймер, ибо 16-ти битный таймер занят.
Всвязи с тем что переполнение его наступает через каждые 256 тактов, их приходится точно просчитывать.
Вот такой вот код:
Код
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//tacts++;
a=TCNT0;
TCCR0=0x00;
lcd_gotoxy(0,0);
lcd_putsf(" ");
lcd_gotoxy(0,0);
sprintf(s," %i", a);
lcd_puts(s);
TCCR0=0x01;
}
То есть сразу по прерывания по переполнения таймер по идее должен сбрасываться. В самом начале обработчика значение TCNT0 записывается в переменную a. И ее значение выводится на экран. Так вот в данном случае оно равно 32 или 33 (в зависимости от фазы луны и того, чем я похмелялся )))) ). Что контроллер делает эти 32 такта?
ПРичем 32 такта выдается хоть при 16 000 кГц, хоть при делении на 8 (2000 кГц).
Инициализирую таймер так:
Код
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;
Что делать и кто виноват?
У кого нибьудь есть опыт написания таких программ, когда приходилось несколько циклов переполнения таймера складывать. Как-нибудь компенсировали время, затрачиваемое на обработку прерывания?