Paul Russell
/
buttons_InterruptIn
InteruptIn testing with ticker and uSerialDebug
main.cpp@1:c6699649a160, 2014-12-21 (annotated)
- Committer:
- prussell
- Date:
- Sun Dec 21 15:33:39 2014 +0000
- Revision:
- 1:c6699649a160
- Parent:
- 0:77bda1d2acca
All OK: Button Interrupts, LED PWM, USB Serial Debug.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
prussell | 1:c6699649a160 | 1 | //Simple testing of buttons and inputs |
prussell | 1:c6699649a160 | 2 | // "//a" = Alternate Good Test Code |
prussell | 0:77bda1d2acca | 3 | |
prussell | 1:c6699649a160 | 4 | #define ENABLE_uSerial 1 //PR: Enable Debug on mbed's USB Serial |
prussell | 0:77bda1d2acca | 5 | |
prussell | 0:77bda1d2acca | 6 | #include "mbed.h" |
prussell | 0:77bda1d2acca | 7 | |
prussell | 0:77bda1d2acca | 8 | //==========Debug Console========== |
prussell | 1:c6699649a160 | 9 | #if ENABLE_uSerial |
prussell | 1:c6699649a160 | 10 | //Restart TeraTerm just before Pressing Reset on mbed, Default Serual=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 | 1:c6699649a160 | 12 | //TeraTerm: http://en.sourceforge.jp/projects/ttssh2/releases/ |
prussell | 1:c6699649a160 | 13 | Serial debug_userial(USBTX, USBRX); //PR: DebugSerialOverMbedUSB |
prussell | 1:c6699649a160 | 14 | #define DEBUG(...) { debug_userial.printf(__VA_ARGS__); } |
prussell | 0:77bda1d2acca | 15 | #else |
prussell | 0:77bda1d2acca | 16 | #define DEBUG(...) //Do Nothing, DEBUG() lines are ignored |
prussell | 0:77bda1d2acca | 17 | #endif |
prussell | 0:77bda1d2acca | 18 | |
prussell | 0:77bda1d2acca | 19 | //========== IO Hardware: Buttons, LEDs, PWM ========== |
prussell | 0:77bda1d2acca | 20 | // Inputs: |
prussell | 1:c6699649a160 | 21 | DigitalIn bB1in(BUTTON1); //if(bB1in){} |
prussell | 1:c6699649a160 | 22 | DigitalIn bB2in(BUTTON2); //if(bB2in){} |
prussell | 1:c6699649a160 | 23 | InterruptIn B1int(BUTTON1); //B1int.rise(&onB1rise); |
prussell | 1:c6699649a160 | 24 | InterruptIn B2int(BUTTON2); //B1int.fall(&onB1fall); |
prussell | 0:77bda1d2acca | 25 | |
prussell | 0:77bda1d2acca | 26 | // Outputs: |
prussell | 1:c6699649a160 | 27 | DigitalOut bL1out(LED1); // Direct LED1 drive |
prussell | 1:c6699649a160 | 28 | //DigitalOut bL2out(LED2); // Direct LED2 drive |
prussell | 1:c6699649a160 | 29 | //PwmOut fL1pwm(LED1); float fL1level = 0.1; // PWM LED1, brightness=float(0.0~1.0) |
prussell | 1:c6699649a160 | 30 | PwmOut fL2pwm(LED2); float fL2level = 0.1; // PWM LED2, brightness=float(0.0~1.0) |
prussell | 0:77bda1d2acca | 31 | |
prussell | 1:c6699649a160 | 32 | //==========Functions: onButton Callbacks for InterruptIn for Buttons========== |
prussell | 1:c6699649a160 | 33 | // *When direct driving hardware consider adjusting drive within the onCallback to reduce response time |
prussell | 1:c6699649a160 | 34 | //TODO: Check need of volatile for changes in interrupts affecting variables in non-interrupt code? |
prussell | 1:c6699649a160 | 35 | volatile uint8_t uB1rise; void onB1rise(void){ uB1rise++; };// Flag Event, Counter helps detect missed events since last cleared |
prussell | 1:c6699649a160 | 36 | volatile uint8_t uB1fall; void onB1fall(void){ uB1fall++; };// Flag Event, Counter helps detect missed events since last cleared |
prussell | 1:c6699649a160 | 37 | volatile uint8_t uB2rise; void onB2rise(void){ uB2rise++; };// Flag Event, Counter helps detect missed events since last cleared |
prussell | 1:c6699649a160 | 38 | volatile uint8_t uB2fall; void onB2fall(void){ uB2fall++; };// Flag Event, Counter helps detect missed events since last cleared |
prussell | 0:77bda1d2acca | 39 | |
prussell | 0:77bda1d2acca | 40 | //==========Functions:Timer========== |
prussell | 0:77bda1d2acca | 41 | static volatile uint8_t uTicker1; //Volatile, don't optimize, changes under interrupt control |
prussell | 0:77bda1d2acca | 42 | void onTicker1(void) |
prussell | 0:77bda1d2acca | 43 | { |
prussell | 1:c6699649a160 | 44 | static uint32_t u32_Counter; |
prussell | 1:c6699649a160 | 45 | fL2level+=0.2; if (fL2level>0.5){fL2level = 0.0;}; fL2pwm=fL2level;//LED2=Ramp Blink |
prussell | 1:c6699649a160 | 46 | ++u32_Counter; |
prussell | 1:c6699649a160 | 47 | //DEBUG("onT(%u) ", u32_Counter); //Count of Ticker events to support long term timer evaluation |
prussell | 0:77bda1d2acca | 48 | uTicker1++; //PR: Flag: count of Ticker1 Events since last cleared (Helps detect missed events). |
prussell | 0:77bda1d2acca | 49 | } |
prussell | 0:77bda1d2acca | 50 | |
prussell | 0:77bda1d2acca | 51 | //========== main ========== |
prussell | 1:c6699649a160 | 52 | int main() |
prussell | 1:c6699649a160 | 53 | { |
prussell | 1:c6699649a160 | 54 | DEBUG("\n\nButtonsV05 - Direct and using InterruptIn, LED1=Button1, LED2 is PWM\n"); |
prussell | 1:c6699649a160 | 55 | DEBUG(" Built:[ %s %s ] Compiler: [ %s ] Version:[ %s ]\n", __DATE__, __TIME__, __VERSION__); |
prussell | 0:77bda1d2acca | 56 | |
prussell | 1:c6699649a160 | 57 | Ticker ticker1; //PR: Timer Object(Structure) |
prussell | 1:c6699649a160 | 58 | ticker1.attach(onTicker1, 0.5); //PR: Timer Handler, Float=PeriodSeconds |
prussell | 0:77bda1d2acca | 59 | |
prussell | 1:c6699649a160 | 60 | // Setup InterruptIn for Buttons |
prussell | 1:c6699649a160 | 61 | B1int.fall(&onB1fall);// Press Button1 |
prussell | 1:c6699649a160 | 62 | B1int.rise(&onB1rise);// Release Button1 |
prussell | 1:c6699649a160 | 63 | B2int.fall(&onB2fall);// Press Button2 |
prussell | 1:c6699649a160 | 64 | B2int.rise(&onB2rise);// Release Button2 |
prussell | 1:c6699649a160 | 65 | |
prussell | 0:77bda1d2acca | 66 | while(1) { |
prussell | 1:c6699649a160 | 67 | sleep(); // Wait for any interrupt, allows registered onCallback() for timer/buttons/etc. |
prussell | 1:c6699649a160 | 68 | bL1out=bB1in; //Direct LED1=Button1 |
prussell | 1:c6699649a160 | 69 | //a if(uTicker1){DEBUG("T%d ", uTicker1); uTicker1=0;} |
prussell | 1:c6699649a160 | 70 | if(uB1fall){ DEBUG("B1f%d ", uB1fall); uB1fall=0; } //PressB1 |
prussell | 1:c6699649a160 | 71 | if(uB1rise){ DEBUG("B1r%d ", uB1rise); uB1rise=0; } //ReleaseB1 |
prussell | 1:c6699649a160 | 72 | if(uB2fall){ DEBUG("B2f%d ", uB2fall); uB2fall=0; } //PressB2 |
prussell | 1:c6699649a160 | 73 | //a if(uB2rise){ DEBUG("B2r%d\n",uB2rise); uB2rise=0; } //ReleaseB2 == Newline |
prussell | 1:c6699649a160 | 74 | if(uB2rise){ DEBUG("B2r%d\nTicker%04d ",uB2rise, uTicker1); uB2rise=0; uTicker1=0;} //ReleaseB2, +Ticks |
prussell | 1:c6699649a160 | 75 | //DEBUG(" Loop "); // This can trigger a Serial Interrupt leading to continuous waking from sleep() |
prussell | 0:77bda1d2acca | 76 | } |
prussell | 0:77bda1d2acca | 77 | } |
prussell | 0:77bda1d2acca | 78 | //========== end main.cpp ========== |