/* Interrupt alle 30ms, 1 MHz Systemtakt, 8Bit-Timer 0, CTC-Interrupt, Wechsel an PB0
Taktzahl:  Phi*Sollzeit = 1Mhz*30ms = 30.000
Vorteiler: Taktzahl/Werteanzahl = 30.000/256 = 117 aus {1,8,64,256,1024} => 256
OCR0A:     Taktzahl/Vorteiler -1 = 30.000/256 -1 = 116,1 gewaehlt 116
Probe:     (1+OCR0A)*Vorteiler/Phi =(1+116)*256/1MHz = 29,95 ms
*/
#include <avr/io.h>
#include <avr/interrupt.h>

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

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