/* Korrekturhinweise ABI-IT 2017 Aufgabe 2 fuer Atmel AVR-Controller
   Controller wird mit 1 MHz betrieben -> 1µs Systemtakt, entspricht 12 MHz 8051 
*/

void main(){ // 2.2.1 (PAP war verlangt) Beispiel-C-Code fuer die Einstellungen
  MCUCR |= 1 << ISC01;   // INT0 fallende Flanke
  GIMSK |= 1 << INT0;    // INT0-Interrupt frei geben
  sei();                // Globale Interruptfreigabe
  while(1);             // Endlosschleife
}

/* 2.2.3 Timer0 (8-Bit) mit CTC-Mode (aehnlich zu Auto Reload bei 8051)
   bei Erreichen eines Vergleichswerts OCR0A wird Timer auf 0 gesetzt und ISR ausgeloest.
   Beim Verwenden des Overflowinterrupts muessten bis zum erneuten Vorstellen des Timers
   in der ISR etwa 10 Takte fuer die Verzweigung in die ISR und das Sichern des
   Statusregisters veranschlagt werden, je nach Laune des Compilers, Assemblerausgabe
   beachten. Jitter dürfte zwar wenig auftreten, denn es wird im Hauptprogramm nur ein rjmp
   unterbrochen. Overflowinterrupt ist trotzdem besonders bei kurzen Zeiten keine gute Idee.
*/
void timerinit(){
  TCCR0A |= 1 << WGM01;  // Timer im CTC-Mode
  TCCR0B |= 1;           // Vorteiler 1, Timer mit Systemtakt 1µs
  TIMSK  |= 1 << OCIE0A; // Interrupt bei Counter = Vergleichswert
  OCR0A  = 58;           // Vergleichswert Interruptzeit=(1+OCR0A) * 1µs
}

// 2.2.4
ISR(INT0_vect){
  GIMSK &= ~(1 << INT0); // oder einfach GIMSK = 0 INT0 disable 
  distanz = 0;
  timerinit();
}

// 2.2.5
ISR(TIMER0_COMPA_vect){
  distanz ++;
  if(PIND & 4){        // PD2 == 1 ?
    TCCR0B = 0;        // Timertakt abschalten -> stopp
    PORTB = diestanz;
    GIMSK = 1 << INT0; // INT0-Interrupt frei geben
  }
}