Forum: Mikrocontroller und Digitale Elektronik Atmega328P Firmware hängt nach Watchdog Reset


von Tom (tom_iphi)


Lesenswert?

Hallo,

ich möchte meine Atmega-Firmware per Software, d.h. mittels Watchdog 
resetten. Im Prinzip funktioniert das auch, aber manchmal eben auch 
nicht.

Hier mein abgespeckter Code:
1
int main(void)
2
{
3
  _delay_ms(100);  //watchdog lock-up only if this delay is activated!!!!!!
4
/////////////////////////////////////////////////////////////////////////////////////
5
  DDRC = DDRC | 0x3f;        //LED outputs
6
  DDRB = DDRB & ~1;        //PB0 key input
7
  long long int counter=-1;     //LED counter
8
  wdt_enable(WDTO_1S);      //set Watchdog Timer
9
/////////////////////////////////////////////////////////////////////////////////////
10
//  main loop
11
    for(;;){            // main event loop 
12
      wdt_reset();      //restart watchdog timer
13
      PORTC=(PORTC & ~0x3E) | ((counter >> 11) & 0x3E); //LED blinking action
14
      char key=PINB & 1;
15
      PORTC=(PORTC & ~1) | key;  //output to LED, normally high
16
      counter--;
17
      if (key==0){ 
18
           counter=-1; //LEDs off
19
           for(;;){}   //init watchdog reset
20
     }
21
    }
22
}

Der Watchdog wird mit einer Taste auf PB0 ausgelöst.
Zur Kontrolle der Funktionalität der Firmware zählt PC1...PC5 runter, da 
habe ich LEDs dran, die entsprechend blinken, solange die Firmware 
läuft.

Das Verrückte ist, was
1
_delay_ms(100);
 ganz am Anfang verursacht.
Ist der auskommentiert, tut der Watchdog genau das, was er soll. Das 
Blinken geht nach Auslösen des Watchdog von vorne los.

Hab ich den Delay aktiviert, dann hängt der Watchdog die Firmware auf, 
kein Blinken mehr nach Auslösen des Watchdog.
Hat hierfür irgend jemand eine Erklärung?
Ich benutze WinAVR und avr-gcc und flashe über ISP.

Gruß, Thomas

von MaWin O. (mawin_original)


Lesenswert?

Tom schrieb:
> Das Verrückte ist, was_delay_ms(100);
>  ganz am Anfang verursacht.

Was ist daran verrückt? Du bist in einer Reset-Schleife.
Du musst den Watchdog so früh wie möglich, am besten noch vor der 
main(), initialisieren. Ansonsten resettet er mit dem kürzesten 
Interval.

von Sascha W. (sascha-w)


Lesenswert?

Wichtig auch, aktiviert man ihn wie hier per Software, dann überlebt das 
auch den davon ausgelösten Reset.

Sascha

von Tom (tom_iphi)


Lesenswert?

Vestehe ich das richtig:

Nach dem Watchdog Reset ist der Watchdog immer noch enabled, aber das 
Intervall wurde von 1s auf das kürzeste zurückgesetzt?

Thomas

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Tom schrieb:
> Vestehe ich das richtig:
>
> Nach dem Watchdog Reset ist der Watchdog immer noch enabled, aber das
> Intervall wurde von 1s auf das kürzeste zurückgesetzt?

So steht es im Datenblatt!
Möchtest du das Datenblatt an der Stelle anzweifeln?
(oder lieber nochmal aufmerksam lesen?)

von C-hater (c-hater)


Lesenswert?

Tom schrieb:

> Nach dem Watchdog Reset ist der Watchdog immer noch enabled

Bei sehr vielen AVR8-Targets ist das so, ja.

> aber das
> Intervall wurde von 1s auf das kürzeste zurückgesetzt?

Das wiederum ist noch mehr "target-spezifisch". Ein Blick in's 
Datenblatt liefert die Antwort. Man muss es halt einfach auch mal lesen. 
Genau dafür gibt's das...

von MaWin O. (mawin_original)


Lesenswert?

Tom schrieb:
> Nach dem Watchdog Reset ist der Watchdog immer noch enabled, aber das
> Intervall wurde von 1s auf das kürzeste zurückgesetzt?

Meistens ja. Mehr dazu im Datenblatt.

Auch: Lies dir ein Watchdog-Tutorial durch und initialisiere den 
Watchdog vor der main()-Routine. Sonst hast du das Problem irgendwann 
wieder, wenn du mal mehr RAM verwendest und die Initialisierung des RAMs 
lange dauert.

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.