Hallo zusammen,
ich bin seit gestern daran zu verzweifeln meinen Watchdog in den
Interrupt Modus zu bringen. aktuell habe ich folgenden Code:
am Anfang des Programms:
1
if(MCUSR&_BV(WDRF)){
2
MCUSR&=~_BV(WDRF);WDTCSR|=(_BV(WDCE)|_BV(WDE));
3
WDTCSR=0x00;
4
}
direkt danach:
1
cli();
2
WDTCSR|=(1<<WDCE)|(1<<WDE);
3
WDTCSR=(1<<WDIE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);
4
//WDTCSR |= 0b01011111;
5
//WDTCSR |= 0b00010111;
6
//WDTCSR &= 0b11100111;
7
sei();
In der Routine selbst mache ich nichts außer einer Uart ausgabe.
ich habe im Debugger die einzelnen Bits verfolgt, und es wird nie die
Zeit eingestellt bzw das WDE Bit gelöscht! Im Debugging selber kann ich
händisch über die Oberfläche die Bits setzen und der Interrupt
funktioniert ohne Probleme. Habt ihr eine Idee woran es liegen könnte?
Das Fusebit WDTON ist nicht gesetzt und ich verwende einen ATmega2560.
AVR-Anfänger schrieb im Beitrag #4056700:
> WDTCSR |= (1<<WDCE)|(1<<WDE);> WDTCSR = (1<<WDIE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);
Was soll das auch? Du aktivierst den WDT in der ersten Zeile und löscht
ihn sofort in der zweiten Zeile!
AVR-Anfänger schrieb im Beitrag #4056700:
> Das Fusebit WDTON ist nicht gesetzt und ich verwende einen ATmega2560.
Du musst auch das WDTON-Fuse setzen soweit ich mich erinnere.
Mach mal bitte ne genauere Erklärung was du willst und was du hast.
Ingo Less schrieb:> AVR-Anfänger schrieb im Beitrag #4056700:>> WDTCSR |= (1<<WDCE)|(1<<WDE);>> WDTCSR = (1<<WDIE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);> Was soll das auch? Du aktivierst den WDT in der ersten Zeile und löscht> ihn sofort in der zweiten Zeile!>
das wird im Datenblatt so vorgeschrieben, um den Watchdog nicht
ausversehen zu konfigurieren. Ich habe es jedenfalls so verstanden....
> AVR-Anfänger schrieb im Beitrag #4056700:>> Das Fusebit WDTON ist nicht gesetzt und ich verwende einen ATmega2560.> Du musst auch das WDTON-Fuse setzen soweit ich mich erinnere.>
Mit dem WDTON Bit wird der Watchdog Hartdwaremäßig im Reset Modus
gehalten oder?
> Mach mal bitte ne genauere Erklärung was du willst und was du hast.
Ich möchte den Watchdog im Interruptmodus nutzen, um das Aufhängen des
Programmes zu verhindern, beispielsweise wenn ein Sensor nicht reagiert.
AVR-Anfänger schrieb im Beitrag #4058289:
> Ich möchte den Watchdog im Interruptmodus nutzen, um das Aufhängen des> Programmes zu verhindern
Wie denn genau? Mir scheint fast du steuerst auf eine falsche Lösung
drauf zu. Aber ohne eine genauere Beschreibung oder mal den Code kann
man dir nicht helfen. Ich habe nämlich immernoch nicht ganz begriffen
was du eigentlich machen willst.
AVR-Anfänger schrieb im Beitrag #4058289:
> das wird im Datenblatt so vorgeschrieben, um den Watchdog nicht> ausversehen zu konfigurieren. Ich habe es jedenfalls so verstanden....
WDE muß in beiden Schritten gesetzt sein. Nur WDCE ist einmal 1 und
einmal 0.
Oliver
Beispielsweise um die Kommunikation zwischen zwei Boards zu überwachen,
als Timeout quasi. Antwortet das 2. Board innerhalb einer bestimmten
Zeit nicht, soll der Watchdog auslösen.
ok soweit?
AVR-Anfänger schrieb im Beitrag #4058339:
> Antwortet das 2. Board innerhalb einer bestimmten> Zeit nicht
Dann setzt man eine Timeout-Handler auf, der von einem Timerinterrupt
getriggert wird.
AVR-Anfänger schrieb im Beitrag #4058452:
> aber ich würde trotzdem gerne den Watchdog> benutzen :/
Dann mußt Du da durch.
Ich wollte Dir nur die übliche Methode aufzeigen. Einen Timer hat man ja
eh oft laufen. Da ist es das einfachste, einen oder auch mehrere
Timeouts mit reinzuhängen. Und man muß sich nicht mit Timed-Access und
anderen Schnulli rumplagen und riskiert keinen versehentlichen Reset.
Vielleicht stehen ja in der wdt.h passende Macros.
AVR-Anfänger schrieb im Beitrag #4058350:
> @Oliver, eher so:
...
Eher so:
1
2
WDTCSR|=(1<<WDE)|(1<<WDCE);// WDE und WDCE setzen
3
WDTCSR=(1<<WDIE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);// WDIE aktiviert Interrupt, WDCE muß 0 sein
Mit WDE lag ich falsch, das muß nur gesetzt bleiben, wenn man auch den
WD-Reset aktivieren will. WDCE muß beim 2. Zugriff 0 sein.
Da du den Interrupt nutzen willst, muß auch WDIE gesetzt werden.
Oliver
AVR-Anfänger schrieb im Beitrag #4058339:
> Beispielsweise um die Kommunikation zwischen zwei Boards zu überwachen,> als Timeout quasi. Antwortet das 2. Board innerhalb einer bestimmten> Zeit nicht, soll der Watchdog auslösen.
Ich glaube das ist die ungeschickteste Möglichkeit ein Timeout zu
überwachen, ich würd es auch wie Peter machen. Das ist der richtige Weg,
zumal man so ein Timeout deutlich präziser einstellen kann als mit dem
doch recht groben Prescalern des WDT...
Aber, Oliver hat dir ja schon erzählt wie man den WDT einstellt, dann
man los!
Bei einigen älteren AVRs geht es auch einfacher. Mit dieser Methode
funktioniert es bei allen. Ergänzend zur wdt.h sind auch die längeren
Timeouts enthalten, die der Atmega8 und die anderen Altlasten nicht
kennen.
mfg.
@ Thomas Eckmann,
ich habe gerade versucht deinen Code einzubinden und auszuprobieren,
aber der Watchdog lässt sich immernoch nicht im Interrupt Modus
aktivieren...ich wird noch verrückt...
Eine Sequenz wie:
WDTCSR |= ...
WDTCSR = ...
ist grundsätzlich Unsinn.
Denn egal was Du in der ersten Zeile auch machst, in der zweiten Zeile
wird es überschrieben.
Wenn es schon zwei Zeilen sein müssen, dann aber
WDTCSR |= ...
WDTCSR |= ...
@Oliver: live im AVR
@ Amateur
Amateur schrieb:> Eine Sequenz wie:> WDTCSR |= ...> WDTCSR = ...> ist grundsätzlich Unsinn.>> Denn egal was Du in der ersten Zeile auch machst, in der zweiten Zeile> wird es überschrieben.>> Wenn es schon zwei Zeilen sein müssen, dann aber> WDTCSR |= ...> WDTCSR |= ...
so wird es aber im Datenblatt des AVR vorgezeigt(seite 66 ATmega2560) :/
AVR-Anfänger schrieb im Beitrag #4067849:
> also das Problem scheint der ATmega2560 gewesen zu sein
Na, dann beschwer dich mal bei Atmel darüber, daß die M2560er mit
defektem Watchdog ausliefern.
Oliver
Mit der Vermutung da etwas Ironie heraus zu lesen will ich hinzufügen,
dass das Board mit dem 2560 ein Bastelboard ist. Wer weiß wo der
schonmal einen Schaden genommen hat..
Hallo,
es liegt sicherlich nicht am Watchdog, sondern am Programm.
Nur selten habe ich ml einen AVR µC Pin zerstören können.
Das ist aber dann meine Schuld und ich konnte es nachvollziehen.
Ein AVR µC wurde bei einem Selbstbauseminar mal mit 9V versorgt und
hatte es überstanden, im Datenblatt ist zu lesen <7V an Vcc.
Die Inhalte aus den Atmel µC Datenblättern sind nicht immer einfach zu
lesen, da manche Sachverhalte durch weitere Zeile im Datenblatt ergänzt
bzw. eingschränkt werden.