InteruptIn testing with ticker and uSerialDebug

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 ==========