Zitat Zitat von Marco78
Es bleibt auch zu beachten, das wenn ein Timer benutzt wird, die Zeit vom Auslösen des Interrupts bis zur Ausführung des erstens Befehls der ISR die Uhrzeit verfälscht.
Nö. Nicht wenn man Timer 1 richtig verwendet. Da gibt es ein "Clear Timer on Compare Match" zusammen mit ISR zu Output-Compare (nicht: Timer Overflow) und richtigem Wert im Output-Compare-Register bekommt man genauen Sekundentakt hin -- jedenfalls so genau, wie es Quarz/Resonator hergeben:
Code:
void init_timer1()
{
    /* timer1 is counter */
    TCCR1A = 0;
#if defined (__AVR_AT90S2313__)
    // timer1 running on full MCU clock
    TCCR1B = _BV (CS10) | _BV (CTC1);
#elif defined (__AVR_ATmega8__)
	 // Mode #4 für Timer1 (Manual S. 97)
	 // und full MCU clock
    TCCR1A = 0;
    TCCR1B = _BV (WGM12) | _BV (CS10);
#else
#error Dont know how to setup timer1
#endif

	// set PoutputCompare to get desired Timer1 frequency
	OCR1A = (unsigned short) ((long) F_CPU / INTERRUPTS_PER_SECOND-1));

	// output compare interrupt for timer 1
   TIMSK |= _BV (OCIE1A);
}

SIGNAL (SIG_OUTPUT_COMPARE1A)
{
    ...
}