Soheil Novinfard
/
digitalInInterrupt_modified
Interrupt - modified version
Fork of digitalInInterrupt_sample by
Diff: main.cpp
- Revision:
- 1:13e0c1956b54
- Parent:
- 0:a66a8cb0012c
- Child:
- 2:071f22412cdc
--- a/main.cpp Mon Jan 23 13:53:49 2017 +0000 +++ b/main.cpp Mon Jan 23 17:26:17 2017 +0000 @@ -1,65 +1,39 @@ #include "mbed.h" #include "rtos.h" -// Labs 2: Example program for polling an input -// -------------------------------------------- -// The program uses a thread to poll a digital input -// - The thread monitors the position of the button -// - When the button transitions up and down, a press event is signaled -// - Button bounce is guarded against -// A second thread checks for the press event and toggles the LED +// Labs 2: Example program for using an interrupt (or callback) +// ----------------------------------------------------------- +// A callback function (corresponding to an ISR) is called when a button +// is pressed +// The callback uses a shared variable to signal another thread -DigitalIn button(PTD0, PullUp); +InterruptIn button(PTD0); DigitalOut led(LED_RED); -Thread pollT ; // thread to poll -Thread flashT ; // thread to flash light -volatile int pressEvent = 0 ; // Variabe set by the polling thread +Thread flashT ; +volatile int pressEvent = 0 ; -enum buttonPos { up, down, bounce }; // Button positions -void polling() { - buttonPos pos = up ; - int bcounter = 0 ; - while (true) { - switch (pos) { - case up : - if (button == 1) { // now down - pressEvent = 1 ; // transition occurred - pos = down ; - } - break ; - case down : - if (button == 0) { // no longer down - bcounter = 3 ; // wait four cycles - pos = bounce ; - } - break ; - case bounce : - if (button == 1) { // down again - button has bounced - pos = down ; // no event - } else if (bcounter == 0) { - pos = up ; // delay passed - reset to up - } else { - bcounter-- ; // continue waiting - } - break ; - } - Thread::wait(30); - } +// Signal when the button is pressed +// Note: bounce may occur +void buttonCallback(){ + pressEvent = 1 ; } // Toggle the LED every time the button is pressed +// Note: the LED could be toggled in the callback void flash() { while(true) { if (pressEvent) { - pressEvent = 0 ; // clear the event variable led = !led ; + pressEvent = 0 ; // Clear the event variable } Thread::wait(100) ; } } int main() { - pollT.start(&polling) ; // start the polling thread running - flashT.start(&flash) ; // start the flashing thread running + button.mode(PullUp); // Ensure button i/p has pull up + button.rise(&buttonCallback) ; // Attach function to rise event + + flashT.start(&flash) ; // Start the flashing thread running } \ No newline at end of file