From b416fef56b7acff959110f78e74ce5ccf8a8fb5b Mon Sep 17 00:00:00 2001 From: Oliver Hahm Date: Thu, 16 Dec 2010 18:09:40 +0100 Subject: [PATCH] [cpu/cc430] * fixed debouncing for gpioint --- cpu/cc430/cc430-gpioint.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/cpu/cc430/cc430-gpioint.c b/cpu/cc430/cc430-gpioint.c index 585c78e60..460d2a487 100644 --- a/cpu/cc430/cc430-gpioint.c +++ b/cpu/cc430/cc430-gpioint.c @@ -44,7 +44,7 @@ and the mailinglist (subscription via web site) #define BITMASK_SIZE (8) /** debouncing port interrupts */ -#define DEBOUNCE_TIMEOUT (150) +#define DEBOUNCE_TIMEOUT (250) /** interrupt callbacks */ fp_irqcb cb[INT_PORTS][BITMASK_SIZE]; @@ -146,33 +146,41 @@ bool gpioint_set(int port, uint32_t bitmask, int flags, fp_irqcb callback) { } interrupt (PORT1_VECTOR) __attribute__ ((naked)) port1_isr(void) { - uint8_t int_enable, ifg_num; + uint8_t int_enable, ifg_num, p1ifg; uint16_t p1iv; + uint16_t diff; __enter_isr(); /* Debounce * Disable PORT1 IRQ */ + p1ifg = P1IFG; p1iv = P1IV; int_enable = P1IE; P1IE = 0x00; ifg_num = (p1iv >> 1) - 1; /* check interrupt source */ - if (debounce_flags[0] & P1IFG) { + if (debounce_flags[0] & p1ifg) { /* check if bouncing */ - if ((hwtimer_now() - debounce_time[0][ifg_num]) > DEBOUNCE_TIMEOUT) { + diff = hwtimer_now() - debounce_time[0][ifg_num]; + if (diff > DEBOUNCE_TIMEOUT) { debounce_time[0][ifg_num] = hwtimer_now(); - cb[0][ifg_num](); + if (cb[0][ifg_num] != NULL) { + cb[0][ifg_num](); + } } else { /* TODO: check for long duration irq */ + asm volatile (" nop "); } } else { - cb[0][ifg_num](); + if (cb[0][ifg_num] != NULL) { + cb[0][ifg_num](); + } } - + P1IFG = 0x00; P1IE = int_enable; __exit_isr(); @@ -211,7 +219,9 @@ interrupt (PORT2_VECTOR) __attribute__ ((naked)) port2_isr(void) { } } else { - cb[1][ifg_num](); + if (cb[1][ifg_num] != NULL) { + cb[1][ifg_num](); + } } P2IFG = 0x00;