sleep_Mode.c


1
#define F_CPU 8000000
2
#include <avr/io.h>
3
#include <avr/sleep.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
7
// lange, variable Wartezeit, Einheit in Millisekunden
8
9
void long_delay(uint16_t ms) {
10
    for (; ms>0; ms--) _delay_ms(1);
11
}
12
13
14
15
int main (void) {
16
17
// IO konfigurieren
18
19
    DDRA = 0xFF;
20
    DDRB = 0xBF;    // PB6 = INT0 = Eingang
21
   
22
23
// Analogcomparator ausschalten
24
25
    ACSRA = 0x80;
26
27
// Interrupt konfigurieren
28
29
    MCUCR &= ~0x3;              // levelgesteuerter Interrupt an INT0
30
31
// Interrupts freigeben
32
33
    sei();
34
    
35
// Endlose Hauptschleife
36
37
    while(1) {
38
39
        GIMSK |= (1 << INT0);            // externen Interrupt freigeben
40
41
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);
42
        sleep_mode();                   // in den Schlafmodus wechseln
43
44
        // hier wachen wir wieder auf
45
        GIMSK &= ~(1 << INT0);           // externen Interrupt sperren
46
                                        // WICHTIG! falls der externe LOW Puls an INT0
47
                                        // sehr lange dauert
48
                    
49
   
50
    PORTA |= (1 << PA5);            // LED für eine Sekunde anschalten
51
        long_delay(1000);
52
        PORTA &= ~(1 << PA5);
53
    
54
    }
55
}
56
57
// externer Interrupt INT0 
58
59
// Die Interruptroutine kann leer sein, ABER sie muss existieren!
60
// Sonst springt der AVR nach dem Aufwachen zum Reset, weil kein sinnvoller
61
// Interruptvektor eingetragen ist!
62
63
ISR(INT0_vect) {
64
}