Hallo zusammen,
ich versuche gerade, meinen uC (Attiny 84A) in einen deep Sleep Modus
(Power Down) zu versetzen und ihn nur alle 8s aufzuwecken. Laut
Datenblatt ist das ja möglich und das mit dem deep Sleep scheint auch zu
funktionieren, jedenfalls fließen jetzt nur noch 0,3mA statt 3mA. Mehr
als erwartet, aber schon mal ein Fortschritt.
Jedoch scheint meine ISR nicht zu funktionieren, jedenfalls wird die
hier nur testweise implementierte Funktion nie ausgeführt. Weiß da
jemand hier weiter?
Viele Grüße!
1 | #include <stdint.h>
|
2 | #include <avr/io.h>
|
3 | #include <util/delay.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <avr/sleep.h>
|
6 | #include <avr/wdt.h>
|
7 | #include <stdbool.h>
|
8 |
|
9 | volatile bool flag = 0;
|
10 |
|
11 | ISR(WDT_vect)
|
12 | {
|
13 | sleep_disable();
|
14 | flag = 1;
|
15 | sleep_mode();
|
16 | reti();
|
17 | }
|
18 |
|
19 | void WDtimerInit()
|
20 | {
|
21 | cli();
|
22 | wdt_reset();
|
23 | WDTCSR |= (1 << WDIE) | (1 << WDCE) | (1 << WDP3) | (1 << WDP0);
|
24 | sei();
|
25 | }
|
26 |
|
27 | int main(void)
|
28 | {
|
29 | DDRB = 0xff; // 0000 0111 = 0x07
|
30 | DDRA = 0xc7; // 1100 0111 = 0xc7
|
31 |
|
32 | WDtimerInit();
|
33 |
|
34 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
35 | sleep_mode();
|
36 |
|
37 | while(1)
|
38 | {
|
39 | if ( flag == 1)
|
40 | {
|
41 | sleep_disable();
|
42 | PORTA = 0x01;
|
43 | _delay_ms(1000);
|
44 | PORTA = 0x00;
|
45 |
|
46 | WDtimerInit();
|
47 | flag = 0;
|
48 | sleep_mode();
|
49 | }
|
50 |
|
51 | }
|
52 | }
|