/* timer_01.c ATmega88 @ 8MHz */
#include <avr/io.h>
#include <avr/interrupt.h>

#define statusled (1<<PB1) // LED an PB1

uint16_t timer_overflow_counter = 0; // Fehler im Buch: uint8_t kann nur Werte bis 255 speichern
void init_timer_0 (void) 
{
   TCCR0A = 0x00; 
   TCCR0B = (1<<CS01) + (1<<CS00); // Prescaler = 64 -> 8Mhz/64 = 125000 
   TIMSK0 = (1<<TOIE0); // Timer0 overflow interrupt enable 
   TCNT0 = 131; // Timer mit 131 vorladen 
} 

int main(void) 
{ 
   DDRB = 0xFF; // PORTB Richtungsregister = Ausgang 
   init_timer_0(); // Timer 0 initialisieren 
   sei(); // Interrupts einschalten 

   while(1) 
   { 
      asm ("NOP"); // Nichts tun 
   } 
}

ISR(TIMER0_OVF_vect)                  // Timer Interrupt wird alle 1ms ausgeführt
{

   TCNT0 = 131;                       // Timer0 erneut mit 131 vorladen

   if (timer_overflow_counter <= 999) // Zählvariable 999 mal hochzählen
      timer_overflow_counter ++;

   else                              // Den else-Zweig beim 1000. Durchlauf (1 Sekunde) einmal ausführen
   {
      PORTB ^= statusled;            // Status LED toggeln
      timer_overflow_counter = 0;    // Zähler zurücksetzen
   }
}