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
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.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.