
Lab that has to do with basic IO on mbed.
Dependencies: DebounceIn mbed PinDetect
GeorgesLab1/GeorgeMain.cpp@51:e12b3635afae, 2016-01-24 (annotated)
- Committer:
- Jesse Baker
- Date:
- Sun Jan 24 16:32:04 2016 -0500
- Revision:
- 51:e12b3635afae
- Parent:
- 50:9201ce9854dc
trying to demo joystick
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jesse Baker |
51:e12b3635afae | 1 | /* |
gtzintzarov3 | 50:9201ce9854dc | 2 | #include "mbed.h" |
gtzintzarov3 | 47:0efd125c7f2d | 3 | #include "DebounceIn.h" |
gtzintzarov3 | 47:0efd125c7f2d | 4 | #include "PinDetect.h" |
gtzintzarov3 | 47:0efd125c7f2d | 5 | #include <algorithm> |
gtzintzarov3 | 47:0efd125c7f2d | 6 | #include "math.h" |
gtzintzarov3 | 47:0efd125c7f2d | 7 | using namespace std; |
gtzintzarov3 | 47:0efd125c7f2d | 8 | |
gtzintzarov3 | 47:0efd125c7f2d | 9 | |
gtzintzarov3 | 47:0efd125c7f2d | 10 | PinDetect pb(p20); |
gtzintzarov3 | 49:f2081d0f5eec | 11 | PinDetect assemblyPB(p28); |
gtzintzarov3 | 47:0efd125c7f2d | 12 | DigitalOut myled1(LED1); |
Jesse Baker |
51:e12b3635afae | 13 | DigitalOut myled2(LED2); |
Jesse Baker |
51:e12b3635afae | 14 | DigitalOut myled3(LED3); |
gtzintzarov3 | 47:0efd125c7f2d | 15 | DigitalOut myled4(LED4); |
gtzintzarov3 | 49:f2081d0f5eec | 16 | DigitalOut assemblyLED(p30); |
gtzintzarov3 | 47:0efd125c7f2d | 17 | PwmOut discrete_led(p21); |
gtzintzarov3 | 47:0efd125c7f2d | 18 | AnalogIn voltage_reg(p17); |
gtzintzarov3 | 47:0efd125c7f2d | 19 | |
gtzintzarov3 | 47:0efd125c7f2d | 20 | DigitalOut latch(p15); |
gtzintzarov3 | 47:0efd125c7f2d | 21 | SPI spi(p11, p12, p13); |
gtzintzarov3 | 47:0efd125c7f2d | 22 | |
gtzintzarov3 | 47:0efd125c7f2d | 23 | int RGB_val[3] = {0,0,0}; |
gtzintzarov3 | 49:f2081d0f5eec | 24 | // declare external assembly language function (in a *.s file) |
gtzintzarov3 | 49:f2081d0f5eec | 25 | extern "C" int my_asm(int value); |
gtzintzarov3 | 47:0efd125c7f2d | 26 | |
gtzintzarov3 | 47:0efd125c7f2d | 27 | void RGB_intensity(float voltage) { |
gtzintzarov3 | 47:0efd125c7f2d | 28 | float min_ = 0; |
gtzintzarov3 | 47:0efd125c7f2d | 29 | float max_ = 1000; |
gtzintzarov3 | 47:0efd125c7f2d | 30 | float ratio = 2 * (voltage-min_)/(max_-min_); |
gtzintzarov3 | 47:0efd125c7f2d | 31 | float b = max(float(0), 1000*(1-ratio)); |
gtzintzarov3 | 47:0efd125c7f2d | 32 | float r = max(float(0), 1000*(ratio-1)); |
gtzintzarov3 | 47:0efd125c7f2d | 33 | float g = float(1000) - b - r; |
gtzintzarov3 | 47:0efd125c7f2d | 34 | if (r<0) {r=0;} |
gtzintzarov3 | 47:0efd125c7f2d | 35 | if (g<0) {g=0;} |
gtzintzarov3 | 47:0efd125c7f2d | 36 | if (b<0) {b=0;} |
gtzintzarov3 | 47:0efd125c7f2d | 37 | RGB_val[0] = int(r); |
gtzintzarov3 | 47:0efd125c7f2d | 38 | RGB_val[1] = int(g); |
gtzintzarov3 | 47:0efd125c7f2d | 39 | RGB_val[2] = int(b); |
gtzintzarov3 | 47:0efd125c7f2d | 40 | } |
gtzintzarov3 | 47:0efd125c7f2d | 41 | |
gtzintzarov3 | 47:0efd125c7f2d | 42 | void RGB_LED(int red, int green, int blue) { |
gtzintzarov3 | 47:0efd125c7f2d | 43 | unsigned int overallColor = 0; |
gtzintzarov3 | 47:0efd125c7f2d | 44 | unsigned short int MSB = 0; |
gtzintzarov3 | 47:0efd125c7f2d | 45 | unsigned short int LSB = 0; |
gtzintzarov3 | 47:0efd125c7f2d | 46 | overallColor = (((blue<<10)|red)<<10)|(green); |
gtzintzarov3 | 47:0efd125c7f2d | 47 | MSB = (overallColor>>16); |
gtzintzarov3 | 47:0efd125c7f2d | 48 | LSB = overallColor; |
gtzintzarov3 | 47:0efd125c7f2d | 49 | spi.write(MSB); |
gtzintzarov3 | 47:0efd125c7f2d | 50 | spi.write(LSB); |
gtzintzarov3 | 47:0efd125c7f2d | 51 | latch=1; |
gtzintzarov3 | 47:0efd125c7f2d | 52 | latch=0; |
gtzintzarov3 | 47:0efd125c7f2d | 53 | } |
gtzintzarov3 | 47:0efd125c7f2d | 54 | |
gtzintzarov3 | 47:0efd125c7f2d | 55 | class Watchdog { |
gtzintzarov3 | 47:0efd125c7f2d | 56 | public: |
gtzintzarov3 | 47:0efd125c7f2d | 57 | // Load timeout value in watchdog timer and enable |
gtzintzarov3 | 47:0efd125c7f2d | 58 | void kick(float s) { |
gtzintzarov3 | 47:0efd125c7f2d | 59 | LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK |
gtzintzarov3 | 47:0efd125c7f2d | 60 | uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 |
gtzintzarov3 | 47:0efd125c7f2d | 61 | LPC_WDT->WDTC = s * (float)clk; |
gtzintzarov3 | 47:0efd125c7f2d | 62 | LPC_WDT->WDMOD = 0x3; // Enabled and Reset |
gtzintzarov3 | 47:0efd125c7f2d | 63 | kick(); |
gtzintzarov3 | 47:0efd125c7f2d | 64 | } |
gtzintzarov3 | 47:0efd125c7f2d | 65 | // "kick" or "feed" the dog - reset the watchdog timer |
gtzintzarov3 | 47:0efd125c7f2d | 66 | // by writing this required bit pattern |
gtzintzarov3 | 47:0efd125c7f2d | 67 | void kick() { |
gtzintzarov3 | 47:0efd125c7f2d | 68 | LPC_WDT->WDFEED = 0xAA; |
gtzintzarov3 | 47:0efd125c7f2d | 69 | LPC_WDT->WDFEED = 0x55; |
gtzintzarov3 | 47:0efd125c7f2d | 70 | } |
gtzintzarov3 | 47:0efd125c7f2d | 71 | }; |
gtzintzarov3 | 47:0efd125c7f2d | 72 | |
gtzintzarov3 | 47:0efd125c7f2d | 73 | |
gtzintzarov3 | 47:0efd125c7f2d | 74 | Watchdog wdt; |
gtzintzarov3 | 47:0efd125c7f2d | 75 | |
gtzintzarov3 | 49:f2081d0f5eec | 76 | |
gtzintzarov3 | 47:0efd125c7f2d | 77 | int main() { |
Jesse Baker |
51:e12b3635afae | 78 | |
gtzintzarov3 | 49:f2081d0f5eec | 79 | pb.mode(PullUp); |
gtzintzarov3 | 49:f2081d0f5eec | 80 | assemblyPB.mode(PullUp); |
Jesse Baker |
51:e12b3635afae | 81 | |
gtzintzarov3 | 47:0efd125c7f2d | 82 | float brightness = 0; |
Jesse Baker |
51:e12b3635afae | 83 | |
Jesse Baker |
51:e12b3635afae | 84 | |
gtzintzarov3 | 47:0efd125c7f2d | 85 | if (pb) { |
gtzintzarov3 | 47:0efd125c7f2d | 86 | spi.format(16,0); |
gtzintzarov3 | 47:0efd125c7f2d | 87 | spi.frequency(1000000); |
gtzintzarov3 | 47:0efd125c7f2d | 88 | latch=0; |
gtzintzarov3 | 47:0efd125c7f2d | 89 | wait(2); |
gtzintzarov3 | 47:0efd125c7f2d | 90 | while(1) { |
Jesse Baker |
51:e12b3635afae | 91 | |
gtzintzarov3 | 49:f2081d0f5eec | 92 | //Assembly green LED |
gtzintzarov3 | 49:f2081d0f5eec | 93 | my_asm(!assemblyPB); |
Jesse Baker |
51:e12b3635afae | 94 | |
gtzintzarov3 | 47:0efd125c7f2d | 95 | //code for red led |
gtzintzarov3 | 47:0efd125c7f2d | 96 | brightness = voltage_reg; |
gtzintzarov3 | 47:0efd125c7f2d | 97 | myled1 = !pb; |
gtzintzarov3 | 47:0efd125c7f2d | 98 | if (!pb) { |
gtzintzarov3 | 47:0efd125c7f2d | 99 | discrete_led.write(brightness); |
gtzintzarov3 | 47:0efd125c7f2d | 100 | } |
gtzintzarov3 | 47:0efd125c7f2d | 101 | else{ |
gtzintzarov3 | 47:0efd125c7f2d | 102 | discrete_led.write(0); |
gtzintzarov3 | 47:0efd125c7f2d | 103 | } |
Jesse Baker |
51:e12b3635afae | 104 | |
gtzintzarov3 | 47:0efd125c7f2d | 105 | //code for multicolor led |
gtzintzarov3 | 47:0efd125c7f2d | 106 | float heatmapColor = voltage_reg.read()*float(1000); |
gtzintzarov3 | 47:0efd125c7f2d | 107 | if (heatmapColor < 0) {heatmapColor=0;} |
gtzintzarov3 | 47:0efd125c7f2d | 108 | RGB_intensity(heatmapColor); |
gtzintzarov3 | 47:0efd125c7f2d | 109 | RGB_LED(RGB_val[0], RGB_val[1], RGB_val[2]); |
gtzintzarov3 | 47:0efd125c7f2d | 110 | //wait(.2); |
gtzintzarov3 | 47:0efd125c7f2d | 111 | } |
Jesse Baker |
51:e12b3635afae | 112 | |
gtzintzarov3 | 47:0efd125c7f2d | 113 | } |
gtzintzarov3 | 47:0efd125c7f2d | 114 | else { |
gtzintzarov3 | 47:0efd125c7f2d | 115 | int count = 0; |
gtzintzarov3 | 47:0efd125c7f2d | 116 | // On reset, indicate a watchdog reset or a pushbutton reset on LED 4 or 3 |
gtzintzarov3 | 47:0efd125c7f2d | 117 | if ((LPC_WDT->WDMOD >> 2) & 1) |
gtzintzarov3 | 47:0efd125c7f2d | 118 | myled4 = 1; else myled3 = 1; |
Jesse Baker |
51:e12b3635afae | 119 | |
gtzintzarov3 | 47:0efd125c7f2d | 120 | // setup a 10 second timeout on watchdog timer hardware |
gtzintzarov3 | 47:0efd125c7f2d | 121 | // needs to be longer than worst case main loop exection time |
Jesse Baker |
51:e12b3635afae | 122 | wdt.kick(10.0); |
Jesse Baker |
51:e12b3635afae | 123 | |
Jesse Baker |
51:e12b3635afae | 124 | // Main program loop - resets watchdog once each loop iteration |
gtzintzarov3 | 47:0efd125c7f2d | 125 | // Would typically have a lot of code in loop with many calls |
gtzintzarov3 | 47:0efd125c7f2d | 126 | while (1) { |
gtzintzarov3 | 49:f2081d0f5eec | 127 | //Assembly Green LED |
gtzintzarov3 | 49:f2081d0f5eec | 128 | my_asm(!assemblyPB); |
Jesse Baker |
51:e12b3635afae | 129 | |
gtzintzarov3 | 47:0efd125c7f2d | 130 | myled1 = 1; //Flash LEDs 1 & 2 to indicate normal loop activity |
gtzintzarov3 | 47:0efd125c7f2d | 131 | wait(.05); |
gtzintzarov3 | 47:0efd125c7f2d | 132 | myled1 = 0; |
gtzintzarov3 | 47:0efd125c7f2d | 133 | myled2 = 1; |
gtzintzarov3 | 47:0efd125c7f2d | 134 | wait(.05); |
gtzintzarov3 | 47:0efd125c7f2d | 135 | // Simulate a fault lock up with an infinite while loop, but only after 25 loop iterations |
gtzintzarov3 | 47:0efd125c7f2d | 136 | if (count == 25) while (1) {}; |
gtzintzarov3 | 47:0efd125c7f2d | 137 | // LED 2 will stay on during the fault |
gtzintzarov3 | 47:0efd125c7f2d | 138 | myled2 = 0; |
gtzintzarov3 | 47:0efd125c7f2d | 139 | count ++; |
gtzintzarov3 | 47:0efd125c7f2d | 140 | // End of main loop so "kick" to reset watchdog timer and avoid a reset |
gtzintzarov3 | 47:0efd125c7f2d | 141 | wdt.kick(); |
gtzintzarov3 | 47:0efd125c7f2d | 142 | } |
gtzintzarov3 | 47:0efd125c7f2d | 143 | } |
gtzintzarov3 | 47:0efd125c7f2d | 144 | } |
gtzintzarov3 | 49:f2081d0f5eec | 145 | // */ |