// C++ code
/*
Programa 1: Utilizar a interrupção do WDT para piscar um led a cada 4 segundos
*/
#include <avr/wdt.h>
// watchdog intervals
// sleep bit patterns for WDTCSR
enum
{
WDT_16_MS = 0b000000,
WDT_32_MS = 0b000001,
WDT_64_MS = 0b000010,
WDT_128_MS = 0b000011,
WDT_256_MS = 0b000100,
WDT_512_MS = 0b000101,
WDT_1_SEC = 0b000110,
WDT_2_SEC = 0b000111,
WDT_4_SEC = 0b100000,
WDT_8_SEC = 0b100001,
}; // end of WDT intervals enum
void setup()
{
wdt_disable ();
//Serial.begin(115200);
Serial.begin(9600);
Serial.println ();
Serial.println("After reset");
watchdogSetup(WDT_4_SEC);
}
volatile bool watchdogFired = false;
ISR(WDT_vect) // Watchdog timer interrupt.
{
watchdogFired = true;
}
void watchdogSetup(byte interval)
{
cli(); // disable all interrupts
// Enter Watchdog Configuration mode:
WDTCSR = bit (WDCE) | bit (WDE);
// Set Watchdog settings:
WDTCSR = bit (WDIE) | interval; // set WDIE, and delay - for an INTERRUPT
// WDTCSR = bit (WDE) | interval; // set WDE, and delay - for a RESET
wdt_reset(); // reset the WDT timer
sei(); // enable interrupts again
}
void loop()
{
if (watchdogFired)
{
watchdogFired = false;
Serial.println ("Watchdog fired.");
wdt_reset(); // if you want to reset the watchdog timeout
}
}
/*
Aluno: Luiz Paulo Grafetti Terres
Data : Jun 14, 2024
Email: [email protected] || [email protected]
*/