Forum: Compiler & IDEs Watchdog mißbrauchen


von Mister mit Kanister (Gast)


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?

von johnny.m (Gast)


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.

von König Europas (Gast)


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.

von Peter D. (peda)


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

von Rahul, der Trollige (Gast)


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).

von Mister mit Kanister (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Mister mit Kanister (Gast)


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...

von Mister mit Kanister (Gast)


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!

von Peter D. (peda)


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

von Mister mit Kanister (Gast)


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 ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.