mikrocontroller.net

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


Autor: Andreas R. (moron)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Andreas R. (moron)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: Andreas R. (moron)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.