/* Interrupt alle 1000ms, 1 MHz Systemtakt, 16Bit-Timer 1, CTC-Interrupt, Wechsel an PB0
Taktzahl:  Phi*Sollzeit = 1Mhz*1000ms = 1.000.000
Vorteiler: Taktzahl/Werteanzahl = 1.000.000/65536 = 15,2 aus {1,8,64,256,1024} => 64
OCR0A:     Taktzahl/Vorteiler-1 = 1.000.000/64 -1 = 15624 gewaehlt 15624
Probe:     (1+OCR0A)*Vorteiler/Phi =(1+15624)*64/1MHz = 1000ms = 1s
*/
#include <avr/io.h>
#include <avr/interrupt.h>

int main(){          // Hauptprogramm
  PORTB = 0xff;
  DDRB = 0xff;
  TCCR1B |= 1<<WGM12;// Timer im CTC-Mode
  TCCR1B |= 3;        // Vorteiler 1:/1; 2:/8; 3:/64; 4:/256; 5:/1024
  TIMSK |= 1<<OCIE1A;// Timer/Counter1 Output Compare Match A Interrupt Enable
  OCR1A = 15624;     // Wert bei dem der Timer wieder auf 0 gesetzt wird
  sei();             // globale Interruptfreigabe
  while(1);          // Endlosschleife
  return 0;
}

ISR(TIMER1_COMPA_vect){ // Interrupt Service Routine
  PORTB ^= 1;           // Ausgang PB0 invertieren (PINB = 1)
}