WatchDog Timer
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
/*
Watchdog Timer Prescale Select
WDP3 WDP2 WDP1 WDP0 Number of WDT Typical Time-out at Oscillator Cycles VCC = 5.0V
0 0 0 0 2K (2048) cycles 16 ms
0 0 0 1 4K (4096) cycles 32 ms
0 0 1 0 8K (8192) cycles 64 ms
0 0 1 1 16K (16384) cycles 0.125 s
0 1 0 0 32K (32768) cycles 0.25 s
0 1 0 1 64K (65536) cycles 0.5 s
0 1 1 0 128K (131072) cycles 1.0 s
0 1 1 1 256K (262144) cycles 2.0 s
1 0 0 0 512K (524288) cycles 4.0 s
1 0 0 1 1024K (1048576) cycles 8.0 s
*/
unsigned int i = 0;
void setup(void) {
Serial.begin(57600);
MCUSR &= ~(1 << WDRF); // reset status flag
WDTCSR |= (1 << WDCE) | (1 << WDE); // enable configuration changes
WDTCSR = (1<< WDP0) | ( 1 << WDP3); // set the prescalar = 9
WDTCSR |= (1 << WDIE); // enable interrupt mode
}
void loop(void) {
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // select the watchdog timer mode
sleep_enable(); // enable the sleep mode ready for use
sleep_mode(); // trigger the sleep
Serial.print("Woken ");
Serial.println(i++);
Serial.flush();
sleep_disable(); // prevent further sleeps
}
ISR(WDT_vect) {
}