summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2014-05-15 09:31:24 -0600
committerKeith Packard <keithp@keithp.com>2014-05-15 09:31:24 -0600
commit819f73698f57e76dca50fe4fadccebd23ffb776d (patch)
tree76248f4f2f500fcbec025ee586d883eafc1c484f
parentda13064382e9673e69cdfae6abbac253c9fc42fc (diff)
altos: Make quadrature debounce per-pin rather than per-device
Debouncing per-pin means we don't lose transitions, which makes counting a lot more precise. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/drivers/ao_quadrature.c39
-rw-r--r--src/telelco-v0.2/ao_pins.h2
2 files changed, 34 insertions, 7 deletions
diff --git a/src/drivers/ao_quadrature.c b/src/drivers/ao_quadrature.c
index 66a77dfa..0cdcc9fb 100644
--- a/src/drivers/ao_quadrature.c
+++ b/src/drivers/ao_quadrature.c
@@ -24,6 +24,13 @@
__xdata int32_t ao_quadrature_count[AO_QUADRATURE_COUNT];
static uint8_t ao_quadrature_state[AO_QUADRATURE_COUNT];
+struct ao_debounce {
+ uint8_t state;
+ uint8_t count;
+};
+
+static struct ao_debounce ao_debounce_state[AO_QUADRATURE_COUNT][2];
+
#define port(q) AO_QUADRATURE_ ## q ## _PORT
#define bita(q) AO_QUADRATURE_ ## q ## _A
#define bitb(q) AO_QUADRATURE_ ## q ## _B
@@ -31,14 +38,35 @@ static uint8_t ao_quadrature_state[AO_QUADRATURE_COUNT];
#define pinb(q) AO_QUADRATURE_ ## q ## _B ## _PIN
#define isr(q) ao_quadrature_isr_ ## q
-static inline uint16_t
-ao_quadrature_read(struct stm_gpio *gpio, uint8_t pin_a, uint8_t pin_b) {
- uint16_t v = stm_gpio_get_all(gpio);
+#define DEBOUNCE 10
- return ~((((v >> pin_a) & 1) | (((v >> pin_b) & 1) << 1))) & 3;
+static uint8_t
+ao_debounce(uint8_t cur, struct ao_debounce *debounce)
+{
+ if (cur == debounce->state)
+ debounce->count = 0;
+ else {
+ if (++debounce->count == DEBOUNCE) {
+ debounce->state = cur;
+ debounce->count = 0;
+ }
+ }
+ return debounce->state;
}
-#define _ao_quadrature_get(q) ao_quadrature_read(port(q), bita(q), bitb(q))
+static uint16_t
+ao_quadrature_read(struct stm_gpio *gpio, uint8_t pin_a, uint8_t pin_b, struct ao_debounce debounce_state[2]) {
+ uint16_t v = ~stm_gpio_get_all(gpio);
+ uint8_t a = (v >> pin_a) & 1;
+ uint8_t b = (v >> pin_b) & 1;
+
+ a = ao_debounce(a, &debounce_state[0]);
+ b = ao_debounce(b, &debounce_state[1]);
+
+ return a | (b << 1);
+}
+
+#define _ao_quadrature_get(q) ao_quadrature_read(port(q), bita(q), bitb(q), ao_debounce_state[q])
static void
_ao_quadrature_queue(uint8_t q, int8_t step)
@@ -50,7 +78,6 @@ _ao_quadrature_queue(uint8_t q, int8_t step)
ao_wakeup(&ao_quadrature_count[q]);
}
-
static void
_ao_quadrature_set(uint8_t q, uint8_t new) {
uint8_t old = ao_quadrature_state[q];
diff --git a/src/telelco-v0.2/ao_pins.h b/src/telelco-v0.2/ao_pins.h
index 609e5494..a6fd4ff8 100644
--- a/src/telelco-v0.2/ao_pins.h
+++ b/src/telelco-v0.2/ao_pins.h
@@ -72,7 +72,7 @@
#define PACKET_HAS_SLAVE 0
#define PACKET_HAS_MASTER 0
-#define FAST_TIMER_FREQ 200 /* 5ms for debouncing */
+#define FAST_TIMER_FREQ 10000 /* .1ms for debouncing */
/*
* Radio is a cc1120 connected via SPI