Witam.
Od jakiegoś czasu staram się w celach "samoedukacyjnych" zrobić coś na wzór zegarka. Problem polega na tym, że nie moge odmierzyć dokładnie 1 sekundy. Starałem się rozwiązać problem na kilka sposoów. jaklepszy efekt dała obsługa przerywania, lecz błąd to w dalszym ciągu kilka sekund przez noc ;p Nie chcę stosować żadnych zewnętrzych zegarów. Poniżej mój kod.
Co można poprawić, aby odmieżyć dokładnie 1 sek?
Od jakiegoś czasu staram się w celach "samoedukacyjnych" zrobić coś na wzór zegarka. Problem polega na tym, że nie moge odmierzyć dokładnie 1 sekundy. Starałem się rozwiązać problem na kilka sposoów. jaklepszy efekt dała obsługa przerywania, lecz błąd to w dalszym ciągu kilka sekund przez noc ;p Nie chcę stosować żadnych zewnętrzych zegarów. Poniżej mój kod.
Co można poprawić, aby odmieżyć dokładnie 1 sek?
#define F_CPU 4000000L
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
#include <hd44780.c>
#include <stdlib.h> // do liczby na wyswietlaczu
#include <avr/interrupt.h>
signed char sek,min,godz;
char s[3],m[3],g[3],czas[10]; //maksymalna ilosc cyfr
int main(void)
{
sek=0;
min=14;
godz=23;
TCCR1B |= (1 << WGM12);
OCR1A = 15625;
TCCR1B |= (1 << CS12);
TIMSK |= (1<<OCIE1A);
sei();
LCD_Initalize();
LCD_Clear();
LCD_WriteText("Z E G A R");
while(1)
{
if (sek==60) {sek=0;min++;}
if (min==60) {min=0;godz++;}
if (godz==24) {godz=0;}
itoa(sek,s,10);
itoa(min,m,10);
itoa(godz,g,10);
LCD_GoTo(1,1);
LCD_WriteText(g);
LCD_WriteText(":");
LCD_GoTo(4,1);
LCD_WriteText(m);
LCD_WriteText(":");
LCD_GoTo(7,1);
LCD_WriteText(s);
}
}
ISR(TIMER1_COMPA_vect)
{{
sek++;
}
}
