Atmega4hvd/8hvd – Rainbow Electronics ATmega8HVD User Manual
Page 47

47
8052B–AVR–09/08
ATmega4HVD/8HVD
Note: If the Watchdog is accidentally enabled, for example by a runaway pointer or Black-out
condition, the device will be reset and the Watchdog Timer will stay enabled. If the code is not
set up to handle the Watchdog, this might lead to an eternal loop of timeout resets. To avoid
this situation, the application software should always clear the Watchdog System Reset Flag
(WDRF) and the WDE control bit in the initialisation routine, even if the Watchdog is not in use.
The following code example shows one assembly and one C function for changing the timeout
value of the Watchdog Timer.
Note:
1. See
”About Code Examples” on page 5
Note: The Watchdog Timer should be reset before any change of the WDP bits, since a
change in the WDP bits can result in a timeout when switching to a shorter timeout period.
Assembly Code Example
(1)
WDT_Prescaler_Change:
; Turn off global interrupt
cli
; Reset Watchdog Timer
wdr
; Start timed sequence
in
r16, WDTCSR
ori
r16, (1<<WDCE) | (1<<WDE)
out
WDTCSR, r16
; -- Got four cycles to set the new values from here -
; Set new prescaler(timeout) value = 64K cycles (~0.5 s)
ldi
r16, (1<<WDE) | (1<<WDP2) | (1<<WDP0)
out
WDTCSR, r16
; -- Finished setting new values, used 2 cycles -
; Turn on global interrupt
sei
ret
C Code Example
(1)
void WDT_Prescaler_Change(void)
{
__disable_interrupt();
__watchdog_reset();
/* Start timed equence */
WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Set new prescaler(timeout) value = 64K cycles (~0.5 s) */
WDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP0);
__enable_interrupt();
}