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