hi, ich hab nen at90can. ich habe mir bislang immer einige werte meines programmes über die uart-schnittstelle am bildschirm ausgeben lassen. seitdem ich einen watchdog im programm hinzugefügt habe, resetet sich der controller, sobald ich den ersten wert über die serielle schnittstelle ausgebe. ich mein, ich hätte schonmal so ein ähnliches problem hier im forum gesehen, nur leider finde ich den beitrag nicht mehr. der watchdog scheint sich nicht mit der seriellen ausgabe vertragen. weiß jem. rat? gruß andreas
wahrscheinlich betreibst du die serielle Schnittstelle im polling-Betrieb. Während einer printf()-Ausgabe kommt das Programm nicht zum Hauptprogramm/Watchdogreset zurück, entsprechend schlägt er Alarm. Entweder die watchdog-Zeit grösser wählen, als die längste Ausgabe dauert. Oder einen WDR-Befehl in die low-level-Routine putchar() reinbasteln oder die Schnittstelle im Interrupt betreiben (empfiehlt sich eigentlich sowieso fast immer).
mmmh, den prescaler hatte ich schon auf eine hohe zeit gesetzt. daran dürfte es eigentlich nicht liegen, es sei denn ich hab das mit dem beschreiben des registers nicht richtig gemacht. das ausschalten des wdr ist ja auch etwas aufwändiger. void wdt_init(void) { WDTCR |=(1<<WDE); WDTCR |=(1<<WDP2)|(1<<WDP1); //1s } ist das so ok?
Deine wdt_init macht nicht, was Du erwartest. Probier mal so: void wdt_init(void) { WDTCR |= (1<<WDCE)|(1<<WDE); WDTCR |= (1<<WDE)|(1<<WDP2)|(1<<WDP1); //1s }
hat leider nix gebracht:( hier meine drei wdt-funktionen: void wdt_init(void) { WDTCR |= (1<<WDCE)|(1<<WDE); WDTCR |= (1<<WDE)|(1<<WDP2)|(1<<WDP1); //1s } void wdt_reset(void) { asm volatile ("wdr"); } void wd_off(void) { /* Write logical one to WDCE and WDE */ WDTCR = (1<<WDCE) | (1<<WDE); /* Turn off WDT */ WDTCR = 0x00; } wdt_init() ruf ich innerhalb der main() noch for der hauptschleife auf, wdt_reset() am ende der hauptschleife.
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.