mikrocontroller.net

Forum: Compiler & IDEs Watchdog Reset Problem -- sofort, ohne entspr. Delay


Autor: Jens-Erwin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Der Watchdog (ATMega8) funktioniert nicht richtig. Ich habe diesen auf 
2s eingestellt. Aber er geht sofort auf Reset.
Ich benutze einen Interrupt beim Timer.
Habe ein Testprogramm in C und Assembler geschrieben -- Assembler geht 
... C nicht

Bitte um Hilfe

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AFAIK musst du den Watchdog VOR dem Einschalten erstmal zurücksetzen.

MFG
Falk

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja kann ich machen

etwa so:

asm ("wdr")
WDTCR |= (1<<WDE) |(1<<WDCE);
WDTCR = 0;

trotzdem, die 2,1s werden nicht gemacht, sondern es geht sofort in den 
Reset, es ist so, als würde ich nur ein paar Zeilen Zeit haben, um dann 
wieder ein wdr setzen zu müssen.

Ich habe auch keinen Beispielcode in C hier gefunden. Gibt es da einen?

Autor: Jojo S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich habe auch keinen Beispielcode in C hier gefunden. Gibt es da einen?

ja, es gibt einen header in den avr includes für die Watchdog 
Funktionen. Es dürfte besser sein die zu benutzen weil für mehrere Typen 
portabel.
#include <avr/wdt.h>

wdt_enable(WDTO_2S);

...

wdt_reset();

aber vielleicht liegt das Problem auch woanders und es wird ein anderer 
Interrupt ausgelöst der keine ISR hat oder ist ein falsches Device 
eingestellt und die ISR an der falschen Stelle? Dann würde ja der 
default Reset ausgelöst.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Programm nach dem Start das MCUCSR/MCUSR auslesen, irgendwie 
anzeigen, dann löschen. Damit erfährt man, was den Reset tatsächlich 
ausgelöst hat.

Man kann bei AVRs den Watchdog per Fuse einschalten. Das kann auch 
solche Effekte haben. Vor allem wenn man erst einmal 3s wartet.

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke an alle,

ich habe es ja mit Assembler ausprobiert, geht alles --- aber nicht mit 
C-Code

Es funktioniert mit der wdt.h und den entsprechenden Befehlen ... wie 
Johannes geschrieben hat .. klasse!!

Scheinbar ist der C-Code zu langsam -- hängt vielleicht mit den 4 
Taktzyklen zusammen

Der Assmbler-Code in der wdr.h ist einleuchtend ....

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens-Erwin wrote:

WDTCR = (1<<WDE) |(1<<WDCE);  //Watchdog enabled
WDTCR |= (1<<WDP0) | (1<<WDP1) | (1<<WDP2) ;            //Dauer

> Scheinbar ist der C-Code zu langsam -- hängt vielleicht mit den 4
> Taktzyklen zusammen

Nö, er ist schlichtweg falsch!

WDCE muß im 2.Zugriff 0 sein, das geht nicht mit nem |=.

Mach 2 Zuweisungen mit den richtigen Werten, dann  klappts auch in C.


Peter

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich den Inline-Assembler in der wdr.h in C "übersetze", 
funktioniert es trotzdem nicht  --- komisch ??? Der Reset wird 
ausgelöst, aber die Zeit lässt sich nicht eingeben ...



asm ("cli");
asm ("wdr");

WDTCR = (1<<WDE) |(1<<WDCE);  //Watchdog enabled

asm ("sei");                        //  I-Flag in SREG, wenn gesetzt

WDTCR = (1<<WDE) | 7 ;


//FUNKTIONIERT NICHT !!






#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"  \
    )

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Optimierung einschalten -Os


Peter

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.