- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 13

Thema: Watchdog Interrupt?

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #8
    Benutzer Stammmitglied
    Registriert seit
    05.01.2010
    Beiträge
    35
    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.
    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 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.
    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
    Geändert von Dunuin (27.03.2011 um 15:04 Uhr) Grund: Lösung hinzugefügt

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress