Kenneth Swanson
/
4180-lab1-basic-io
~
main.cpp@4:cdcf29f5d75b, 2016-09-12 (annotated)
- Committer:
- fkhan39
- Date:
- Mon Sep 12 21:18:43 2016 +0000
- Revision:
- 4:cdcf29f5d75b
- Parent:
- 2:f131a1777c54
watchdog timer
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kswanson31 | 0:f58f38896cfa | 1 | // code for part 1, 2, & 3 |
kswanson31 | 0:f58f38896cfa | 2 | #include "mbed.h" |
kswanson31 | 0:f58f38896cfa | 3 | #include "MCP23S17.h" |
kswanson31 | 0:f58f38896cfa | 4 | |
kswanson31 | 0:f58f38896cfa | 5 | // 1 |
kswanson31 | 1:cd5247f3a499 | 6 | DigitalIn dip_switch3(p30); |
kswanson31 | 1:cd5247f3a499 | 7 | DigitalOut red_led(p17); |
kswanson31 | 0:f58f38896cfa | 8 | // 2 |
kswanson31 | 1:cd5247f3a499 | 9 | DigitalIn dip_switch1(p28); |
kswanson31 | 1:cd5247f3a499 | 10 | DigitalIn dip_switch2(p29); |
kswanson31 | 1:cd5247f3a499 | 11 | PwmOut green_led(p21); |
kswanson31 | 0:f58f38896cfa | 12 | // 3 |
kswanson31 | 0:f58f38896cfa | 13 | SPI spi(p5, p6, p7); // SPI bus |
kswanson31 | 0:f58f38896cfa | 14 | char Opcode = 0x40; // 8-bit address for writes |
kswanson31 | 0:f58f38896cfa | 15 | MCP23S17 chip = MCP23S17(spi, p20, Opcode); // create an MCP23S17 |
kswanson31 | 0:f58f38896cfa | 16 | int switch_state; |
kswanson31 | 2:f131a1777c54 | 17 | // RGB led control |
kswanson31 | 1:cd5247f3a499 | 18 | AnalogIn control_pot(p18); |
kswanson31 | 1:cd5247f3a499 | 19 | PwmOut rgb_b(p22); |
kswanson31 | 1:cd5247f3a499 | 20 | PwmOut rgb_r(p23); |
kswanson31 | 1:cd5247f3a499 | 21 | PwmOut rgb_g(p24); |
fkhan39 | 4:cdcf29f5d75b | 22 | // WATCHDOG |
fkhan39 | 4:cdcf29f5d75b | 23 | DigitalOut myled1(LED1); //in main loop part 1 |
fkhan39 | 4:cdcf29f5d75b | 24 | DigitalOut myled2(LED2); //in main loop part 2 (where fault occurs) |
fkhan39 | 4:cdcf29f5d75b | 25 | DigitalOut myled3(LED3); //The pushbutton or power on caused a reset |
fkhan39 | 4:cdcf29f5d75b | 26 | DigitalOut myled4(LED4); //The watchdog timer caused a reset |
fkhan39 | 4:cdcf29f5d75b | 27 | |
fkhan39 | 4:cdcf29f5d75b | 28 | // Simon's Watchdog code from |
fkhan39 | 4:cdcf29f5d75b | 29 | // http://mbed.org/forum/mbed/topic/508/ |
fkhan39 | 4:cdcf29f5d75b | 30 | class Watchdog { |
fkhan39 | 4:cdcf29f5d75b | 31 | public: |
fkhan39 | 4:cdcf29f5d75b | 32 | // Load timeout value in watchdog timer and enable |
fkhan39 | 4:cdcf29f5d75b | 33 | void kick(float s) { |
fkhan39 | 4:cdcf29f5d75b | 34 | LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK |
fkhan39 | 4:cdcf29f5d75b | 35 | uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 |
fkhan39 | 4:cdcf29f5d75b | 36 | LPC_WDT->WDTC = s * (float)clk; |
fkhan39 | 4:cdcf29f5d75b | 37 | LPC_WDT->WDMOD = 0x3; // Enabled and Reset |
fkhan39 | 4:cdcf29f5d75b | 38 | kick(); |
fkhan39 | 4:cdcf29f5d75b | 39 | } |
fkhan39 | 4:cdcf29f5d75b | 40 | // "kick" or "feed" the dog - reset the watchdog timer |
fkhan39 | 4:cdcf29f5d75b | 41 | // by writing this required bit pattern |
fkhan39 | 4:cdcf29f5d75b | 42 | void kick() { |
fkhan39 | 4:cdcf29f5d75b | 43 | LPC_WDT->WDFEED = 0xAA; |
fkhan39 | 4:cdcf29f5d75b | 44 | LPC_WDT->WDFEED = 0x55; |
fkhan39 | 4:cdcf29f5d75b | 45 | } |
fkhan39 | 4:cdcf29f5d75b | 46 | }; |
fkhan39 | 4:cdcf29f5d75b | 47 | Watchdog wdt; |
kswanson31 | 0:f58f38896cfa | 48 | |
kswanson31 | 0:f58f38896cfa | 49 | int main() |
kswanson31 | 0:f58f38896cfa | 50 | { |
fkhan39 | 4:cdcf29f5d75b | 51 | int count = 0; |
fkhan39 | 4:cdcf29f5d75b | 52 | // On reset, indicate a watchdog reset or a pushbutton reset on LED 4 or 3 |
fkhan39 | 4:cdcf29f5d75b | 53 | if ((LPC_WDT->WDMOD >> 2) & 1) |
fkhan39 | 4:cdcf29f5d75b | 54 | myled4 = 1; else myled3 = 1; |
fkhan39 | 4:cdcf29f5d75b | 55 | |
fkhan39 | 4:cdcf29f5d75b | 56 | // setup a 10 second timeout on watchdog timer hardware |
fkhan39 | 4:cdcf29f5d75b | 57 | // needs to be longer than worst case main loop exection time |
fkhan39 | 4:cdcf29f5d75b | 58 | wdt.kick(5.0); |
kswanson31 | 0:f58f38896cfa | 59 | // 2 |
kswanson31 | 0:f58f38896cfa | 60 | dip_switch1.mode(PullUp); // configure internal pull up resistor |
kswanson31 | 0:f58f38896cfa | 61 | dip_switch2.mode(PullUp); |
kswanson31 | 0:f58f38896cfa | 62 | |
kswanson31 | 1:cd5247f3a499 | 63 | green_led.period(0.016f); // ~ 60 Hz |
kswanson31 | 1:cd5247f3a499 | 64 | green_led.write(0.50f); // 50 % duty cycle |
kswanson31 | 0:f58f38896cfa | 65 | |
kswanson31 | 0:f58f38896cfa | 66 | // 3 |
kswanson31 | 0:f58f38896cfa | 67 | chip.direction(PORT_A, 0x00); // set all Port A bits to output |
kswanson31 | 0:f58f38896cfa | 68 | chip.direction(PORT_B, 0xFF); // set all B to input |
kswanson31 | 0:f58f38896cfa | 69 | switch_state = 0; |
kswanson31 | 0:f58f38896cfa | 70 | |
kswanson31 | 0:f58f38896cfa | 71 | while(1) { |
kswanson31 | 0:f58f38896cfa | 72 | // 1 |
kswanson31 | 1:cd5247f3a499 | 73 | red_led = dip_switch3; |
kswanson31 | 0:f58f38896cfa | 74 | |
kswanson31 | 0:f58f38896cfa | 75 | // 2 |
kswanson31 | 0:f58f38896cfa | 76 | if (!dip_switch1) { |
kswanson31 | 1:cd5247f3a499 | 77 | green_led.write(0.25f); // half start brightness, half duty cycle |
kswanson31 | 0:f58f38896cfa | 78 | } |
kswanson31 | 0:f58f38896cfa | 79 | else if (!dip_switch2) { |
kswanson31 | 1:cd5247f3a499 | 80 | green_led.write(0.125f); // 1/4 starting brightness |
kswanson31 | 0:f58f38896cfa | 81 | } else { |
kswanson31 | 1:cd5247f3a499 | 82 | green_led.write(0.50f); // initial |
kswanson31 | 0:f58f38896cfa | 83 | } |
kswanson31 | 0:f58f38896cfa | 84 | |
kswanson31 | 0:f58f38896cfa | 85 | // 3 |
kswanson31 | 0:f58f38896cfa | 86 | // get the state of the switch (0 or 1) and flip it, 0 when off |
kswanson31 | 0:f58f38896cfa | 87 | switch_state = !chip.read(PORT_B) & 0x01; |
kswanson31 | 0:f58f38896cfa | 88 | // write the saved value to MCP23S17 Port A |
kswanson31 | 0:f58f38896cfa | 89 | chip.write(PORT_A, switch_state); |
kswanson31 | 0:f58f38896cfa | 90 | wait(.2); |
kswanson31 | 0:f58f38896cfa | 91 | // yellow led should change opposite the green led |
fkhan39 | 4:cdcf29f5d75b | 92 | if (count == 12) while (1) {}; |
fkhan39 | 4:cdcf29f5d75b | 93 | // LED 2 will stay on during the fault |
fkhan39 | 4:cdcf29f5d75b | 94 | count ++; |
fkhan39 | 4:cdcf29f5d75b | 95 | // End of main loop so "kick" to reset watchdog timer and avoid a reset |
fkhan39 | 4:cdcf29f5d75b | 96 | wdt.kick(); |
kswanson31 | 2:f131a1777c54 | 97 | // RGB led control |
kswanson31 | 1:cd5247f3a499 | 98 | rgb_r = control_pot; |
kswanson31 | 1:cd5247f3a499 | 99 | rgb_g = 0.5f - control_pot; |
kswanson31 | 1:cd5247f3a499 | 100 | rgb_b = 1.0f - control_pot; |
kswanson31 | 0:f58f38896cfa | 101 | } |
kswanson31 | 0:f58f38896cfa | 102 | } |