PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sekundenkorrektur bei Uhrzeit



DarkFire
15.11.2007, 19:11
Hallo!

Ich glaube ich steh mal wieder aufm Schlauch.
Ich habe ein Programm für einen Atmel Mega32 geschrieben, welches mir die Zeit aufzeichnet, wenn ein Schalter gedrückt wird.
Dazu habe ich mit dem eingebauten Timer2 eine Echtzeituhr realisiert.

Nur leider ist diese nicht so wirklich genau, also eine Abweichung von ca. 10s in der Woche.

Nun wollte ich fragen, wie ich am einfachsten eine Korrektur für die Uhrzeit (z.B. in Sekunden pro Tag oder pro Woche) einbaue.
Ich dachte da an einen Wert, den ich während die Schaltung in Betrieb ist ändern kann, z.B. über UART.

Hier noch der Codeausschnitt der für die Uhrzeit zuständig ist:


typedef struct
{
unsigned char second;
unsigned char minute;
unsigned char hour;
unsigned char date;
unsigned char month;
unsigned int year;
}time;

time t;

void Internal_Time(void)
{

TIMSK &=~((1<<TOIE2)|(1<<OCIE2));
ASSR |= (1<<AS2);
TCNT2 = 0x00;
TCCR2 = 0x05;
while(ASSR&0x07);
TIMSK |= (1<<TOIE2);
sei();
OCR2=0x00;
}


SIGNAL(SIG_OVERFLOW0)
{
if (++t.second==60)
{ t.second=0;
if (++t.minute==60)
{ t.minute=0;
if (++t.hour==24)
{
t.hour=0;
if (++t.date==32){t.month++;t.date=1;}
else if (t.date==31){if ((t.month==4) || (t.month==6) || (t.month==9) || (t.month==11)){t.month++;t.date=1;}}
else if (t.date==30){if(t.month==2){t.month++; t.date=1;}}
else if (t.date==29){if((t.month==2) && (not_leap())){t.month++;t.date=1;}}
if (t.month==13){t.month=1;t.year++;}
}
}
}
}