Test for PinDetect library. Use constant "#define DIRECTINT" to compile two different versions of the program comparing the status registers related to the interrupt states when using the PinDetect Libraries vs the InterruptIn library.
Dependencies: C12832_lcd PinDetect mbed
Fork of Bootcamp-Pushbutton_Debounce_Interrupt by
Revision 2:aca93337a0e1, committed 2014-02-17
- Comitter:
- nleoni
- Date:
- Mon Feb 17 06:35:57 2014 +0000
- Parent:
- 1:d5bb7a2e46c2
- Commit message:
- Test for PinDetect Library; use "#define DIRECTINT" constant to compile two versions which show how the library works vs the actual InterruptIn library.
Changed in this revision
diff -r d5bb7a2e46c2 -r aca93337a0e1 C12832_lcd.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/C12832_lcd.lib Mon Feb 17 06:35:57 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/dreschpe/code/C12832_lcd/#468cdccff7af
diff -r d5bb7a2e46c2 -r aca93337a0e1 main.cpp --- a/main.cpp Sat Feb 15 07:24:47 2014 +0000 +++ b/main.cpp Mon Feb 17 06:35:57 2014 +0000 @@ -1,14 +1,94 @@ #include "mbed.h" #include "PinDetect.h" -// must import Cookbook PinDetct library into project -// URL: http://mbed.org/users/AjK/libraries/PinDetect/lkyxpw +#include "C12832_lcd.h" + +//Napoleon Leoni +//***************************************************************************// +//Test program for debounce on interrupt. Here I test the PinDetect Library // +//To check whether indeed the library is attaching the debounced pin to an // +//interrupt. The conclusion as shown below is that it is NOT!, the PinDetect // +//has some nice features like key_pressed or key_pressedheld detection // +//but they are all working on polling the specified debounced pin on a Timer // +//interrupt, which by default is set every 20 ms. This is not the same as // +//trigering an Interrupt on a leading or trailing edge of GPIO pin // +// +// +// TESTS RUN // +// I print to the LCD three important LPC1768 registers: +// ISER0..Interrupt set Enable register(address 0xE000E100), for this program +// the important bits are #4..Timer 3 interrupt and #21 External interrupt 3. +// Note that all GPIO interrupts are attached to the External Interrupt 3 +// hardware EINT3. contents of ISER0 are accesible via: *(NVIC->ISER) +// +// IntEnR..GPIO interrupt enable on rising, shows which pins are attached to EINT3 +// on their rising edge (these are only for mbed pins mapped to LPC pins on Port 0) +// its contents are available using th macro LPC_GPIOINT->IO0IntEnR +// IntEnF..GPIO interrupt enable on falling, shows which pins are attached to EINT3 +// on their falling edge (these are only for mbed pins mapped to LPC pins on Port 0) +// its contents are available using th macro LPC_GPIOINT->IO0IntEnF +// +// Note the mapping below of MBED pins to the IntEnR/IntEnF bits: +// IntEnR/IntEnF bit LPC GPIO MBED GPIO PIN +// 0 P[0].0 p9 +// 1 P[0].1 p10 +// 4 P[0].4 p30 +// 5 P[0].5 p29 +// 6 P[0].6 p8 +// 7 P[0].7 p7 +// 8 P[0].8 p6 +// 9 P[0].9 p5 +// 10 P[0].10 p28 +// 11 P[0].11 p27 +// 12 P[0].12 p27 +// 15 P[0].15 p13 +// 16 P[0].16 p14 +// 17 P[0].17 p12 +// 18 P[0].18 p11 +// 23 P[0].23 p15 +// 24 P[0].24 p16 +// 25 P[0].25 p17 +// 26 P[0].26 p18 +// 30 P[0].30 p19 +// 31 P[0].31 p20 +//*********************************************************************************** +// Test description Resulting Register Values Analysis +// 1 DIRECTINT not defined ISER0 0x0000 0010 No GPIO interrupts enabled nor attached +// so only pinDetect(14) IO0IntEnR 0x0000 0000 only TIMER 3 Interrupt enabled so the pinDetect +// is used IO0IntEnF 0x0000 0000 libary is simply polling the pin on a timer interrupt and +// debouncing it. +// +// 2 DIRECTINT defined ISER0 0x0020 0010(when enabled) GPIO interrupt is enabled and disabled periodically +// 0x0000 0010(when disabled) when disabled the joystick up/down motion does not trigger +// so we define InterruptIn IO0IntEnR 0x0080 0000 LED1 as expected, however the pindetect functionality continues +// on pins 12 and 15 IO0IntEnF 0x0002 0000 to work a further confirmation that the library is not working with +// an interrupt on the GPIO specified pin. Note that p15 is attached to +// a rising edge GPIO interrupt and p12 to a falling edge interrupt. +//*********************************************************************************** + +#define DIRECTINT //constant to compare interrupt registers when using pindetect vs. using InterrupIn library DigitalOut myled(LED1); DigitalOut myled2(LED2); DigitalOut myled3(LED3); DigitalOut myled4(LED4); +C12832_LCD lcd; -PinDetect pb(p14); // center of joystick +#ifdef DIRECTINT +InterruptIn down(p12); // DOWN of joystickn note that mbed p12 corresponds to lpc P0[17], should appear as 0x0002 0000 in register LPC_GPIOINT->IO0IntEnR/F +InterruptIn fire(p15); // up of joystickn note that mbed p15 corresponds to lpc P0[23], should appear as 0x0080 0000 in register LPC_GPIOINT->IO0IntEnR/F +#endif + + +PinDetect pb(p14); // center of joystickn note that mbed p14 corresponds to lpc P0[16] should appear as 0x0001 0000 in register LPC_GPIOINT->IO0IntEnR/F + +void ISR1() { //interrupt service routine used to turn on LED 1 on rising edge of joystick up + myled = 1; +} + +void ISR2() { //interrupt service routing used to turn off LED 1 on falling + myled = 0; +} + // SPST Pushbutton debounced count demo using interrupts and callback // no external PullUp resistor needed // Pushbutton from P8 to GND. @@ -25,8 +105,13 @@ myled3 = (count & 0x02)>>1; myled2 = (count & 0x04)>>2; } -int main() { +int main() +{ +#ifdef DIRECTINT + fire.rise(&ISR1); + down.fall(&ISR2); +#endif // Use internal pullup for pushbutton //pb.mode(PullUp); // don't do this for app board // Delay for initial pullup to take effect @@ -38,9 +123,29 @@ //Blink myled in main routine forever while responding to pb changes // via interrupts that activate the callback counter function + bool disableInterrupt=false; + int counter=0,tdelay=10; while (1) { - myled = !myled; - wait(.5); + wait(1); + lcd.cls(); + lcd.locate(0,1); + lcd.printf("ISER0=%#010X",*(NVIC->ISER)); //NVIC->ISER holds the address of the ISER0 register + lcd.locate(0,10); + lcd.printf("IO0 INTEN R=%#010X",LPC_GPIOINT->IO0IntEnR); //This address holds GPIO interrupt attach on rise edge state. + lcd.locate(0,20); + lcd.printf("IO0 INTEN F=%#010X",LPC_GPIOINT->IO0IntEnF ); //This address holds GPIO interrupt attach on falling edge state + +#ifdef DIRECTINT + //This section of coe periodically (every 10 seconds) toggles the external interrupt 3 EINT3 + //state between enabled and disabled. This is the hardware interrupt used for th GPIO pins + counter++; + if(counter>=tdelay){ + disableInterrupt=!disableInterrupt; + if(disableInterrupt) NVIC_DisableIRQ(EINT3_IRQn); //disable EINT3 + if(!disableInterrupt) NVIC_EnableIRQ(EINT3_IRQn); //re-enable EINT3 + counter=0; + } +#endif } } \ No newline at end of file
diff -r d5bb7a2e46c2 -r aca93337a0e1 mbed.bld --- a/mbed.bld Sat Feb 15 07:24:47 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912
diff -r d5bb7a2e46c2 -r aca93337a0e1 mbed.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.lib Mon Feb 17 06:35:57 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/#63bcd7ba4912