Pascal schrieb:
> Muss es denn so aussehen?
>
>
>
> WDTCR |= (1<<WDCE) | (1<<WDE); /* Startet timer sequence */
>
>
>
> WDTCR = (1<<WDTIE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0); Set Prescaler 8S
Das ist schon fast richtig.
Es fehlt noch das MCUSR-Register.
Um das WDE-Bit zu löschen, MUSS ZUERST das WDRF-Bit im MCUSR gelöscht,
dann wird das WDCE-Bit(Change Enable) gesetzt und mit dem NÄCHSTEN
Befehl können dann das WDE gelöscht und weitere Änderungen gemacht
werden werden.
Das muß aber alles in diesem einen letzten Befehl geschehen.
Sieht ein bisschen unlogisch aus, aber beim Watchdog müssen klar
definierte Timings eingehalten werden.
Das ist so, damit der Watchdog nicht einfach bei einem Programmfehler
durch nicht beabsichtigtes Schreiben ins WDTCR-Register deaktiviert
werden kann.
Beim Atmega 644 mache ich das so:
(Beim Tiny 13 sind das die gleichen Register)
//Watchdog Interval Timer
WDTCSR |= (1<<WDCE) | (1<<WDE); //Enable Reset
MCUSR &= ~(1<<WDRF); //Clear WDRF in MCUSR
WDTCSR |= (1<<WDCE); //Watchdog ChangeEnable
WDTCSR = 0x49; //Enable Interrupt, Disable Reset, Set Prescaler 8s
DDRB |= (1 << 4); //Test
//---
sei();
ISR(WDT_vect)
{
PORTB ^= (1 << 4);
}
Und dann toggelt PB4 ungefähr alle 8s.
Warum ungefähr? Weil die Timing-Angaben für 5 V gelten und bei anderen
Spannungen andere Werte herauskommen können. Also ausprobieren.
mfg.