InteruptIn testing with ticker and uSerialDebug

Dependencies:   mbed

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?

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