Hi,
ich würde den Watchdog gerne nutzen um meinen µC (Mega88PA) aus dem
Standby aufzuwecken. Das funktioniert leider nur teilweise. Der Watchdog
soll nur einen Interrupt auslösen, keinen Reset. Auslösen soll er nach
einer Sekunde.
Passieren tut jetzt folgendes:
Der Controller geht in den Standby und wacht schon wieder nach 16ms
(Default-Settings) auf. Laut Datenblatt muss der Zugriff auf das
Register innerhalb von 4 Taktzyklen erfolgen, nachdem es freigeschaltet
wurde mit dem WDCE-Bit. Ich hab schon etwas gesucht, aber eine richtige
Lösung hatte niemand. Ich hab leider nur sehr wenig Ahnung von
Assembler, ich geh aber davon aus (wenn ich das .lss-File anschaue) das
der Compiler zu viele "Schritte" draus macht.
Folgenden Code habe ich aktuell:
Wie bekomm ich das also jetzt so hin, das das funktioniert?
Ich habe schon versucht die Hex-Werte direkt zu schreiben, dann Wacht
der µC aber gar nicht mehr auf.
Die wdt.h habe ich schon genutzt, aber keine Möglichkeit gefunden
einzustellen, das nur die ISR aufgerufen wird. Weiß jemand, wie ich das
lösen kann?
Vielen dank schon mal!
Rat weiß das Datenblatt. Das solltest du nochmal anschauen, incl. des
dort gezeigten Beispielcodes.
Dazu dann die Optimierung beim kompilieren einschalten.
Oliver
Hi,
Optimierung ist auf -Os (Optimize for size).
Code aus dem DB habe ich probiert, gerade extra nochmal. Nur das WDE
habe ich zu einem WDIE gemacht, da ich ja einen Interrupt und keinen
Reset haben will (Siehe DB Seite 54, Table 11-1). Geht auch nicht. Der
µC geht nur für 16ms schlafen.
Hi Uwe,
mit 0x24 setz ich WDP2 und WDP3 auf 1 - diese Einstellung gibt es laut
Datenblatt nicht.
Ja, ich weiß das es 16ms sind wenn alles auf 0 steht. Aber ich will ja
eine Sekunde erreichen und das funktioniert nicht.
Stimmt ist dann aber trotzdem nicht :
> WDTCSR |= 0x70;
sondern
WDTCSR |= 0x06;
mit
> WDTCSR |= 0x70;
setzt du nur WDIF auf 1 und die Prtescaler bleiben auf 0 also 16ms bis
zu Watchdog Interupt.
WDTCSR = (1<<WDIE)|(1<<WDP2)|(1<<WDP1); //128k, ca. 0,97s
Und so geht es. Man muss also das WDE Bit mit setzen, bevor man
Änderungen am Register vornehmen kann. Das Datenblatt ist da sehr wage
zu interpretieren. (Meiner Meinung nach)
Danke an alle helfenden!
Martin schrieb:> Das Datenblatt ist da sehr wage> zu interpretieren. (Meiner Meinung nach)
Na ja, selbst wenn man den Text als vage mißversteht, steht das ganz
genauso in dem Codebeispiel. Nocht konkreter geht das eigentlich gar
nicht.
Oliver
Jetzt im nachhinein ja - aber es wird halt als Reset Programmiert im
Beispiel, und das WDE Bit ist definitiv das Bit um die Reset-Funktion zu
aktivieren (siehe Tabelle 11-1). Daher ergab das für mich keinen Sinn,
das mit rein zu schreiben.