Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@3:30be02620bad, 2016-09-12 (annotated)
- 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?
| 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 | 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 | } |
