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
Gast
#365092
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
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.
Gast
#365094
Uiiii... Vielen Dank für den Hinweis! Gruss Peter
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);
}