// See https://forum.arduino.cc/index.php?topic=246359.0 #include #include int EEPROM_Address = 0; //uint8_t signalByte = 1, EEPROM_Contents; char resetCause = 'p', EEPROM_Contents; void setup() { wdt_disable(); //disable any previous watchdog Serial.begin(57600); Serial.println(" "); Serial.println("Wecome to WatchDogTest "); Serial.println("Watchdog has been reset"); EEPROM_Contents = EEPROM.read(EEPROM_Address); Serial.print("EEPROM Address is: "); Serial.print(EEPROM_Address); Serial.print(" last reset cause was: "); Serial.println(EEPROM_Contents); EEPROM.update(EEPROM_Address, 'p'); /* while (true) { // No code } */ configure_wdt(); Serial.println(" watch dog now set up"); //wdt_enable(WDTO_8S); } void loop() { resetCause = 'l'; Serial.print("."); delay(500); wdt_reset(); } /* Function to configure the watchdog: let it sleep 8 seconds before firing when firing, configure it for interrupts then resetting WDTCSR configuration: WDIE = 1: Interrupt Enable WDE = 1 :Reset Enable WDP3 = 1 :For 8000ms Time-out WDP2 = 0 :For 8000ms Time-out WDP1 = 0 :For 8000ms Time-out WDP0 = 1 :For 8000ms Time-out */ void configure_wdt(void) { cli(); // disable all interrupts wdt_reset(); // reset the WDT timer // First enter Watchdog Configuration mode, then set the bits WDTCSR |= (1 << WDCE) | (1 << WDE); WDTCSR = (1 << WDIE) | (1 << WDE) | (1 << WDP3) | (0 << WDP2) | (0 << WDP1) | (1 << WDP0); sei(); // Re-enable interrupts } ISR(WDT_vect) // Watchdog timer interrupt, just EEPROM write our cause { EEPROM.update(EEPROM_Address, resetCause); }