Guten Abend, ums kurz zu machen: Ich habe ein batteriebetriebenes gerät welches sich automatisch ausschalten soll sobald längere Zeit kein Taster mehr gedrückt wurde. Dazu benutze ich den auf 1s programmierten watchdog. In der ISR des WD habe ich eine Funktion implementiert welche mir das gerät ausschaltet. Dies funktioniert einwandfrei. Da das jedoch erst nach 20s passieren soll wird jedes mal wenn er aufwacht eine variable inkrementiert. Hat sie den Wert 20 (sekunden) erreicht soll sich das gerät ausschalten. Problem: Nachdem das Ende der ISR erreicht wurde hängt sich der controller auf. Zumindest reagiert das Gerät auf keinerlei Tastendruck mehr (Das Display zeigt den jeweiligen letzten wert an) Hat jemand evtl. sowas ähnliches programmiert und kennt sich aus ?? Danke schonmal !
1 | // global.h
|
2 | |
3 | uint8_t wdto_ctr; |
4 | #define WDT_timeout 20;
|
5 | |
6 | // system.c
|
7 | |
8 | ISR(WDT_vect) |
9 | {
|
10 | wdto_ctr++; |
11 | if (wdto_ctr >= WDT_timeout) // Timeout nach 20s |
12 | {
|
13 | wdt_disable(); // Damit der Ausschaltvorgang nicht unterbrochen wird |
14 | PWR_off(); // Schaltet das Gerät aus |
15 | }
|
16 | |
17 | }
|
18 | |
19 | ISR(PCINT0_vect) // wird nach tastendruck ausgeführt |
20 | {
|
21 | wdt_reset(); |
22 | wdto_ctr=0; |
23 | }
|
24 | |
25 | // main.c
|
26 | |
27 | main
|
28 | {
|
29 | wdt_enable(WDTO_1S); // Enable WDT |
30 | WDTCSR |=(1<<WDIE); // Enable Interrupt on WD Timeout |
31 | wdto_ctr=0; // Init Timeout counter |
32 | |
33 | while(1) |
34 | {
|
35 | // [..] ändere xyz in abhängigkeit von der tasteneingabe und zeige wert an
|
36 | }
|
37 | }
|