add watchdog (now working)
This commit is contained in:
parent
6066ef44d8
commit
6531f411a4
|
@ -46,10 +46,24 @@ void wdt_init(void)
|
|||
{
|
||||
MCUSR = 0;
|
||||
wdt_disable();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* enable watchdog with interrupt and system reset (modified wdt_enable) */
|
||||
#define wdt_set(value) \
|
||||
__asm__ __volatile__ ( \
|
||||
"in __tmp_reg__,__SREG__" "\n\t" \
|
||||
"cli" "\n\t" \
|
||||
"wdr" "\n\t" \
|
||||
"sts %0,%1" "\n\t" \
|
||||
"out __SREG__,__tmp_reg__" "\n\t" \
|
||||
"sts %0,%2" "\n\t" \
|
||||
: /* no outputs */ \
|
||||
: "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), \
|
||||
"r" (_BV(_WD_CHANGE_BIT) | _BV(WDE) | _BV(WDIE)), \
|
||||
"r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | _BV(WDE) | _BV(WDIE) | (value & 0x07)) ) \
|
||||
: "r0" \
|
||||
)
|
||||
|
||||
/* initialize GPIO */
|
||||
void io_init(void)
|
||||
{
|
||||
|
@ -73,7 +87,7 @@ int main(void)
|
|||
{
|
||||
io_init(); // initialize IOs
|
||||
|
||||
printf(PSTR("welcome to the spar counter power meter monitor\n"));
|
||||
//printf(PSTR("welcome to the spar counter power meter monitor\n"));
|
||||
|
||||
/* configure nRF24 transceiver */
|
||||
nrf24_set_rx_addr(conf.rx_addr); // set device receiving address
|
||||
|
@ -98,24 +112,12 @@ int main(void)
|
|||
|
||||
bool action = false; // to know if we performed any king of action during which some other activity could have happened
|
||||
|
||||
/* start watchdog */
|
||||
/*
|
||||
wdt_enable(WDTO_4S);
|
||||
while (true);
|
||||
WDTCSR = (1<<WDCE); // change settings
|
||||
//WDTCSR = (0<<WDP3)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0); // set time-out to 2s
|
||||
WDTCSR = (1<<WDP3)|(0<<WDP2)|(0<<WDP1)|(1<<WDP0);
|
||||
WDTCSR = (1<<WDCE); // change settings
|
||||
WDTCSR = (1<<WDE)|(1<<WDIE); // enable interrupt than system reset mode
|
||||
while (true);
|
||||
*/
|
||||
|
||||
while (true) { // endless loop for micro-controller
|
||||
action = false; // new cycle of actions
|
||||
if (watchdog) { // watchdog interrupt trigger. clear before system reset
|
||||
WDTCSR = (1<<WDCE); // change settings
|
||||
WDTCSR = (1<<WDE)|(1<<WDIE); // enable interrupt than system reset mode
|
||||
watchdog = false;
|
||||
if (watchdog) { // watchdog interrupt trigger. reset watchdog before system reset
|
||||
wdt_set(WDTO_2S); // set to 4s (interrupt and reset mode)
|
||||
sei(); // re-enable interrupts
|
||||
watchdog = false; // wait for next reset
|
||||
}
|
||||
if (timer_seconds!=0 && timer_seconds==conf.request_period) {
|
||||
action = true; // an action is performed
|
||||
|
|
Loading…
Reference in New Issue