Watchdog-Reset Problem

Gast #2848233
Lesenswert?
• ▲
▼
Was mache ich falsch?

Ich lasse mein Programm  absichtlich den Watchdog verhungern
(Watchdog wird sonst nicht im Programm verwendet):

if(strstr (string,"reboot") != 0) //string received
{  cli();
  wdt_enable (WDTO_2S);
  /* Wait for the watchdog to bite */
while (1);
}//end if reboot


Wenn dann den Mikrocontroller wieder neu startet bekomme ich ein 
Dauerreset, ob wohl ich sofort am Anfang meines Programmes den Watdog 
deaktiviere bzw. zurücksetzte.

int main(void)
{

wdt_disable();
wdt_reset();
init();      //call of INIT

........


Was mache ich grundlegend falsch????
Danke für eure Mühe!

Gruß
Bernhardt
#2848241
Lesenswert?
• ▲
▼
Bernhardt G. schrieb:

> Was mache ich grundlegend falsch????

Das 'Hochfahren' deines C-Programmes dauert zu lange.
Bevor dein main() die Kontrolle kriegt, passieren ja schon eine ganze 
Menge andere Sachen und in Summe dauert das dann eben zu lange.

Es gibt aber eine Möglichkeit, wie man in diese Bootsequenz eingreifen 
kann und früher den Schuh in die Tür bekommt.
Das Abschalten des Watchdogs muss in einer speziellen Funktion erfolgen, 
die von der Bootsequenz aufgerufen wird. Ich weiß aber nicht auswendig, 
wie die heissen muss. Es müsste aber ein paar Forenbeiträge dazu geben.
#2848243
Lesenswert?
• ▲
▼
Karl Heinz Buchegger schrieb:
> Bernhardt G. schrieb:
>
>> Was mache ich grundlegend falsch????
>
> Das 'Hochfahren' deines C-Programmes dauert zu lange.
> Bevor dein main() die Kontrolle kriegt, passieren ja schon eine ganze
> Menge andere Sachen und in Summe dauert das dann eben zu lange.
>
> Es gibt aber eine Möglichkeit, wie man in diese Bootsequenz eingreifen
> kann und früher den Schuh in die Tür bekommt.
> Das Abschalten des Watchdogs muss in einer speziellen Funktion erfolgen,
> die von der Bootsequenz aufgerufen wird. Ich weiß aber nicht auswendig,
> wie die heissen muss. Es müsste aber ein paar Forenbeiträge dazu geben.

Ah. Hier in der AVR-Libc Doku findet sich auch was dazu
http://avr-libc.sourcearchive.com/documentation/1:1.6.8-2/group__avr__watchdog.html
#2848288
Lesenswert?
• ▲
▼
Bernhardt G. schrieb:
> wdt_enable (WDTO_2S);
Schaltest du ihn nur hiermit ein oder ist die Fuse gesetzt?
Bei gesetzter Fuse ist ein wdt_disable() unwirksam.

Karl Heinz Buchegger schrieb:
> Das 'Hochfahren' deines C-Programmes dauert zu lange.
Habe ich noch nicht beobachtet, wenn das der erste Befehl in main ist:
>>if(WDTCSR & (1 << WDE)) wdt_enable(WDTO_8S);
Bei gesetzter Fuse, egal mit welcher Taktkonfiguration.

mfg.
#2848296
Lesenswert?
• ▲
▼
Thomas Eckmann schrieb:

> Habe ich noch nicht beobachtet, wenn das der erste Befehl in main ist:

Das hängt auch davon ab, was beim Hochfahren alles passiert. Sind da 
viele Variablen zu initialisieren? Müssen haufenweise Strings vom Flash 
in den SRAM verfrachtet werden? Je nach Programm kann da schon einiges 
zusammenkommen.

Aber ich denke du hast recht. Der entscheidende Punkt dürfte das 
Zurücksetzen des Watchdog Reset Flags in MCUSR sein.
#2848340
Lesenswert?
• ▲
▼
Karl Heinz Buchegger schrieb:
> Das hängt auch davon ab, was beim Hochfahren alles passiert.
Ich benutze das so in meinem Bootloader. Da werden nur 3 Arrays global 
initialisiert. Alle Variablen stehen lokal in der main und sind danach 
erst dran.
Allerdings bekomme ich den Watchdog auch bei nicht gesetzter 
BOOTRST-Fuse eingefangen, obwohl vorher noch 15K FFs durchlaufen werden 
müssen.
Atmega168a
BOOTRST aus
WDTON ein
CLKDIV8 ein
8MHz intern, Setuptime + 65ms

langsamer geht's kaum noch.

mfg.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.