Atmega328P Firmware hängt nach Watchdog Reset

OP #7363747
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

#7363772
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...

#7363776
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren