Forum: Compiler & IDEs mega32: Watchdog/ Externer Reset


von Ferdinand S. (noonien) Benutzerseite


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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
}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

Uiiii...

Vielen Dank für den Hinweis!

Gruss Peter

von Ferdinand S. (noonien) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.