Delay mit Watchdog Interrupt.

Gast #2782120
Lesenswert?

Hallo alle,
ich habe in meinem Programm eine leider unvermeidliche Delay Routine, in 
der Zeit in der die ausgeführt wird gibt es für den Controller wirklich 
nichts zu tun außer warten. Da hab ich mir gedacht, dass ich ihn ja auch 
schlafen legen kann um ihn nach einer Sekunde (solang soll die Dleay 
Routine auch sein, Genauigkeit ist unkritsch) mit dem Watchdog Interrupt 
wieder zu wecken. Der Controller ist ein Attiny13
1
DELAY:
2
  sei
3
  push r16
4
  ldi r16, (1<<WDCE)
5
  out WDTCR, r16
6
  ldi r16, 0b01010110
7
  out WDTCR, r16
8
  ldi r16, 0b00110000
9
  out MCUCR,r16
10
  sleep
11
  ldi r16, (1<<WDCE)
12
  out WDTCR, r16
13
  ldi r16, 0b00010000
14
  out WDTCR, r16
15
  cli
16
  pop r16
17
  ret
die zugehörige IST beschränkt sich auf ein reti, schließlich soll nur 
geweckt werden.
1
.org 0x0008
2
    rjmp WATCHDOG
3

4
WATCHDOG:
5
reti

Das ganze funktioniert aber nicht, vielleicht sieht jemand einen Fehler 
und sagt ihn mir.
#2782372
Lesenswert?

Eumel schrieb:
> Achso, die WDTON Fuse ist natürlich gesetzt!
Die darf nicht gesetzt sein, weil damit der Watchdog aktiv ist und nach 
dem Abarbeiten der Watchdog-Timer-ISR ein Watchdog-Reset ausgeführt 
wird.
Dabei werden auch die Watchdog-Register zurück gesetzt und der Watchdog 
steht auf 16ms. Und wenn er dann nicht gleich wieder eingestellt wird, 
macht er eben nach diesen 16ms wieder einen Reset und damit fristet er 
dann sein Dasein bis ihm der Strom abgestellt wird.

mfg.
Gast #2782413
Lesenswert?

Ahrgl, wie blöd von mir. Unter der entsprechende Tabelle im Datenblatt 
steht:"Note: 1. WDTON fuse set to “0“ means programmed and “1“ means 
unprogrammed"

Und ich hab natürlich nur in die Tabelle geschaut und gedacht 1 würde 
gesetzt heißen.

Danke für deine Hilfe!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren