Lab that has to do with basic IO on mbed.
Dependencies: DebounceIn mbed PinDetect
Diff: GeorgesLab1/GeorgeMain.cpp
- Revision:
- 47:0efd125c7f2d
- Child:
- 49:f2081d0f5eec
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GeorgesLab1/GeorgeMain.cpp Sat Jan 23 06:44:49 2016 +0000 @@ -0,0 +1,130 @@ + /* +#include "mbed.h" +#include "DebounceIn.h" +#include "PinDetect.h" +#include <algorithm> +#include "math.h" +using namespace std; + + +PinDetect pb(p20); +DigitalOut myled1(LED1); +DigitalOut myled2(LED2); +DigitalOut myled3(LED3); +DigitalOut myled4(LED4); +PwmOut discrete_led(p21); +AnalogIn voltage_reg(p17); + +DigitalOut latch(p15); +SPI spi(p11, p12, p13); + +int RGB_val[3] = {0,0,0}; + +void RGB_intensity(float voltage) { + float min_ = 0; + float max_ = 1000; + float ratio = 2 * (voltage-min_)/(max_-min_); + float b = max(float(0), 1000*(1-ratio)); + float r = max(float(0), 1000*(ratio-1)); + float g = float(1000) - b - r; + if (r<0) {r=0;} + if (g<0) {g=0;} + if (b<0) {b=0;} + RGB_val[0] = int(r); + RGB_val[1] = int(g); + RGB_val[2] = int(b); +} + +void RGB_LED(int red, int green, int blue) { + unsigned int overallColor = 0; + unsigned short int MSB = 0; + unsigned short int LSB = 0; + overallColor = (((blue<<10)|red)<<10)|(green); + MSB = (overallColor>>16); + LSB = overallColor; + spi.write(MSB); + spi.write(LSB); + latch=1; + latch=0; +} + +class Watchdog { +public: +// Load timeout value in watchdog timer and enable + void kick(float s) { + LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK + uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 + LPC_WDT->WDTC = s * (float)clk; + LPC_WDT->WDMOD = 0x3; // Enabled and Reset + kick(); + } +// "kick" or "feed" the dog - reset the watchdog timer +// by writing this required bit pattern + void kick() { + LPC_WDT->WDFEED = 0xAA; + LPC_WDT->WDFEED = 0x55; + } +}; + + +Watchdog wdt; + +int main() { + + float brightness = 0; + pb.mode(PullUp); + + if (pb) { + spi.format(16,0); + spi.frequency(1000000); + latch=0; + wait(2); + while(1) { + //code for red led + brightness = voltage_reg; + myled1 = !pb; + if (!pb) { + discrete_led.write(brightness); + } + else{ + discrete_led.write(0); + } + + //code for multicolor led + float heatmapColor = voltage_reg.read()*float(1000); + if (heatmapColor < 0) {heatmapColor=0;} + RGB_intensity(heatmapColor); + RGB_LED(RGB_val[0], RGB_val[1], RGB_val[2]); + //wait(.2); + } + + } + else { + int count = 0; + // On reset, indicate a watchdog reset or a pushbutton reset on LED 4 or 3 + if ((LPC_WDT->WDMOD >> 2) & 1) + myled4 = 1; else myled3 = 1; + + // setup a 10 second timeout on watchdog timer hardware + // needs to be longer than worst case main loop exection time + wdt.kick(10.0); + + // Main program loop - resets watchdog once each loop iteration + // Would typically have a lot of code in loop with many calls + while (1) { + myled1 = 1; //Flash LEDs 1 & 2 to indicate normal loop activity + wait(.05); + myled1 = 0; + myled2 = 1; + wait(.05); + // Simulate a fault lock up with an infinite while loop, but only after 25 loop iterations + if (count == 25) while (1) {}; + // LED 2 will stay on during the fault + myled2 = 0; + count ++; + // End of main loop so "kick" to reset watchdog timer and avoid a reset + wdt.kick(); + } + } +} +// */