Forum: Mikrocontroller und Digitale Elektronik Watchdog - WDP wird nicht gesetzt


von Rainer B. (guitero)


Lesenswert?

Hallo zusammen,

habe heute probiert den Wachhund zum Laufen zu bewegen.
Folgendes habe ich bei der Initialisierung:

ldi  temp, (1<<WDCE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0)
out  WDTCR, temp


Debugge ich mit dem JTAG werden die WDP Bits jedoch nicht gesetzt.
Im "echten" Programm ist es auch so dass der Watchdog scheinbar sehr 
schnell abläuft, sodass andauernd ein Reset ausgeführt wird. Zum Testen 
leuchtet beim Reset bei mir eine LED auf, die nach 600ms per Timer 
abgeschaltet wird. Das funktioniert soweit auch. Aktiviere ich den 
Watchdog leuchtet die LED aber immer, zumindest fürs Auge! Da ich den 
Watchdog auf Teiler 2058 gestellt habe müsste er aber erst nach ca. 2s 
abgelaufen sein.
Also steht der Watchdog wahrscheinlich auf Teiler16 = 15ms.
Kennt jemand dieses Problem oder hat einen Tipp wie ich an das Problem 
rangehen kann.
Hier ist der vollständige Code:
Bei Initialisierung soll LED aufleuchten und durch Ablauf des Timers 
nach 0,6s erlischen. Dann soll nach 2s der Watchdog den reset auslösen. 
Programm ist nur als Test des WDR gedacht:
1
init:  //-->STACK
2
    ldi     temp, LOW(RAMEND)
3
    out     SPL, temp
4
    ldi     temp, HIGH(RAMEND)
5
    out     SPH, temp
6
    
7
    ldi    temp, 0x00
8
    sts    TCNT1H, temp
9
    ldi    temp, 0x00
10
    sts    TCNT1L, temp
11
12
   ;Berechnung-->7,37Mhz/65536/64 = 1,757 --> ca. 0,6s
13
    ldi     temp, (0 << CS12 ) | (1 << CS11 ) | (1 << CS10 ) 
14
    sts     TCCR1B, temp
15
 
16
    ldi     temp, 1 << TOIE1
17
    sts     TIMSK, temp    
18
19
  ldi  temp, (1<<WDCE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0)
20
  out    WDTCR, temp
21
                
22
  clr    temp
23
  clr    flag
24
  clr    data
25
  clr    counter
26
  clr    flag0
27
    
28
  ldi    temp, 0xFF
29
  out    PORTE, temp
30
  out    DDRE, temp
31
32
  sei  
33
34
loop:
35
    
36
37
  rjmp   loop
38
39
timer1:
40
41
42
  ldi    temp, 0x00
43
  out    PORTE, temp
44
  out    DDRE, temp
45
46
  ldi    temp, ( 0 << CS12 ) | (0 << CS10 ) | (0 << CS10 ) 
47
  out    TCCR1B, temp
48
49
  ldi    temp, 0x00
50
  out    TCNT1H, temp
51
  out    TCNT1L, temp
52
    
53
  reti

Viele Grüße,

guitero

von Hc Z. (mizch)


Lesenswert?

Da Du den AVR-Typ nicht nennst, kann man nur raten:  Üblicherweise 
kannst Du den Watchdog nicht einfach in einem Befehl verändern, sondern 
musst eine Sequenz einhalten, z.B. WDCE und WDE setzen und danach 
innerhalb von vier Zyklen den gewünschten Wert schreiben.

Näheres verrät Dir das freundliche Datenblatt.

von Rainer B. (guitero)


Lesenswert?

Hallo,

> Da Du den AVR-Typ nicht nennst, kann man nur raten:

Sorry, es handelt sich um einen AtMEga162.

>sts    TCNT1L, temp

Hier sollte der Befehl "out" sein, habe beim reinkopieren Mist gebaut.

>Üblicherweise
>kannst Du den Watchdog nicht einfach in einem Befehl verändern, sondern
>musst eine Sequenz einhalten, z.B. WDCE und WDE setzen und danach
>innerhalb von vier Zyklen den gewünschten Wert schreiben.

Das war der Fehler. Vielen, vielen Dank!

Gruß,

guitero

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.