mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Watchdog Interrupt ATtiny13


Autor: Frank Schlaefendorf (Firma: HSCS) (linuxerr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

hier mein erster beitrag und eine frage, die mich im moment extrem 
beschäftigt, bis hin zum wahnsinn.

1. ich möchte den watchdog im ATtiny13 im interrupt modus betreiben. ich 
setze in der initialisierung folgenden code ein

wdr
; WDCE=1, WDE=1
ldi r16,0b00011000
out WDTCR,r16
; WDCE=0, Interrupt=enabled, WDE=0, set prescaler
ldi r16,0b01000001
out WDTCR,r16
wdr
sei

der watchdog denkt aber überhaupt nicht daran einen interrupt 
auszulösen. watchdog reset funktioniert tadellos (WDE=1), brauch ich 
aber nicht.
was mache ich falsch?

2. wie teile ich dem avr-studio im debugging/simulatormodus mit, dass 
bei der cpu bestimmte fuse-bits programmiert sind, damit die simulation 
entsprechend funktioniert.

3. wie lasse ich im editorfenster die zeilennummer anzeigen?

für tipps oder links zum nachlesen wäre ich sehr dankbar, die hilfe 
hinter dem help-button im avr-studio war nicht sehr erhellend.

vielen dank

Autor: Frank Schlaefendorf (Firma: HSCS) (linuxerr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

niemand hier einen tipp? hat das noch niemand ausprobiert?
ich habe den eindruck, dass der watchdog überhaupt nicht startet. wde=0 
steht aber ausdrücklich im datenblatt. wenn ich wde=1 setze funktioniert 
der watchdog, nur eben mit reset und das will ich nicht, da ich den 
watchdog als timer nutzen muss, denn timer0 ist für fast-pwm zuständig.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist zwar ein uralter Fred, aber hier meine funktionierende Version in C:

//watchdog erzeugt IRQ
asm volatile ("wdr"::);
WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR = temp | (1<<WDTIE) | (1<<WDE);
sei();

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Schlaefendorf wrote:
> niemand hier einen tipp? hat das noch niemand ausprobiert?

Naja, ich weiß nicht so recht, was der Sinn eines Watchdoginterrupts 
sein soll.
Der Watchdog liefert ja alles andere als zuverlässige Zeiten.

Ich nehme daher lieber einen einfachen Timerinterrupt und gut is.


Peter


P.S.:
Ich weiß, daß manche die Chaos-Programmierung mögen, also Timer lieber 
so programmieren, daß sie nicht mehrere Sachen zusammen machen können. 
Und dann eben zu wenig Timer haben. Ich kann dieser 
Programmierphilosophie aber nichts abgewinnen.


P.P.S.:
Och, da hat ja wieder jemand was Uraltes ausgegraben.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peda
das hat nix mit Chaos Programmierung zu tun, Sinn des Watchdog 
Interrupts beim tiny13 ist das Stromsparen,
der Tiny13 schläft nämlich so gut, dass er sich von einem Timer nicht 
wecken lässt ...
wenn du eine Möglichkeit per Timer siehst dann her damit

Autor: Frank Schlaefendorf (Firma: HSCS) (linuxerr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter wrote:
> ist zwar ein uralter Fred, aber hier meine funktionierende Version in C:
>
> //watchdog erzeugt IRQ
> asm volatile ("wdr"::);
> WDTCR |= (1<<WDCE) | (1<<WDE);
> WDTCR = temp | (1<<WDTIE) | (1<<WDE);
> sei();

hallo,
vielen dank für die antwort.
mit WDE=1 wird doch aber ein reset bei ablauf des watchdogs ausgeführt.

hat das bei dir mit einem interrupt (ohne reset) funktioniert ????

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Frank
>mit WDE=1 wird doch aber ein reset bei ablauf des watchdogs ausgeführt.

wichtig ist da natürlich WDTIE, das enabled den Interrupt UND sperrt den 
Reset
(siehe Bild 19 auf Seite 37 im Datenblatt)
hat bei mir einwandfrei funktioniert und ist wie gesagt zum Stromsparen 
unerläßlich

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja, auch noch wichtig:
WDTIE must be set after each interrupt.

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>WDTCR = temp | (1<<WDTIE) | (1<<WDE);

Ohne das (1<<WDE) wird's dann was.

Es gibt 3 Arten den WDE zu benutzen

1.) nur WDE ist gesetzt, dann wird ein WDT-Reset nach Ablauf des 
Timeouts erzeugt. Der AVR wird zurückgesetzt.

2.) nur WDIE ist gesetzt, dann wird nach jedem Timeout die WDT-ISR 
aufgerufen. Ein erneutes Setzen des WDIE Flags ist in der ISR nicht 
notwendig. WDE Bit darf nicht gesetzt sein !!

3.) WDE und WDIE Flags sind gesetzt. Beim ersten Tmeout des WDT wird die 
WDT-ISR aufgerufen. Das WDIE Flag wird per Hardware gelöscht falls das 
WDE Bit ebenfalls gesetzt ist. Wird in der ISR das WDIE Flag nicht 
erneut gesetzt, zb. Programfehler in WDT-ISR,  wird beim nächten Timeout 
des WDT ein Reset durchgeführt und nicht die WDT-ISR aufgerufen. Wird in 
der ISR das WDIE Flag erneut gesetzt so wird beim nächten Timeout erneut 
die WDT-ISR aufgerufen.

So verhält es sich auf den neueren AVRs. Ergo: beide Flags, WDE und 
WDIE, aktivieren den WDT egal ob beide oder nur eines der Flags gesetzt 
wurden.

Gruß hagen

Autor: Frank Schlaefendorf (Firma: HSCS) (linuxerr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank, probiere ich demnächst aus.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hagen
>Ohne das (1<<WDE) wird's dann was.

oder auch mit, siehe in deinen Ausführungen Punkt 3
je nachdem ob man den Watchdog nur zum Aufwecken oder auch noch in 
seiner ursprünglichen Funktion braucht

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.