Paul Russell
/
buttons_InterruptIn
InteruptIn testing with ticker and uSerialDebug
main.cpp@0:77bda1d2acca, 2014-12-20 (annotated)
- Committer:
- prussell
- Date:
- Sat Dec 20 15:02:40 2014 +0000
- Revision:
- 0:77bda1d2acca
- Child:
- 1:c6699649a160
InterruptIn testing with ticker and uSerialDebug
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
prussell | 0:77bda1d2acca | 1 | //Simple testing of InterruptIn |
prussell | 0:77bda1d2acca | 2 | |
prussell | 0:77bda1d2acca | 3 | #define ENABLE_SerialUSB_DEBUG_CONSOLE 1 //PR: Enable Debug on mbed's USB Serial Debug, Setup: Serial 9600,8,N,1,NoFlowControl (TeraTerm: http://en.sourceforge.jp/projects/ttssh2/releases/) |
prussell | 0:77bda1d2acca | 4 | |
prussell | 0:77bda1d2acca | 5 | #include "mbed.h" |
prussell | 0:77bda1d2acca | 6 | //#include "PinDetect.h" // Pin Input and Button Interupts |
prussell | 0:77bda1d2acca | 7 | |
prussell | 0:77bda1d2acca | 8 | //==========Debug Console========== |
prussell | 0:77bda1d2acca | 9 | #if ENABLE_SerialUSB_DEBUG_CONSOLE |
prussell | 0:77bda1d2acca | 10 | //Restart TeraTerm just before Pressing Reset on mbed, Default:9600-8N1(No Flow Control) |
prussell | 0:77bda1d2acca | 11 | //Using default baud rate to avoid issues with DEBUG in a constructor being at default baud rate before main() |
prussell | 0:77bda1d2acca | 12 | Serial debug_serial(USBTX, USBRX); //PR: DebugSerialOverMbedUSB |
prussell | 0:77bda1d2acca | 13 | #define DEBUG(...) { debug_serial.printf(__VA_ARGS__); } |
prussell | 0:77bda1d2acca | 14 | #else |
prussell | 0:77bda1d2acca | 15 | #define DEBUG(...) //Do Nothing, DEBUG() lines are ignored |
prussell | 0:77bda1d2acca | 16 | #endif |
prussell | 0:77bda1d2acca | 17 | |
prussell | 0:77bda1d2acca | 18 | //========== IO Hardware: Buttons, LEDs, PWM ========== |
prussell | 0:77bda1d2acca | 19 | // Inputs: |
prussell | 0:77bda1d2acca | 20 | //DigitalIn bB1in(BUTTON1); //if(bB1in){} |
prussell | 0:77bda1d2acca | 21 | DigitalIn bB2in(BUTTON2); //if(bB2in){} |
prussell | 0:77bda1d2acca | 22 | InterruptIn B1int(BUTTON1); //B1int.rise(&onB1rise); |
prussell | 0:77bda1d2acca | 23 | InterruptIn B2int(BUTTON2); |
prussell | 0:77bda1d2acca | 24 | //PinDetect B1detect(BUTTON1); //pin.mode( PullDown ); B1detect.attach_asserted( &onB1pressed ) |
prussell | 0:77bda1d2acca | 25 | //PinDetect B2detect(BUTTON2); |
prussell | 0:77bda1d2acca | 26 | |
prussell | 0:77bda1d2acca | 27 | // Outputs: |
prussell | 0:77bda1d2acca | 28 | //DigitalOut out_led1(LED1); //PR: Firmware heartbeat |
prussell | 0:77bda1d2acca | 29 | //DigitalOut out_led2(LED2); //PR: Firmware heartbeat |
prussell | 0:77bda1d2acca | 30 | //DigitalOut bL1out(LED1); |
prussell | 0:77bda1d2acca | 31 | DigitalOut bL2out(LED2); |
prussell | 0:77bda1d2acca | 32 | PwmOut fL1pwm(LED1); float fL1level = 0.1; //PR: LED with PWM Brightness, and Initial level (0.0~1.0) |
prussell | 0:77bda1d2acca | 33 | //PwmOut fL2pwm(LED2); float fL2level = 0.1; //PR: LED with PWM Brightness, and Initial level (0.0~1.0) |
prussell | 0:77bda1d2acca | 34 | |
prussell | 0:77bda1d2acca | 35 | //==========Functions: onButton Callbacks========== |
prussell | 0:77bda1d2acca | 36 | // *When direct driving hardware may be better to cut power within the on to reduce response time |
prussell | 0:77bda1d2acca | 37 | volatile uint8_t uB1rise; |
prussell | 0:77bda1d2acca | 38 | void onB1rise(void){ uB1rise++; }; //Flag Event, Counter helps detect missed events since last cleared |
prussell | 0:77bda1d2acca | 39 | volatile uint8_t uB1fall; |
prussell | 0:77bda1d2acca | 40 | void onB1fall(void){ uB1fall++; }; //Flag Event, Counter helps detect missed events since last cleared |
prussell | 0:77bda1d2acca | 41 | uint8_t uB2rise; //volatile? |
prussell | 0:77bda1d2acca | 42 | void onB2rise(void){ uB2rise++; }; //Flag Event, Counter helps detect missed events since last cleared |
prussell | 0:77bda1d2acca | 43 | uint8_t uB2fall; //volatile? |
prussell | 0:77bda1d2acca | 44 | void onB2fall(void){ uB2fall++; }; //Flag Event, Counter helps detect missed events since last cleared |
prussell | 0:77bda1d2acca | 45 | |
prussell | 0:77bda1d2acca | 46 | //==========Functions:Timer========== |
prussell | 0:77bda1d2acca | 47 | static volatile uint8_t uTicker1; //Volatile, don't optimize, changes under interrupt control |
prussell | 0:77bda1d2acca | 48 | Ticker ticker1; //PR: Timer Object(Structure) |
prussell | 0:77bda1d2acca | 49 | void onTicker1(void) |
prussell | 0:77bda1d2acca | 50 | { |
prussell | 0:77bda1d2acca | 51 | static uint32_t u32_Counter; // Counter for Debug Output |
prussell | 0:77bda1d2acca | 52 | fL1level+=0.2; if (fL1level>0.3){fL1level = 0.0;}; fL1pwm=fL1level;//PR: Ramp Blink |
prussell | 0:77bda1d2acca | 53 | DEBUG("onT(%u) ", ++u32_Counter); |
prussell | 0:77bda1d2acca | 54 | uTicker1++; //PR: Flag: count of Ticker1 Events since last cleared (Helps detect missed events). |
prussell | 0:77bda1d2acca | 55 | } |
prussell | 0:77bda1d2acca | 56 | |
prussell | 0:77bda1d2acca | 57 | //========== main ========== |
prussell | 0:77bda1d2acca | 58 | int main() { |
prussell | 0:77bda1d2acca | 59 | |
prussell | 0:77bda1d2acca | 60 | DEBUG("\n\nButtons\n"); |
prussell | 0:77bda1d2acca | 61 | |
prussell | 0:77bda1d2acca | 62 | ticker1.attach(onTicker1, 5.0); //PR: Timer Handler, Float=PeriodSeconds |
prussell | 0:77bda1d2acca | 63 | |
prussell | 0:77bda1d2acca | 64 | B1int.rise(&onB1rise); |
prussell | 0:77bda1d2acca | 65 | B1int.fall(&onB1fall); |
prussell | 0:77bda1d2acca | 66 | B2int.rise(&onB2rise); |
prussell | 0:77bda1d2acca | 67 | B2int.fall(&onB2fall); |
prussell | 0:77bda1d2acca | 68 | |
prussell | 0:77bda1d2acca | 69 | while(1) { |
prussell | 0:77bda1d2acca | 70 | sleep(); // Wait for any interrupt, allow onCallback() |
prussell | 0:77bda1d2acca | 71 | |
prussell | 0:77bda1d2acca | 72 | if(uTicker1){DEBUG("T%d\n", uTicker1); uTicker1=0;} |
prussell | 0:77bda1d2acca | 73 | if(uB1rise){ DEBUG("B1r%d ", uB1rise); uB1rise=0; } // (*When direct driving hardware may be better to cut power within the on to reduce response time) |
prussell | 0:77bda1d2acca | 74 | if(uB1fall){ DEBUG("B1f%d ", uB1fall); uB1fall=0; } |
prussell | 0:77bda1d2acca | 75 | if(uB2rise){ DEBUG("B2r%d ", uB2rise); uB2rise=0; } |
prussell | 0:77bda1d2acca | 76 | if(uB2fall){ DEBUG("B2f%d ", uB2fall); uB2fall=0; } |
prussell | 0:77bda1d2acca | 77 | |
prussell | 0:77bda1d2acca | 78 | //DEBUG(" Loop\n"); // This can trigger a Serial Interrupt |
prussell | 0:77bda1d2acca | 79 | |
prussell | 0:77bda1d2acca | 80 | bL2out=bB2in; //OK: Direct feedback when sampled - This only works with short wait(time) |
prussell | 0:77bda1d2acca | 81 | |
prussell | 0:77bda1d2acca | 82 | //a led2out=B2in; //OK: Direct feedback when sampled |
prussell | 0:77bda1d2acca | 83 | //wait(0.2); |
prussell | 0:77bda1d2acca | 84 | } |
prussell | 0:77bda1d2acca | 85 | } |
prussell | 0:77bda1d2acca | 86 | |
prussell | 0:77bda1d2acca | 87 | //========== end main.cpp ========== |
prussell | 0:77bda1d2acca | 88 | |
prussell | 0:77bda1d2acca | 89 | //======================== |
prussell | 0:77bda1d2acca | 90 | #ifdef NOT_DEFINED //pindetect |
prussell | 0:77bda1d2acca | 91 | #include "mbed.h" |
prussell | 0:77bda1d2acca | 92 | #include "PinDetect.h" |
prussell | 0:77bda1d2acca | 93 | |
prussell | 0:77bda1d2acca | 94 | PinDetect pin ( p21 ); |
prussell | 0:77bda1d2acca | 95 | DigitalOut led1( LED1 ); |
prussell | 0:77bda1d2acca | 96 | DigitalOut led2( LED2 ); |
prussell | 0:77bda1d2acca | 97 | DigitalOut led3( LED3 ); |
prussell | 0:77bda1d2acca | 98 | DigitalOut led4( LED4 ); |
prussell | 0:77bda1d2acca | 99 | |
prussell | 0:77bda1d2acca | 100 | /* |
prussell | 0:77bda1d2acca | 101 | * Note, the PinDetect can be defined thus:- |
prussell | 0:77bda1d2acca | 102 | * PinDetect pin( p21, PullDown ); |
prussell | 0:77bda1d2acca | 103 | * This allows you to specify the DigitalIn pinmode |
prussell | 0:77bda1d2acca | 104 | * when you create the PinDetect object. This means |
prussell | 0:77bda1d2acca | 105 | * using pin.mode() later is then no longer required. |
prussell | 0:77bda1d2acca | 106 | */ |
prussell | 0:77bda1d2acca | 107 | |
prussell | 0:77bda1d2acca | 108 | // C function ons follow. |
prussell | 0:77bda1d2acca | 109 | |
prussell | 0:77bda1d2acca | 110 | void keyPressed( void ) { |
prussell | 0:77bda1d2acca | 111 | led2 = 1; |
prussell | 0:77bda1d2acca | 112 | led3 = 0; |
prussell | 0:77bda1d2acca | 113 | led4 = 0; |
prussell | 0:77bda1d2acca | 114 | } |
prussell | 0:77bda1d2acca | 115 | |
prussell | 0:77bda1d2acca | 116 | void keyReleased( void ) { |
prussell | 0:77bda1d2acca | 117 | led2 = 0; |
prussell | 0:77bda1d2acca | 118 | led3 = 0; |
prussell | 0:77bda1d2acca | 119 | led4 = 0; |
prussell | 0:77bda1d2acca | 120 | } |
prussell | 0:77bda1d2acca | 121 | |
prussell | 0:77bda1d2acca | 122 | void keyPressedHeld( void ) { |
prussell | 0:77bda1d2acca | 123 | led3 = 1; |
prussell | 0:77bda1d2acca | 124 | } |
prussell | 0:77bda1d2acca | 125 | |
prussell | 0:77bda1d2acca | 126 | void keyReleasedHeld( void ) { |
prussell | 0:77bda1d2acca | 127 | led4 = 1; |
prussell | 0:77bda1d2acca | 128 | } |
prussell | 0:77bda1d2acca | 129 | |
prussell | 0:77bda1d2acca | 130 | // The main program. |
prussell | 0:77bda1d2acca | 131 | |
prussell | 0:77bda1d2acca | 132 | int main() { |
prussell | 0:77bda1d2acca | 133 | |
prussell | 0:77bda1d2acca | 134 | pin.mode( PullDown ); |
prussell | 0:77bda1d2acca | 135 | pin.attach_asserted( &keyPressed ); |
prussell | 0:77bda1d2acca | 136 | pin.attach_deasserted( &keyReleased ); |
prussell | 0:77bda1d2acca | 137 | pin.attach_asserted_held( &keyPressedHeld ); |
prussell | 0:77bda1d2acca | 138 | |
prussell | 0:77bda1d2acca | 139 | // This on will often be of little use as it's |
prussell | 0:77bda1d2acca | 140 | // called after every assertion/deassertion. However, |
prussell | 0:77bda1d2acca | 141 | // it's provided for completeness. You may find a use |
prussell | 0:77bda1d2acca | 142 | // for it. If not, just don't attach a on and it |
prussell | 0:77bda1d2acca | 143 | // will not activate. |
prussell | 0:77bda1d2acca | 144 | pin.attach_deasserted_held( &keyReleasedHeld ); |
prussell | 0:77bda1d2acca | 145 | |
prussell | 0:77bda1d2acca | 146 | // You can define how many continuous samples must be |
prussell | 0:77bda1d2acca | 147 | // asserted before the attach_asserted() function is called. |
prussell | 0:77bda1d2acca | 148 | // pin.setSamplesTillAssert( 10 ); |
prussell | 0:77bda1d2acca | 149 | // This would mean 10 * 20ms debounce time = 200ms. |
prussell | 0:77bda1d2acca | 150 | |
prussell | 0:77bda1d2acca | 151 | // You can define how many continuous samples must be |
prussell | 0:77bda1d2acca | 152 | // asserted before the attach_asserted_held() function is called. |
prussell | 0:77bda1d2acca | 153 | // pin.setSamplesTillHeld( 200 ); |
prussell | 0:77bda1d2acca | 154 | // This would mean 200 * 20ms debounce time = 2seconds. |
prussell | 0:77bda1d2acca | 155 | |
prussell | 0:77bda1d2acca | 156 | // By default, "asserted" assumes the pin going high from 0volts to 5volts |
prussell | 0:77bda1d2acca | 157 | // and deasserted assumes going from 5volts to 0volts. You can invert this |
prussell | 0:77bda1d2acca | 158 | // logic so that going to 0volts is asserted and going to 5volts is deasserted |
prussell | 0:77bda1d2acca | 159 | // using this setup function:- |
prussell | 0:77bda1d2acca | 160 | // pin.setAssertValue( 0 ); |
prussell | 0:77bda1d2acca | 161 | |
prussell | 0:77bda1d2acca | 162 | // Sampling does NOT begin until you set the frequency. So, until |
prussell | 0:77bda1d2acca | 163 | // you call this function NO ons will be made. With no arguments |
prussell | 0:77bda1d2acca | 164 | // passed the default is 20000 microseconds (20ms). Specifiy the sampling |
prussell | 0:77bda1d2acca | 165 | // period in microseconds if you want a different value to 20ms. |
prussell | 0:77bda1d2acca | 166 | // For example, for a sampling period of 10ms do:- |
prussell | 0:77bda1d2acca | 167 | // pin.setSampleFrequency( 10000 ); |
prussell | 0:77bda1d2acca | 168 | // Note, if you change the sampling frequency you will probably also |
prussell | 0:77bda1d2acca | 169 | // want to change the number of samples till assert and held as show |
prussell | 0:77bda1d2acca | 170 | // above. |
prussell | 0:77bda1d2acca | 171 | pin.setSampleFrequency(); // Defaults to 20ms. |
prussell | 0:77bda1d2acca | 172 | |
prussell | 0:77bda1d2acca | 173 | while( 1 ) { |
prussell | 0:77bda1d2acca | 174 | led1 = !led1; |
prussell | 0:77bda1d2acca | 175 | wait( 0.2 ); |
prussell | 0:77bda1d2acca | 176 | } |
prussell | 0:77bda1d2acca | 177 | } |
prussell | 0:77bda1d2acca | 178 | |
prussell | 0:77bda1d2acca | 179 | #endif //pindetect |