Lab that has to do with basic IO on mbed.

Dependencies:   DebounceIn mbed PinDetect

Committer:
Jesse Baker
Date:
Sun Jan 24 16:45:15 2016 -0500
Revision:
53:1c8235c49b70
Parent:
51:e12b3635afae
JB is about to test expansion

Who changed what in which revision?

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