diff options
| author | Selene ToyKeeper | 2019-11-14 01:52:50 -0700 |
|---|---|---|
| committer | Selene ToyKeeper | 2019-11-14 01:52:50 -0700 |
| commit | 8b59e880614455bd7bc7d8595de847dd6fe9b5b2 (patch) | |
| tree | a7426296b9fa1471ba2841eba0415bbfaed3e5c7 /spaghetti-monster/fsm-standby.c | |
| parent | fixed some compile issues related to delay_4ms() (diff) | |
| download | anduril-8b59e880614455bd7bc7d8595de847dd6fe9b5b2.tar.gz anduril-8b59e880614455bd7bc7d8595de847dd6fe9b5b2.tar.bz2 anduril-8b59e880614455bd7bc7d8595de847dd6fe9b5b2.zip | |
refactored how interrupts work...
set a flag and return immediately,
then handle the actual logic later during a less-critical code path
Enables smarter responses to standby wakeups.
Seems to fix missed button presses during standby,
and most of the too-fast sleep ticks.
Also eliminated waits from button state measurement, so it can happen easier during standby.
(also eliminates the chance of an infinite loop on extra-noisy hardware)
Also might improve timing-sensitive interrupts like attiny85 PWM channel 4,
or a PWM-DSM hybrid technique I'd like to try.
BUT this change also appears to break the thermal sensor, so that needs to be fixed.
Diffstat (limited to '')
| -rw-r--r-- | spaghetti-monster/fsm-standby.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/spaghetti-monster/fsm-standby.c b/spaghetti-monster/fsm-standby.c index 44b047a..4124d92 100644 --- a/spaghetti-monster/fsm-standby.c +++ b/spaghetti-monster/fsm-standby.c @@ -42,13 +42,15 @@ void sleep_until_eswitch_pressed() // make sure switch isn't currently pressed while (button_is_pressed()) {} empty_event_sequence(); // cancel pending input on suspend - //PCINT_since_WDT = 0; // ensure PCINT won't ignore itself PCINT_on(); // wake on e-switch event #ifdef TICK_DURING_STANDBY + // detect which type of event caused a wake-up + irq_adc = 0; + irq_wdt = 0; + irq_pcint = 0; while (go_to_standby) { - f_wdt = 0; // detect if WDT was what caused a wake-up #else go_to_standby = 0; #endif @@ -65,10 +67,19 @@ void sleep_until_eswitch_pressed() sleep_disable(); #ifdef TICK_DURING_STANDBY - // determine what woke us up... WDT or PCINT - if (! f_wdt) { // PCINT went off; wake up + // determine what woke us up... + if (irq_pcint) { // button pressed; wake up go_to_standby = 0; } + if (irq_adc) { // ADC done measuring + adcint_enable = 1; + ADC_inner(); + //ADC_off(); // takes care of itself + //irq_adc = 0; // takes care of itself + } + if (irq_wdt) { // generate a sleep tick + WDT_inner(); + } } #endif |
