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