diff options
| author | Selene ToyKeeper | 2019-11-14 19:44:57 -0700 |
|---|---|---|
| committer | Selene ToyKeeper | 2019-11-14 19:44:57 -0700 |
| commit | 1a85469b00856020e061170c031d47173f298d93 (patch) | |
| tree | b30725c34f27797516f8bc82b49bcf59801b17c8 /spaghetti-monster/fsm-adc.h | |
| parent | fixed some compile issues related to delay_4ms() (diff) | |
| parent | turned off muggle mode on Q8 and MF01S, to make builds small enough again (diff) | |
| download | anduril-1a85469b00856020e061170c031d47173f298d93.tar.gz anduril-1a85469b00856020e061170c031d47173f298d93.tar.bz2 anduril-1a85469b00856020e061170c031d47173f298d93.zip | |
merged irq-refactor branch, which fixes some small but long-standing issues:
- occasional missed button events while asleep
- occasional short/aborted frames in aux LED sleep animation
- rare case of bogus voltage and/or temperature values
- fixed issue where nice_delay_ms() didn't work in setup()
- fixed theoretical possibility of extra-noisy buttons causing a hang
Also does some other things:
- cleans up the ADC code significantly
- adds a voltage stabilizer/lowpass option (enabled on t1634 builds)
- greatly reduces time spent per interrupt,
which might make a future PWM-DSM technique possible
- moves most interrupt-handling logic to a non-critical code path,
deferring that code until timing doesn't matter as much
- sped up button state measurements
- turned off muggle mode on a couple builds which were too big
Diffstat (limited to 'spaghetti-monster/fsm-adc.h')
| -rw-r--r-- | spaghetti-monster/fsm-adc.h | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/spaghetti-monster/fsm-adc.h b/spaghetti-monster/fsm-adc.h index 274fb4d..6e39750 100644 --- a/spaghetti-monster/fsm-adc.h +++ b/spaghetti-monster/fsm-adc.h @@ -38,9 +38,18 @@ #define VOLTAGE_FUDGE_FACTOR 5 #endif #endif + +volatile uint8_t irq_adc = 0; // ADC interrupt happened? +volatile uint8_t irq_adc_stable = 0; // have we passed the 1st junk value yet? +uint8_t adc_channel = 0; // 0=voltage, 1=temperature +uint16_t adc_values[2]; // last ADC measurements (0=voltage, 1=temperature) +uint8_t adcint_enable = 0; // is the current ADC result needed? +void ADC_inner(); // do the actual ADC-related calculations + +static inline void ADC_voltage_handler(); volatile uint8_t voltage = 0; -volatile uint8_t adcint_enable; // kludge, because adc auto-retrigger won't turn off void low_voltage(); + #ifdef USE_BATTCHECK void battcheck(); #ifdef BATTCHECK_VpT @@ -50,7 +59,7 @@ void battcheck(); #define USE_BLINK_DIGIT #endif #endif -#endif +#endif // ifdef USE_LVP #ifdef USE_THERMAL_REGULATION @@ -79,7 +88,8 @@ int8_t therm_cal_offset = 0; //void low_temperature(); //void high_temperature(); volatile uint8_t reset_thermal_history = 1; -#endif +static inline void ADC_temperature_handler(); +#endif // ifdef USE_THERMAL_REGULATION inline void ADC_on(); |
