Kenneth Swanson / Mbed 2 deprecated 4180-lab1-basic-io

Dependencies:   MCP23S17 mbed

Committer:
fkhan39
Date:
Mon Sep 12 19:43:57 2016 +0000
Revision:
3:30be02620bad
Parent:
1:cd5247f3a499
added watchdog timer to lab 1

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 1:cd5247f3a499 17 // Analog 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 3:30be02620bad 22 // WATCHDOG
fkhan39 3:30be02620bad 23 DigitalOut myled3(LED3);
fkhan39 3:30be02620bad 24 DigitalOut myled4(LED4);
fkhan39 3:30be02620bad 25 // http://mbed.org/forum/mbed/topic/508/ (Simon)
fkhan39 3:30be02620bad 26 class Watchdog {
fkhan39 3:30be02620bad 27 public:
fkhan39 3:30be02620bad 28 // Load timeout value in watchdog timer and enable
fkhan39 3:30be02620bad 29 void kick(float s) {
fkhan39 3:30be02620bad 30 LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK
fkhan39 3:30be02620bad 31 uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4
fkhan39 3:30be02620bad 32 LPC_WDT->WDTC = s * (float)clk;
fkhan39 3:30be02620bad 33 LPC_WDT->WDMOD = 0x3; // Enabled and Reset
fkhan39 3:30be02620bad 34 kick();
fkhan39 3:30be02620bad 35 }
fkhan39 3:30be02620bad 36 // "kick" or "feed" the dog - reset the watchdog timer
fkhan39 3:30be02620bad 37 // by writing this required bit pattern
fkhan39 3:30be02620bad 38 void kick() {
fkhan39 3:30be02620bad 39 LPC_WDT->WDFEED = 0xAA;
fkhan39 3:30be02620bad 40 LPC_WDT->WDFEED = 0x55;
fkhan39 3:30be02620bad 41 }
fkhan39 3:30be02620bad 42 };
fkhan39 3:30be02620bad 43 Watchdog wdt;
kswanson31 0:f58f38896cfa 44
kswanson31 0:f58f38896cfa 45 int main()
kswanson31 0:f58f38896cfa 46 {
kswanson31 0:f58f38896cfa 47 // 2
kswanson31 0:f58f38896cfa 48 dip_switch1.mode(PullUp); // configure internal pull up resistor
kswanson31 0:f58f38896cfa 49 dip_switch2.mode(PullUp);
kswanson31 0:f58f38896cfa 50
kswanson31 1:cd5247f3a499 51 green_led.period(0.016f); // ~ 60 Hz
kswanson31 1:cd5247f3a499 52 green_led.write(0.50f); // 50 % duty cycle
kswanson31 0:f58f38896cfa 53
kswanson31 0:f58f38896cfa 54 // 3
kswanson31 0:f58f38896cfa 55 chip.direction(PORT_A, 0x00); // set all Port A bits to output
kswanson31 0:f58f38896cfa 56 chip.direction(PORT_B, 0xFF); // set all B to input
kswanson31 0:f58f38896cfa 57 switch_state = 0;
kswanson31 0:f58f38896cfa 58
fkhan39 3:30be02620bad 59 // WATCHDOG
fkhan39 3:30be02620bad 60 int count = 0;
fkhan39 3:30be02620bad 61 // On reset, indicate a watchdog reset or a pushbutton reset on LED 4 or 3
fkhan39 3:30be02620bad 62 if ((LPC_WDT->WDMOD >> 2) & 1)
fkhan39 3:30be02620bad 63 myled4 = 1; else myled3 = 1;
fkhan39 3:30be02620bad 64
fkhan39 3:30be02620bad 65 // setup a 10 second timeout on watchdog timer hardware
fkhan39 3:30be02620bad 66 // needs to be longer than worst case main loop exection time
fkhan39 3:30be02620bad 67 wdt.kick(5.0);
fkhan39 3:30be02620bad 68
kswanson31 0:f58f38896cfa 69 while(1) {
kswanson31 0:f58f38896cfa 70 // 1
kswanson31 1:cd5247f3a499 71 red_led = dip_switch3;
kswanson31 0:f58f38896cfa 72
kswanson31 0:f58f38896cfa 73 // 2
kswanson31 0:f58f38896cfa 74 if (!dip_switch1) {
kswanson31 1:cd5247f3a499 75 green_led.write(0.25f); // half start brightness, half duty cycle
kswanson31 0:f58f38896cfa 76 }
kswanson31 0:f58f38896cfa 77 else if (!dip_switch2) {
kswanson31 1:cd5247f3a499 78 green_led.write(0.125f); // 1/4 starting brightness
kswanson31 0:f58f38896cfa 79 } else {
kswanson31 1:cd5247f3a499 80 green_led.write(0.50f); // initial
kswanson31 0:f58f38896cfa 81 }
kswanson31 0:f58f38896cfa 82
kswanson31 0:f58f38896cfa 83 // 3
kswanson31 0:f58f38896cfa 84 // get the state of the switch (0 or 1) and flip it, 0 when off
kswanson31 0:f58f38896cfa 85 switch_state = !chip.read(PORT_B) & 0x01;
kswanson31 0:f58f38896cfa 86 // write the saved value to MCP23S17 Port A
kswanson31 0:f58f38896cfa 87 chip.write(PORT_A, switch_state);
kswanson31 0:f58f38896cfa 88 wait(.2);
kswanson31 0:f58f38896cfa 89 // yellow led should change opposite the green led
kswanson31 1:cd5247f3a499 90
kswanson31 1:cd5247f3a499 91 // Analog control
kswanson31 1:cd5247f3a499 92 rgb_r = control_pot;
kswanson31 1:cd5247f3a499 93 rgb_g = 0.5f - control_pot;
kswanson31 1:cd5247f3a499 94 rgb_b = 1.0f - control_pot;
fkhan39 3:30be02620bad 95
fkhan39 3:30be02620bad 96 // WATCHDOG
fkhan39 3:30be02620bad 97 if (count == 15) while (1) {};
fkhan39 3:30be02620bad 98 count++;
fkhan39 3:30be02620bad 99 wdt.kick();
kswanson31 0:f58f38896cfa 100 }
kswanson31 0:f58f38896cfa 101 }