~

Dependencies:   MCP23S17 mbed

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?

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