www.mikrocontroller.net

Forum: Compiler & IDEs Watchdog mißbrauchen


Autor: Mister mit Kanister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen schönen guten Morgen!

ich programmiere mit ATmega16, ich will den Watchdog nicht für Reset 
verwenden, sondern als ganz normalen Timeout mißbrauchen. Kann man die 
Funktion von "Reset" diabeln und dafür z.B. eine Funktion aufrufen 
lassen, wenn der Watchdog losgeht?

aus der wdt.h hier die ASM Funktion von dem _wdt_write(timeout)
(= wdt_enable(timeout) )


#define _wdt_write(value)   \
    _asm__ __volatile_ (  \
        "in _tmp_reg_,__SREG__" "\n\t"    \
        "cli" "\n\t"    \
        "wdr" "\n\t"    \
        "out %0,%1" "\n\t"  \
        "out _SREG_,__tmp_reg__" "\n\t"   \
        "out %0,%2" \
        : /* no outputs */  \
        : "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \
        "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)),   \
        "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \
            _BV(WDE) | (value & 0x07)) ) \
        : "r0"  \
    )


Ich kenne mich mit ASM nicht gut aus, es müsste ja ein Befehl ähnlich 
"JMP 0" oder so kommen, kann man den nicht durch was anderes ersetzen?
Oder ist die Reset - Funktion per Hardware festgelegt?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hat damit überhaupt nix zu tun. Der Reset nach einem 
Watchdog-Timeout ist eine Hardware-Angelegenheit. Da hat man als 
Programmierer keine Eingriffsmöglichkeit. Die Funktion oben konfiguriert 
lediglich den WDT.

Autor: König Europas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, aber man kann beim Startup abfragen, ob ein WDT den Reset ausgelöst 
hat. Bei Atmel kenne ich mich da nicht aus, beim PIC gehts.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei neueren AVRs kann man auch einen Watchdoginterrupt aufsetzen und den 
Watchdog so konfigurieren, daß beim ersten Timeout der Interrupt 
ausgeführt wird und erst beim nächsten Timeout der harte Reset.


Allerdings hat doch der Mega16 schon haufenweise Timer (T0, T1, T2), da 
muß man doch überhaupt nicht den Watchdog mißbrauchen.


Peter

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Bei Atmel kenne ich mich da nicht aus, beim PIC gehts.

Geht auch beim AVR (Atmel stellt auch noch andere Controller her...).
Der Watchdog sollte aber eher nur im Notfall für sowas benutzt werden 
(Ich schliesse mich da mal wieder Peter an).

Autor: Mister mit Kanister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK Danke, dachte nur wenns ginge, könnte man sehr einfach ein Timeout 
realisieren mit den vom WDT vordefinierten Werten. Ohne große 
Registerbeschreiberei.

Trotzdem THX

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, so viel mehr Arbeit ist doch der Timeout mit einem normalen
Timer auch nicht.  ,,Mit den vordefinierten Werten'' musst du dort
auch lediglich die CSxx-Bits im TCCRxB-Register setzen sowie das
TOIEx-Bit im TIMSK oder TIMSKn.  Eine ISR hättest du ja für die
Watchdog-Variante ohnehin benötigt.

Autor: Mister mit Kanister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenne ich den Timer2 nehm (Timer0 und Timer1 sind belegt) kann ich max 
mit Vorteiler 1024 und 16Mhz CPU Takt ein Timerüberlauf nach 16ms 
produzieren, das ist viel zu wenig, ich brauche was im Bereich von ~sec.

Für den Watchdog eine ISR? Wußte nicht dass der eine hat...

Autor: Mister mit Kanister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag von mir selbst:

Mit einem 32kHz Uhrquarz extern an T2 kann ich eine Überlaufzeit von max 
8s erzeugen, so könnte es gehen, allerdings dann nur mit 
Hardwareeingriff!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hindert Dich denn daran, im Interrupt noch ne Variable zu zählen, 
bis die Zeit rum ist ?


z.B. alle 10ms nen Interrupt und dann von 100 runterzählen, schon hast 
du eine Sekunde.

Mit 8 Bytes kannst Du auch Giga-Jahre zählen.


Peter

Autor: Mister mit Kanister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Öhm ja, guter Tip! So könnte man das realisiern...

Resultierend der frühen Tageszeit waren meiner geistigen Kreativität 
enge Grenzen gesetzt...

Thx ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.