#define F_CPU 8000000
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// lange, variable Wartezeit, Einheit in Millisekunden

void long_delay(uint16_t ms) {
    for (; ms>0; ms--) _delay_ms(1);
}



int main (void) {

// IO konfigurieren

    DDRA = 0xFF;
    DDRB = 0xBF;		// PB6 = INT0 = Eingang
   

// Analogcomparator ausschalten

    ACSRA = 0x80;

// Interrupt konfigurieren

    MCUCR &= ~0x3;              // levelgesteuerter Interrupt an INT0

// Interrupts freigeben

    sei();
    
// Endlose Hauptschleife

    while(1) {

        GIMSK |= (1 << INT0);            // externen Interrupt freigeben

        set_sleep_mode(SLEEP_MODE_PWR_DOWN);
        sleep_mode();                   // in den Schlafmodus wechseln

        // hier wachen wir wieder auf
        GIMSK &= ~(1 << INT0);           // externen Interrupt sperren
                                        // WICHTIG! falls der externe LOW Puls an INT0
                                        // sehr lange dauert
										
   
		PORTA |= (1 << PA5);            // LED für eine Sekunde anschalten
        long_delay(1000);
        PORTA &= ~(1 << PA5);
		
    }
}

// externer Interrupt INT0 

// Die Interruptroutine kann leer sein, ABER sie muss existieren!
// Sonst springt der AVR nach dem Aufwachen zum Reset, weil kein sinnvoller
// Interruptvektor eingetragen ist!

ISR(INT0_vect) {
}
