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-pcint.c | |
| 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-pcint.c')
| -rw-r--r-- | spaghetti-monster/fsm-pcint.c | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/spaghetti-monster/fsm-pcint.c b/spaghetti-monster/fsm-pcint.c index 4928980..a4a496a 100644 --- a/spaghetti-monster/fsm-pcint.c +++ b/spaghetti-monster/fsm-pcint.c @@ -24,19 +24,9 @@ #include <util/delay_basic.h> uint8_t button_is_pressed() { - // remember the past 32 measurements - static uint32_t readings = 0; - // take at least one new measurement, - // and wait for measurements to settle to all zeroes or all ones - do { - // shift past readings and add current value - readings = (readings << 1) | ((SWITCH_PORT & (1<<SWITCH_PIN)) == 0); - // wait a moment - _delay_loop_2(BOGOMIPS/16); // up to 2ms to stabilize - } - while ((readings != 0) && (readings != 0xFFFFFFFF)); - button_last_state = readings; - return readings; + uint8_t value = ((SWITCH_PORT & (1<<SWITCH_PIN)) == 0); + button_last_state = value; + return value; } inline void PCINT_on() { @@ -75,7 +65,10 @@ inline void PCINT_off() { //void button_change_interrupt() { #if (ATTINY == 25) || (ATTINY == 45) || (ATTINY == 85) || (ATTINY == 1634) -EMPTY_INTERRUPT(PCINT0_vect); +//EMPTY_INTERRUPT(PCINT0_vect); +ISR(PCINT0_vect) { + irq_pcint = 1; +} #else #error Unrecognized MCU type #endif |
