Hallo! Ich arbeite gerade an meiner Facharbeit ET.. und ich wollte jetzt einfach mal einen Watchdog-Reset einbauen da meine Programmierung langsam kompliziert wird ;) Nun: der Watchdog funktioniert, der Reset wird nach 2s ausgelöst Aber: Nun will ich nach dem Reset feststellen ob ein Watchdog Reset ausgelöst wurde. Meine "MessageBox" erscheint aber auch beim externem Reset (auch nach dem ISP-Proggen) .. Hab ich hier ein Brett vorm Kopf? Danke schonmal! int main() { [...] //Grafikinit //Wenn Reset durch watchdog: if (MCUCSR & (1 << WDRF)) {MessageBox("Watchdog:\nDas System hat sich neugestartet.", MB_OK);} //Watchdog start wdt_enable(WDTO_2S); ... //und weiter
Möglicherweise liegt es daran, dass das die entsprechenden Statusbits im MCUCSR nach der Auswertung "von Hand" zurückgesetz werden müssen. Anbei meine Reset-Check Routine, die ich für den AtMega128 verwende, die funktioniert soweit zuverlässig! MfG Peter
1 | void CHECK_reset(void) |
2 | {
|
3 | UART1_puts_I("\n\r"); // a new line |
4 | if (MCUCSR & (1<<BORF)) // Brown-Out Reset |
5 | {
|
6 | UART0_putl_I("Brown-Out Reset"); |
7 | }
|
8 | else if (MCUCSR & (1<<PORF)) // Power-On Reset |
9 | {
|
10 | UART0_putl_I("Power-On Reset"); |
11 | }
|
12 | else if (MCUCSR & (1<<JTRF)) // JTAG Reset |
13 | {
|
14 | UART0_putl_I("JTAG Reset"); |
15 | }
|
16 | else if (MCUCSR & (1<<EXTRF)) // External Reset |
17 | {
|
18 | UART0_putl_I("External Reset"); |
19 | }
|
20 | else if (MCUCSR & (1<<WDRF)) // Watchdog Reset |
21 | {
|
22 | UART0_putl_I("Watchdog Reset"); |
23 | }
|
24 | else
|
25 | {
|
26 | UART0_putl_I("Manual Jump"); |
27 | }
|
28 | MCUCSR &= 0xE0; // Clear Reset-Status |
29 | }
|
p.s.: Bei den neueren AVRs (alle, die einen Watchdog haben, der nun auch einen Interrupt auslösen kann) bitte das MCU[C]SR *ganz schnell* nach Programmstart auslesen und ausnullen und danach sofort den Watchdog deaktivieren (in dieser Reihenfolge). Keine UART-Ausgaben (wie in Peters Beispiel) mit da drin, sonst knallt der Watchdog-Reset sofort wieder rein. Ist ein Feature... ist ordentlich dokumentiert, man rechnet nur erstmal nicht damit. Der Watchdog bleibt dort nach einem Watchdog-Reset aktiviert, und was noch verwirrender ist, ein gesetztes WDRF-Bit in MCU[C]SR verhindert das Abschalten des Watchdogs.
Vielen Dank! Da wäre ich nie drauf gekommen... hab ich wohl im Datemblatt überlesen :-/ Ich hab es jetzt so und es funktioniert wie es sollte: //Wenn Reset durch watchdog: if (MCUCSR & (1 << WDRF)) { MessageBox("Watchdog:\nDas System hat sich neugestartet.", MB_OK); MCUCSR &= ~(1 << WDRF); }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.