Forum: Mikrocontroller und Digitale Elektronik Watchdog Reset


von Bernd H. (bernd79)


Lesenswert?

Atmega324a AVR Studio

Hallo !

Wollte einen Watchdog einführen, der mein System reseten soll...läuft 
aber nicht so ganz.

Welchen Befehl muss man geben bzw. welches Flag muss man löschen im 
laufenden Programm, um den WTD wieder zurückzusetzen??

Hab mir ein kleines Programm geschrieben, um den WTD zu testen (ohne WDT 
reset) aber es scheint als ob der WTD immer auslöst und nicht erst nach 
8s?


Wenn ich den WDTON fuse verwende, muss ich den WDE und WDIE nicht 
setzten?!
Des weiteren habe ich Tuttrial gelesen, wenn der WDT mal ausgelöst hat, 
muss man ihn komplett neu setzten/konfigurieren ??!


#include <avr/wdt.h>

int main (void)

{


WDTCSR |= 0x01;

//WDE = 1 & WDIE  = 0 durch WDTON
// WDTON = 1 & WDP = 1 ……WDT Überlauf nach 8s


while   ( (PINA & 0xF0) != 0xF0 )
{
PORTA &= 0xF2;
PORTA |= 0x02;
}

while(1)
{
PORTA &= 0xF1;
PORTA |= 0x01;
}
}

von Cyblord -. (cyblord)


Lesenswert?

Ein Blick in die avr-libc Doku hätte dir beim wdt.h Header (den du ja 
sogar nutzt) folgenden Befehl gezeigt:

#define   wdt_reset()   _asm__ __volatile_ ("wdr")

Und ein Blick ins Datenblatt hätte dir gesagt dass es kein Register oder 
Flag gibt, sondern der WDR Befehl ein eigener Assembler Befehl ist.
Im selben Datenblatt stehen auch einige weitere Tipps zum WDT. Auch was 
die Fuses und die anderen Bits so machen und wann man welches setzen 
soll. Seite 59 steht alles was du wissen musst. Davor gibts sogar 
Codebeispiele in C und ASM. Was willst du denn mehr?

Aber wer liest schon Datenblätter oder Dokus.

gruß cyblord

von Bernd H. (bernd79)


Lesenswert?

cyblord ---- schrieb:
> Ein Blick in die avr-libc Doku hätte dir beim wdt.h Header (den du ja
> sogar nutzt) folgenden Befehl gezeigt:
>
> #define   wdt_reset()   _asm__ __volatile_ ("wdr")
>
> Und ein Blick ins Datenblatt hätte dir gesagt dass es kein Register oder
> Flag gibt, sondern der WDR Befehl ein eigener Assembler Befehl ist.
> Im selben Datenblatt stehen auch einige weitere Tipps zum WDT. Auch was
> die Fuses und die anderen Bits so machen und wann man welches setzen
> soll. Seite 59 steht alles was du wissen musst. Davor gibts sogar
> Codebeispiele in C und ASM. Was willst du denn mehr?
>
> Aber wer liest schon Datenblätter oder Dokus.
>
> gruß cyblord

Wie gesagt habe es noch nicht ganz verstanden, was dort in DB steht. Da 
steht aber auch, das der erst nach 8s überläuft... dem ist aber nicht 
der Fall. Das würde ich auch gerne wissen.

Auch ob man den WTD komplett neu setzten muss...ist nicht ganz klar. 
Auch nach eine Hardware reset?

Aber danke erstmal für die erste Hilfe :)

von Cyblord -. (cyblord)


Lesenswert?

Bernd H. schrieb:

> Wie gesagt habe es noch nicht ganz verstanden, was dort in DB steht. Da
> steht aber auch, das der erst nach 8s überläuft... dem ist aber nicht
> der Fall. Das würde ich auch gerne wissen.
Hast du ein anderes Datenblatt als ich? Da steht das sicher nicht. Da 
steht dass der WDT einen eigenen Prescaler hat, der darüber entscheidet 
wann der WDT einen Reset ausführt. Daher auch die Makros in der C lib 
(500ms, 1s, 2s usw.). Und auf Seite 60 im Datenblatt steht die Tabelle 
welche dir sagt wie du den Prescaler setzen musst um bestimmte Reset 
Zeiten zu erhalten. Was daran jetzt unklar sein soll musst du einfach 
konkret sagen.

> Auch ob man den WTD komplett neu setzten muss...ist nicht ganz klar.
> Auch nach eine Hardware reset?

Du stellst den Watchdogtimer am Anfang deines Programm korrekt ein, dann 
wird diese Einstellung auch nach jeden Reset ausgeführt.
Wie man den Einstellt musst du unbedingt nachlesen weil der WDT 
Sicherheitsfunktionen hat wenn man seine Einstellungen ändern will. Aber 
da gibts a.) Beispielcode im Datenblatt und b.) eben die WDT.h die das 
auch kann.
Oder dukannst du auch die WDTON Fuse setzen dies zwingt den WDT dass er 
in jedem Fall läuft und einen System Reset ausführt (und keinen 
Interrupt).

gruß cyblord

von Bernd H. (bernd79)


Lesenswert?

Bernd H. schrieb:
> Atmega324a AVR Studio
>
> Hallo !
>
> Wollte einen Watchdog einführen, der mein System reseten soll...läuft
> aber nicht so ganz.
>
> Welchen Befehl muss man geben bzw. welches Flag muss man löschen im
> laufenden Programm, um den WTD wieder zurückzusetzen??
>
> Hab mir ein kleines Programm geschrieben, um den WTD zu testen (ohne WDT
> reset) aber es scheint als ob der WTD immer auslöst und nicht erst nach
> 8s?
>
> #include <avr/wdt.h>
>
> int main (void)
>
> {
>
>
> WDTCSR |= 0x01;
>
> //WDE = 1 & WDIE  = 0 durch WDTON
> // WDTON = 1 & WDP = 1 ……WDT Überlauf nach 8s
>
>
> while   ( (PINA & 0xF0) != 0xF0 )
> {
> PORTA &= 0xF2;
> PORTA |= 0x02;
> }
>
> while(1)
> {
> PORTA &= 0xF1;
> PORTA |= 0x01;
> }
> }


Sorry hatte das falsche Beispeil rein kopiert:

WDTCSR |= 0x21; // WDP3 = 1 & WDP0 =1
WDTCSR &= 0xF9; // WDP2 = 0 & WPD1 = 0

Überlauf nach 8s geht aber noch immer nicht..... liegt eher im ms 
Bereich

von Cyblord -. (cyblord)


Lesenswert?

Bernd H. schrieb:

> Sorry hatte das falsche Beispeil rein kopiert:
>
> WDTCSR |= 0x21; // WDP3 = 1 & WDP0 =1
> WDTCSR &= 0xF9; // WDP2 = 0 & WPD1 = 0
>
> Überlauf nach 8s geht aber noch immer nicht..... liegt eher im ms
> Bereich

WDTCSR |= (1<<WDP3) | (1<<WDP0);

Probiers doch mal Übersichtlich anstatt unleserlich.

Außerdem hast du dir durchgelesen was man tun muss um den Prescaler zu 
setzen? Wie gesagt, der ist geschützt und kann nicht einfach so 
beschrieben werden. Aber es gibt sogar Beispielcode im Datenblatt. In C. 
lies doch mal.

Oder wenn schon, dann nimm doch wenigstens die fertigen Makros aus der 
Lib:

wdt_enable ( WDTO_8s)


gruß cyblord

von Thomas E. (thomase)


Lesenswert?

Bernd H. schrieb:
> WDTCSR |= 0x21; // WDP3 = 1 & WDP0 =1
> WDTCSR &= 0xF9; // WDP2 = 0 & WPD1 = 0
So geht das nicht.
Das Einstellen des Prescalers ist eine Timed Sequence. Wenn man die Bits 
da einfach so draufschreibt, passiert gar nichts.
Benutze wdt_enable(value) oder guck dir im Datenblatt an, wie das genau 
gemacht wird.

mfg.

von Cyblord -. (cyblord)


Lesenswert?

Hab ich vor 3 Posts schon angemerkt. Aber es ist wie wenn man gegen eine 
Wand redet.

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.