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.