Forum: Mikrocontroller und Digitale Elektronik Watchdog Interrupt ATtiny13


von Frank S. (Firma: HSCS) (linuxerr)


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

von Frank S. (Firma: HSCS) (linuxerr)


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.

von Walter (Gast)


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

von Peter D. (peda)


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.

von Walter (Gast)


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

von Frank S. (Firma: HSCS) (linuxerr)


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

von Walter (Gast)


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

von Walter (Gast)


Lesenswert?

ach ja, auch noch wichtig:
WDTIE must be set after each interrupt.

von Hagen R. (hagen)


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

von Frank S. (Firma: HSCS) (linuxerr)


Lesenswert?

vielen dank, probiere ich demnächst aus.

von Walter (Gast)


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

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.