Forum: Mikrocontroller und Digitale Elektronik watchdog löst aus durch uart_senden


von Andreas R. (moron)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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).

von Andreas R. (moron)


Lesenswert?

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?

von Johannes A. (Gast)


Lesenswert?

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
}

von Andreas R. (moron)


Lesenswert?

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