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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.