Отстает секундомер на 2 минуты за полчаса. И в протеусе и в железе примерно так же. Резонатор керамический 1 МГц, ATmega8L. Компилятор WinAvr. Что не так?
Код
#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdlib.h>
#include <lcd_lib.h>
#include <lcd_lib.c>
#include <avr/signal.h>
unsigned int counter; // счетчик для секундомера: 488 прерываний = 1 секунда
unsigned char sec,minut,hour; // сек.,мин.,часы для секундомера
unsigned char c[5];
ISR(TIMER0_OVF_vect)
{
counter++;
if (counter==488)
{
Lcd_Goto(0,0);
Lcd_WriteData('t');
Lcd_WriteData('i');
Lcd_WriteData('m');
Lcd_WriteData('e');
Lcd_WriteData(' ');
itoa(hour,c,10);
if (hour<10)
{
Lcd_WriteData('0');
Lcd_WriteData(c[0]);
}
else
{
Lcd_WriteData(c[0]);
Lcd_WriteData(c[1]);
}
Lcd_WriteData(':');
itoa(minut,c,10);
if (minut<10)
{
Lcd_WriteData('0');
Lcd_WriteData(c[0]);
}
else
{
Lcd_WriteData(c[0]);
Lcd_WriteData(c[1]);
}
Lcd_WriteData(':');
itoa(sec,c,10);
if (sec<10)
{
Lcd_WriteData('0');
Lcd_WriteData(c[0]);
}
else
{
Lcd_WriteData(c[0]);
Lcd_WriteData(c[1]);
}
Lcd_WriteData(' ');
Lcd_WriteData(' ');
Lcd_WriteData(' ');
counter=0;
sec++;
if (sec==60)
{
sec=0;
minut++;
if (minut==60)
{
minut=0;
hour++;
}
}
}
}
int main (void) {
Lcd_Init();
DDRD = 0b00000001;
sei();
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
TCCR0=0x02;
TCNT0=0x00;
TIMSK=0b00000001; // разреш. прерыв. timer0
while (1)
{
}
return 0;
}
Эскизы прикрепленных изображений