Forum: Mikrocontroller und Digitale Elektronik Watchdog-Reset Problem


von Bernhardt G. (Gast)


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

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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

von Thomas E. (thomase)


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.

von Karl H. (kbuchegg)


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.

von Thomas E. (thomase)


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.

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.