#include <avr/io.h>     // Definitionen laden 
#include <util/delay.h> // CPU Frequenz einstellen! 
#include <avr/interrupt.h>

#define KEYREADER ~PIND & 0b11 // Einlesen, invertieren, maskieren zurecht schieben 
#include "keycheck.inc"        // http://mezdata.de/avr/083_c-entprellen/keycheck.inc

unsigned char muster[2][6]={{4,0b1000,0b0100,0b0010,0b0001},{5,0b0001,0b0011,0b0111,0b1111,0b0000}};
unsigned int  musterWartenZeiten[]={400,200,100,50}; // Zeiten des Wartens bis naechstes Muster
unsigned char musterWarten = 0;
unsigned char musterzaehler=1,musternummer=0;

void wechsleMuster(){
  PORTB=(PORTB|0b1111) & ~muster[musternummer][musterzaehler]; // Muster aus Array
  musterzaehler++;
  if(musterzaehler>muster[musternummer][0]){ // Musterende erreicht?
    musterzaehler=1;
  }
}

int main(){         // Hauptprogramm 
  PORTB=0xff;       // alle LED aus 
  DDRB=0xff;        // PB als Ausgang
  PORTD=0xff;       // PullUps an
  TCCR0B = 5;       // Systemtakt durch 1024
  TIMSK |= 1<<TOIE0;// TimerOverflowInterruptEnable0
  sei();            // globale Interruptfreigabe
  while(1){         // Endlosschleife 
    keyCheck();
    if(keyEnter&1){ // Taste gedrueckt?
      musterzaehler=1;
      musternummer++;
      if(musternummer>=sizeof(muster)/sizeof(muster[0])) musternummer=0;
    }
    if(keyEnter&2){ // Taste1 gedrueckt?
      musterWarten++;
      if(musterWarten>=sizeof(musterWartenZeiten)/2) musterWarten=0; 
    }
  } 
  return 0; 
}

/*
Vorteiler berechnen: Phi*Sollzeit/Maximalzaehlwert = 1Mhz*400ms/256 = 1562.5! => 1024
ISRTeilfaktor ermitteln: Phi*Sollzeit/Maximalzaehlwert/Vorteiler = 1Mhz*400ms/256/1024 = 1,5 Aufrunden: 2
Vorsteller berechnen: Maximalzaehlwert - Phi*Sollzeit/Vorteiler/ISRTeilfaktor = 256 - 1Mhz*400ms/1024/2 = 60.7 => 61
Probe der Genauigkeit: (Maximalzaehlwert-Vorsteller)*Vorteiler/Phi*ISRTeilfaktor =(256-61)*1024/1MHz*2 = 399.4 ms
Zeit bei Vorsteller   0: (Maximalzaehlwert-Vorsteller)*Vorteiler/Phi*ISRTeilfaktor =(256-0)*1024/1MHz*2 = 524.9 ms
Zeit bei Vorsteller 255: (Maximalzaehlwert-Vorsteller)*Vorteiler/Phi*ISRTeilfaktor =(256-255)*1024/1MHz*2 = 2 ms
*/

ISR(TIMER0_OVF_vect){ // Interrupt Service Routine
  static unsigned char teiler=0;
  TCNT0 = 255-(musterWartenZeiten[musterWarten])/2; // wieder vorstellen
  teiler++;
  if(teiler>=2){      // Teilfaktor in ISR
    teiler=0;
    wechsleMuster();  // Muster wechseln
  }
}
