Moin, ich mal wieder.
Jetzt stehe ich bei einem neuen Projekt wieder vor dem gleichen Problem, dass ich nicht weiß, wie ich unter Bascom den Interrupt des WDT nutzen soll.
Diesmal komme ich aber nicht drum herum, da ich im Energiespar-Modus die Zeit mitzählen muss und das höchstens über Timer2 gehen würde, der den uC aber zu oft aufwecken würde, dass die Batterie zu schnell leer geht.
Bascom Version ist 2.0.4.0 und ich nutze einen Atmega48V.
Also die Idee war, dass ich den WDT im "Hybrid-Modus" nutze, dass der also alle 8 Sekunden den uC aus dem Powerdown-Modus aufweckt und in der Interruptroutine die Byte-Variable "Zeit" um 1 erhöht, aber trotzdem noch den uC resettet, wenn sich dieser aufhängt. Wird leider alles nicht direkt von Bascom unterstützt, aber das Datenblatt meint dazu:
Bit 6 - WDIE: Watchdog Interrupt Enable
When this bit is written to one and the I-bit in the Status Register is set, the Watchdog Interrupt is
enabled. If WDE is cleared in combination with this setting, the Watchdog Timer is in Interrupt
Mode, and the corresponding interrupt is executed if time-out in the Watchdog Timer occurs.
If WDE is set, the Watchdog Timer is in Interrupt and System Reset Mode. The first time-out in
the Watchdog Timer will set WDIF. Executing the corresponding interrupt vector will clear WDIE
and WDIF automatically by hardware (the Watchdog goes to System Reset Mode). This is useful
for keeping the Watchdog Timer security while using the interrupt. To stay in Interrupt and
System Reset Mode, WDIE must be set after each interrupt. This should however not be done
within the interrupt service routine itself, as this might compromise the safety-function of the
Watchdog System Reset mode. If the interrupt is not executed before the next time-out, a System
Reset will be applied.Das WDCE bit, wo man 4 Takte schnell sein muss, scheint ja nur für die 4 Prescalerbits und WDE gebraucht zu werden, was den WDT in den Resetmodus setzt.Bit 4 - WDCE: Watchdog Change Enable
This bit is used in timed sequences for changing WDE and prescaler bits. To clear the WDE bit,
and/or change the prescaler bits, WDCE must be set.
Once written to one, hardware will clear WDCE after four clock cycles.
Das sollte dann ja nicht das Problem sein, wenn man mit "Config Watchdog = 8192" den WDT einstellt, da der dann ja den richtigen Prescaler hat und im Reset-Modus arbeitet.
Aber was muss ich jetzt genau in Bascom machen, damit der WDT auch parallel als Interrupt arbeitet?
Direkt nach dem "Config Watchdog" nur noch per "Wdtcsr.6 = 1" WDIE auf 1 setzen und auch immer, wenn der WDT-Interrupt ausgelöst wird?
Und dann weiß ich immer noch nicht, was ich in Bascom machen muss, damit der WDT eine Interruptroutine auslöst, die dann meine Zeit-Variable hochzählt eine Flag-Variable setzt, damit im Hauptprogramm dann wieder WDIE auf 1 gesetzt wird.
Kann mir da jemand helfen?
Edit:
Falls jemand an der Lösung interessiert ist, so ging es:
Code:$regfile = "m48def.dat" 'ATmega48V-10AU TQFP $crystal = 1000000 '1 MHZ Dim Zeit As Byte 'Wird alle 8 Sekunden um 1 erhöht Dim Wdtflag As Byte 'Wird alle 8 Sek auf 1 gesetzt, zum anzeigen, dass die Watchdogtimer-ISR ausgelöst wurde und das WDIE Bit im WDTCSR Register wieder auf 1 gesetzt werden muss Enable Interrupts Config Watchdog = 8192 'Watchdog auf Resetmodus mit 8sek Zeit einstellen Wdtcsr.wdie = 1 'WDIE Bit auf 1 setzen, damit beim WDT-Timeout ein Interrupt ausgeführt wird und kein Reset Start Watchdog On Wdt Isr_wdt Wdtflag = 0 Zeit = 0 Do If Wdtflag = 1 Then Reset Watchdog Wdtcsr.wdie = 1 Wdtflag = 0 End If Loop 'Diese Interruptroutine wird beim Timeout vom Watchdogtimer ausgelöst und dient ' der Zeitmessung und dem Resetten des WDTs Isr_wdt: Wdtflag = 1 Incr Zeit Return
Lesezeichen