aboutsummaryrefslogtreecommitdiff
path: root/spaghetti-monster/fsm-wdt.c
diff options
context:
space:
mode:
Diffstat (limited to 'spaghetti-monster/fsm-wdt.c')
-rw-r--r--spaghetti-monster/fsm-wdt.c82
1 files changed, 60 insertions, 22 deletions
diff --git a/spaghetti-monster/fsm-wdt.c b/spaghetti-monster/fsm-wdt.c
index d5bbdb9..6e61e87 100644
--- a/spaghetti-monster/fsm-wdt.c
+++ b/spaghetti-monster/fsm-wdt.c
@@ -25,38 +25,65 @@
void WDT_on()
{
- // interrupt every 16ms
- //cli(); // Disable interrupts
- wdt_reset(); // Reset the WDT
- WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
- WDTCR = (1<<WDIE); // Enable interrupt every 16ms
- //sei(); // Enable interrupts
+ #if (ATTINY == 25) || (ATTINY == 45) || (ATTINY == 85)
+ // interrupt every 16ms
+ //cli(); // Disable interrupts
+ wdt_reset(); // Reset the WDT
+ WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
+ WDTCR = (1<<WDIE); // Enable interrupt every 16ms
+ //sei(); // Enable interrupts
+ #elif (ATTINY == 1634)
+ wdt_reset(); // Reset the WDT
+ WDTCSR = (1<<WDIE); // Enable interrupt every 16ms
+ #else
+ #error Unrecognized MCU type
+ #endif
}
#ifdef TICK_DURING_STANDBY
inline void WDT_slow()
{
- // interrupt slower
- //cli(); // Disable interrupts
- wdt_reset(); // Reset the WDT
- WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
- WDTCR = (1<<WDIE) | STANDBY_TICK_SPEED; // Enable interrupt every so often
- //sei(); // Enable interrupts
+ #if (ATTINY == 25) || (ATTINY == 45) || (ATTINY == 85)
+ // interrupt slower
+ //cli(); // Disable interrupts
+ wdt_reset(); // Reset the WDT
+ WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
+ WDTCR = (1<<WDIE) | STANDBY_TICK_SPEED; // Enable interrupt every so often
+ //sei(); // Enable interrupts
+ #elif (ATTINY == 1634)
+ wdt_reset(); // Reset the WDT
+ WDTCSR = (1<<WDIE) | STANDBY_TICK_SPEED;
+ #else
+ #error Unrecognized MCU type
+ #endif
}
#endif
inline void WDT_off()
{
- //cli(); // Disable interrupts
- wdt_reset(); // Reset the WDT
- MCUSR &= ~(1<<WDRF); // Clear Watchdog reset flag
- WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
- WDTCR = 0x00; // Disable WDT
- //sei(); // Enable interrupts
+ #if (ATTINY == 25) || (ATTINY == 45) || (ATTINY == 85)
+ //cli(); // Disable interrupts
+ wdt_reset(); // Reset the WDT
+ MCUSR &= ~(1<<WDRF); // Clear Watchdog reset flag
+ WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
+ WDTCR = 0x00; // Disable WDT
+ //sei(); // Enable interrupts
+ #elif (ATTINY == 1634)
+ cli(); // needed because CCP, below
+ wdt_reset(); // Reset the WDT
+ MCUSR &= ~(1<<WDRF); // clear watchdog reset flag
+ CCP = 0xD8; // enable config changes
+ WDTCSR = 0; // disable and clear all WDT settings
+ sei();
+ #else
+ #error Unrecognized MCU type
+ #endif
}
// clock tick -- this runs every 16ms (62.5 fps)
ISR(WDT_vect) {
+ static uint8_t adc_trigger = 0;
+
#ifdef TICK_DURING_STANDBY
f_wdt = 1; // WDT event happened
@@ -68,9 +95,16 @@ ISR(WDT_vect) {
// wrap around from 65535 to 32768, not 0
sleep_counter = (sleep_counter + 1) | (sleep_counter & 0x8000);
process_emissions();
- return;
+
+ #if defined(USE_SLEEP_LVP)
+ // stop here, usually... but proceed often enough for sleep LVP to work
+ if (0 != (sleep_counter & 0x7f)) return;
+ adc_trigger = 255; // make sure a measurement will happen
+ #else
+ return; // no sleep LVP needed if nothing drains power while off
+ #endif
}
- sleep_counter = 0;
+ else { sleep_counter = 0; }
#endif
// detect and emit button change events
@@ -136,10 +170,14 @@ ISR(WDT_vect) {
#if defined(USE_LVP) || defined(USE_THERMAL_REGULATION)
// start a new ADC measurement every 4 ticks
- static uint8_t adc_trigger = 0;
adc_trigger ++;
if (0 == (adc_trigger & 3)) {
- ADCSRA |= (1 << ADSC) | (1 << ADIE);
+ #if defined(TICK_DURING_STANDBY) && defined(USE_SLEEP_LVP)
+ // we shouldn't be here unless it woke up for a LVP check...
+ // so enable ADC voltage measurement functions temporarily
+ if (go_to_standby) ADC_on();
+ #endif
+ ADC_start_measurement();
adcint_enable = 1;
}
#endif