byte sekunde = 0;
byte minute  = 0;
byte stunde  = 8;
byte akt_pos = 0;

byte stunden_lut[24] = {0,5,10,15,20,25,30,35,40,45,50,55,0,5,10,15,20,25,30,35,40,45,50,55};

byte blink_zeit = 20;     
byte stundenzeiger = 0;    // PORT D
byte minutenzeiger = 0;    // PORT C
byte sekundenzeiger = 0;   // PORT B

byte changed = 0;


void init();


int main(void)
{
  init();

  while(1)
  {
    if(stunde >= 22 || stunde <= 6)
    {
      blink_zeit = 20;     // für ca. 12,5 us blinken
    }
    else
    {
      blink_zeit = 175;     // für ca. 40 us blinken
    }


    if(changed == 1)
    {
      PORTB = 0x01;

      changed        = 0;  // Signal zurücksetzen
      stundenzeiger  = 0;  // ertsmal alle Zeiger null setzen
      minutenzeiger  = 0;
      sekundenzeiger = 0x04; // Sekundenzeiger macht immer äußeren Kreis


      // Sekunde und die Striche abarbeiten
      if(akt_pos == 55 || akt_pos == 50 || akt_pos == 40 || akt_pos == 35 || akt_pos == 25 || akt_pos == 20 || akt_pos == 10 || akt_pos == 5)
      {
        sekundenzeiger |= 0x08;
      }
      if(akt_pos == 45 || akt_pos == 30 || akt_pos == 15 || akt_pos == 0)
      {
        sekundenzeiger |= 0x18;
      }
      if(akt_pos == sekunde)
      {
        sekundenzeiger |= 0x02;
      }

      // Minute abarbeiten
      if(akt_pos == minute)
      {
        minutenzeiger = 0x07;
      }

      // Stunde abarbeiten
      if(akt_pos == stunden_lut[stunde])
      {
        stundenzeiger = 0x3F;
      }

      // Zuordnen
      PORTB = sekundenzeiger;
      PORTC = minutenzeiger;
      PORTD = stundenzeiger;

      // Wartezeit
      TCNT2 = blink_zeit; 
      while(TCNT2 != 0)  
      {
      }

      // Rücksetzen
      PORTB = 0x00;
      PORTC = 0x00;
      PORTD = 0x00;
    }
  }
}



void init()
{
  // Ausgänge festlegen
  DDRC = 0x07;    
  DDRB = 0x3F;
  DDRD = 0x1F;

  // Analog Comperator einstellen
  ADCSRB = 0x00;           // AIN1 als negativer Input für analog Comperator
  ACSR   = 0x0B;           // Analog Copm. enabled und auf rising edge
  DIDR1  = 0x03;           // Digital Input Buffer von AIN1/0 deaktivieren

  // Timer 1 einstellen (Sekundentakt)
  TCCR1B = 0x0C;           // Takt des Timers = CLKio/256 (max >1s), und WGM12 -> Timer Operation: ClearTimer on Compare Match, TOP: OCR1A, Update: Immediate, TOV1 Flag: MAX
  OCR1A  = 62500;          // Counter maximum/Compare Match Wert
  TCNT1  = 0;              // Counter bei 0 starten
  TIMSK1 = 0x02;           // Interrupt bei Compare A Match

  // Timer 2 einstellen (Blink-Länge)
  TCCR2B = 0x02;           // Takt des Timers = CLKio/8

  // Timer 0 einstellen (6° Takt)
  TCCR0B = 0x03;            // Takt des Timers = CLKio/64 (max 1ms),
  TCCR0A = 0x02;           // Clear Timer on Compare Match, TOP: OCRA0, Update: Immediate, TOV1 Flag: MAX
  OCR0A = 231;               // HIER DEN WERT FÜR DIE 6° EINSTELLEN                                                      <----------------------------------------------------------------------------------------------------
  TCNT0 = 0;               // bei null starten
  TIMSK0 = 0x02;           // Interrupt bei Compare A Match

  sei();
}



ISR(TIMER1_COMPA_vect)
{
  sekunde++;
  if(sekunde == 60)
  {
    sekunde = 0;
    minute++;
    if(minute == 60)
    {
      minute = 0;
      stunde++;
      if(stunde == 24)
      {
        stunde = 0;
      }
    }
  }
  return;
};


ISR(ANALOG_COMP_vect)  // wird erreicht, wenn IR-LED und Fototransistor übereinander stehen -> 12 Uhr erkannt
{
  akt_pos = 0;  // akt_pos auf Null setzen
  TCNT0 = 0;    // 6° Timer ZURÜCKSETZEN !!!
  return;    
};


ISR(TIMER0_COMPA_vect)  // wird alle 6° augeführt
{
  changed = 1;      // anzeigen, dass neue Position erreicht wurde
  if(akt_pos == 0)  // Ventilator dreht linksherum
  {
    akt_pos = 59;
  }
  else
  {
    akt_pos--;      // Aktuelle Positon runterzählen
  }

  return;
};

