Hallo,
das Problem mit der falsch gehenden Uhr liegt an einem Programmierfehler in "timer.c"
dort erfolgt in der Funktion "ISR (TIMER1_COMPA_vect)" das Veringern des Zählers erst nach dem Vergleich "if ( tmcount-- == 0 )..." es muss aber vorher erfolgen "if ( --tmcount == 0 )..." da sonst die Timebase 26ms beträgt.
Die Einstellung des Komperator Registers in Funktion "void timer_init (void)"
"OCR1A = (F_CPU / 1024 / 1000 * TIMERBASE) - 1;" ist bei 16Mhz ungünstig da sich kein ganzzahliger Wert ergibt besser ist ein Vorteiler 64. Damit ergibt sich ein Komperatorwert von 6250. Die Korektur von "-1" muss ebenfals entfallen da der eine Taktzyklus zum nullsetzen des Timers während der Zählung im Vorteiler stattfindet. Somit ergibt sich folgende Änderung in der Funktion "void timer_init (void)" :
Code: Alles auswählen
TCCR1B |= (1<<WGM12) | (1<<CS10 | 1<<CS11 | 0<<CS12); // Prescaler = 64
TCNT1 = 0;
// der Compare-Interrupt wird alle 'TIMERBASE' Millisekunden ausgelöst
OCR1A = (F_CPU / 64 / 1000 * TIMERBASE);
und in der Funktion "ISR (TIMER1_COMPA_vect)":
Gruß
Medel