- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: Watchdog richtig anwenden

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.05.2006
    Beiträge
    40

    Watchdog richtig anwenden

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    ich möchte mein Programm mit einem Watchdog überwachen. Also habe ich diesen über

    #pragma config WDT = ON
    #pragma config WDTPS = 128

    eingeschalten und den Postscaler auf 1:128 gesetzt. Das bedeutet doch, dass der WD nun 18ms*128 = 2,304s ausgelöst wird.
    Soweit so gut. Zu Beginn des Programms leuchtet während einer Init-Routine eine rote LED auf. Während der Init ist eine 10s Warteschleife, also muss die LED am Start mindestens 10s leuchten. In der Schleife lösche ich mit

    _asm CLRWDT _endasm

    immer mal wieder den WD. Die LED leuchtet auch nie auf, also gehe ich davon aus, dass kein Reset ausgelöst wurde.

    Jetzt das Problem:

    Wenn ich den WD wie oben beschrieben implementiere, dann liefern mir die Rechroutinen falsche Ergebnisse. Ohne funktioniert's, mit nicht. Jetzt ist meine Vermutung, dass der WD-Reset doch irgendwo ausgelöst wird und der PIC dort weitermacht, wo er aufgehört hat und zwischenzeitlich irgendwas am Stack geändert hat. Oder aber umgekehrt: er startet von vorn und im Stack stehen noch alte Variablen. Aber das kann ja auch nicht sein, da ich die Variablen immer mit nem Wert initialisiere...
    Also kurz: Ich habe keine Ahnung, wieso der mit aktivierten WD auf einmal falsch rechnet... Weiss jemand Rat bei diesem Problem?

    Grüsse
    SteffenJ

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    21.11.2006
    Ort
    Hessen
    Beiträge
    35
    ich kenne mich mit deinem pic so gut wie nicht aus, aber erstell doch mal sicherheitskopie von deinem programm und lass es mal den WDT zu löschen.

    ich meine, bevor du keine antwort bekommst, will ich dir wenigstens sagen, wie ich das zu lösen versuchen würde.

    mfg

    soeren

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    17.09.2006
    Ort
    Essen
    Alter
    62
    Beiträge
    83
    Wie kommst du auf 18 ms ? Bei 4 MHz sind 18 ms die Zeit die bei Vorteiler=128 rauskommt, der WD-Interupt wird also viel öfter ausgelöst wie du berechnet hast.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    29.05.2006
    Beiträge
    40
    @Mr. T: Was ist das Ziel, wenn ich den WDT nicht lösche? Also bringt mir das etwas? Kann Deinen Gedanken momentan nicht folgen.

    @r.moshage: Der Watchdog wird unabhängig von der externen Frequenz betrieben. Laut Handbuch wird der typischerweise alle 18ms ausgelöst.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.08.2004
    Ort
    Unterschleissheim
    Beiträge
    325
    Hallo Steffen

    hast du schon versucht den Code mit MPLAB-SIM zu testen ? MPLB erkennt auch, wenn du den Watchdog eingeschaltet hast und zeigt dir das an, wenn der Watchdog aktiv wird.

    gerhard

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    Was ist das Ziel, wenn ich den WDT nicht lösche? Also bringt mir das etwas? Kann Deinen Gedanken momentan nicht folgen.
    Das Zeil des Watchdogs ist, den µC nach Ablauf einer bestimmten Zeit zu Reseten und so in einen vordefinierten Zustand (sprich Reset, Sprung zur Adresse 0x00, etc.) zu bringen, wenn dieser sich wegen extrener (odr interner) Einflüsse in einer Unendlichschleife aufgehängt hat.

    Der Watchdog wird unabhängig von der externen Frequenz betrieben. Laut Handbuch wird der typischerweise alle 18ms ausgelöst.
    Schon richtig und du kannst maximal ~2,3s erreichen, wenn du den Prescale auf 128 stellst. Aber der Watchdog teilt sich diesen mit T0. Schau mal, in dem Simulator von MPLab oder der Bit 3 (PSA) des OPTION_REG Registers auf 1 gesetzt ist. Weil wenn es nicht ist, dann hat der Timer0 den Prescaler und der Watchdog läuft mit einem 1:1 (und du hast alle 18ms einen overflow und ein Reset).
    En Plus kannst du noch den Bit TO des STATUS Register beim Start des Programms auf einen Pin schreiben lassen. Wenn dann dort ein LED leuchtet, hat sich der PIC gerae mit einem Watchdog TimeOut resetet.

    Ansonsten, schau mal, ob du nicht dein Programm auch ohne einen Watchdog betreiben kannst, weil eigentlich hab ich bisher bei allen meinen Projekten nur ein einziges Mal den Watchdog gebraucht und zwar für einen Low-Power Uhr, bei dem dieser den Chip aus dem SLEEP geholt hatte.
    MfG
    Mobius

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    29.05.2006
    Beiträge
    40
    Hallo Mobius,

    das PSA ist nicht gesetzt, der Timer0 hat also den Prescaler. Diesen Timer benutze ich für eine interne Uhr.

    Heisst das, wenn der Timer0 den Prescaler benutzt, dass ich den Watchdog nicht mehr verzögern kann, weil der Prescaler entweder für den Watchdog oder den Timer0 benutzt wird?

    Den Prescaler habe ich auf 1:256 für Timer0 gesetzt.

    Grüsse
    SteffenJ

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    Heisst das, wenn der Timer0 den Prescaler benutzt, dass ich den Watchdog nicht mehr verzögern kann, weil der Prescaler entweder für den Watchdog oder den Timer0 benutzt wird?
    Ganz genau, der Timer0 und der Watchdog teilen sich den Prescaler. Steht im Datenblatt, bei dem Register OPTION_REG, wird, glaub ich, auch bei dem Timer0-Kapitel angesprochen.

    MfG
    Mobius

Berechtigungen

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

LiFePO4 Speicher Test