28
// interrupt every 16ms
29
//cli(); // Disable interrupts
30
wdt_reset(); // Reset the WDT
31
WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
32
WDTCR = (1<<WDIE); // Enable interrupt every 16ms
33
//sei(); // Enable interrupts
28
#if (ATTINY == 25) || (ATTINY == 45) || (ATTINY == 85)
29
// interrupt every 16ms
30
//cli(); // Disable interrupts
31
wdt_reset(); // Reset the WDT
32
WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
33
WDTCR = (1<<WDIE); // Enable interrupt every 16ms
34
//sei(); // Enable interrupts
35
#elif (ATTINY == 1634)
36
wdt_reset(); // Reset the WDT
37
WDTCSR = (1<<WDIE); // Enable interrupt every 16ms
39
#error Unrecognized MCU type
36
43
#ifdef TICK_DURING_STANDBY
37
44
inline void WDT_slow()
40
//cli(); // Disable interrupts
41
wdt_reset(); // Reset the WDT
42
WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
43
WDTCR = (1<<WDIE) | STANDBY_TICK_SPEED; // Enable interrupt every so often
44
//sei(); // Enable interrupts
46
#if (ATTINY == 25) || (ATTINY == 45) || (ATTINY == 85)
48
//cli(); // Disable interrupts
49
wdt_reset(); // Reset the WDT
50
WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
51
WDTCR = (1<<WDIE) | STANDBY_TICK_SPEED; // Enable interrupt every so often
52
//sei(); // Enable interrupts
53
#elif (ATTINY == 1634)
54
wdt_reset(); // Reset the WDT
55
WDTCSR = (1<<WDIE) | STANDBY_TICK_SPEED;
57
#error Unrecognized MCU type
48
62
inline void WDT_off()
50
//cli(); // Disable interrupts
51
wdt_reset(); // Reset the WDT
52
MCUSR &= ~(1<<WDRF); // Clear Watchdog reset flag
53
WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
54
WDTCR = 0x00; // Disable WDT
55
//sei(); // Enable interrupts
64
#if (ATTINY == 25) || (ATTINY == 45) || (ATTINY == 85)
65
//cli(); // Disable interrupts
66
wdt_reset(); // Reset the WDT
67
MCUSR &= ~(1<<WDRF); // Clear Watchdog reset flag
68
WDTCR |= (1<<WDCE) | (1<<WDE); // Start timed sequence
69
WDTCR = 0x00; // Disable WDT
70
//sei(); // Enable interrupts
71
#elif (ATTINY == 1634)
72
cli(); // needed because CCP, below
73
wdt_reset(); // Reset the WDT
74
MCUSR &= ~(1<<WDRF); // clear watchdog reset flag
75
CCP = 0xD8; // enable config changes
76
WDTCSR = 0; // disable and clear all WDT settings
79
#error Unrecognized MCU type
58
83
// clock tick -- this runs every 16ms (62.5 fps)
85
static uint8_t adc_trigger = 0;
60
87
#ifdef TICK_DURING_STANDBY
61
88
f_wdt = 1; // WDT event happened
68
95
// wrap around from 65535 to 32768, not 0
69
96
sleep_counter = (sleep_counter + 1) | (sleep_counter & 0x8000);
70
97
process_emissions();
99
#if defined(USE_SLEEP_LVP)
100
// stop here, usually... but proceed often enough for sleep LVP to work
101
if (0 != (sleep_counter & 0x7f)) return;
102
adc_trigger = 255; // make sure a measurement will happen
104
return; // no sleep LVP needed if nothing drains power while off
107
else { sleep_counter = 0; }
76
110
// detect and emit button change events
137
171
#if defined(USE_LVP) || defined(USE_THERMAL_REGULATION)
138
172
// start a new ADC measurement every 4 ticks
139
static uint8_t adc_trigger = 0;
141
174
if (0 == (adc_trigger & 3)) {
142
ADCSRA |= (1 << ADSC) | (1 << ADIE);
175
#if defined(TICK_DURING_STANDBY) && defined(USE_SLEEP_LVP)
176
// we shouldn't be here unless it woke up for a LVP check...
177
// so enable ADC voltage measurement functions temporarily
178
if (go_to_standby) ADC_on();
180
ADC_start_measurement();
143
181
adcint_enable = 1;