Allen Wild
/
4180_s15_lab1
Lab 1 solution code for ECE 4180. Everything except the assembly and power management extra credit.
main.cpp@0:c09069b2addc, 2015-01-29 (annotated)
- Committer:
- aswild
- Date:
- Thu Jan 29 05:30:52 2015 +0000
- Revision:
- 0:c09069b2addc
initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aswild | 0:c09069b2addc | 1 | // Allen Wild |
aswild | 0:c09069b2addc | 2 | // ECE 4180, Spring 2015 |
aswild | 0:c09069b2addc | 3 | // Lab 1 solution |
aswild | 0:c09069b2addc | 4 | |
aswild | 0:c09069b2addc | 5 | #include "mbed.h" |
aswild | 0:c09069b2addc | 6 | |
aswild | 0:c09069b2addc | 7 | //#define PART1 |
aswild | 0:c09069b2addc | 8 | //#define PART2 |
aswild | 0:c09069b2addc | 9 | //#define PART3 |
aswild | 0:c09069b2addc | 10 | //#define EXCRED1 |
aswild | 0:c09069b2addc | 11 | //#define EXCRED2 // not implemented here |
aswild | 0:c09069b2addc | 12 | //#define EXCRED3 |
aswild | 0:c09069b2addc | 13 | //#define EXCRED4 // not implemented here |
aswild | 0:c09069b2addc | 14 | #define EXCRED5 |
aswild | 0:c09069b2addc | 15 | |
aswild | 0:c09069b2addc | 16 | DigitalIn button1(p21); |
aswild | 0:c09069b2addc | 17 | DigitalIn button2(p24); |
aswild | 0:c09069b2addc | 18 | |
aswild | 0:c09069b2addc | 19 | #ifdef PART1 //{{{ |
aswild | 0:c09069b2addc | 20 | DigitalOut led(p26); |
aswild | 0:c09069b2addc | 21 | |
aswild | 0:c09069b2addc | 22 | int main() |
aswild | 0:c09069b2addc | 23 | { |
aswild | 0:c09069b2addc | 24 | while(1) |
aswild | 0:c09069b2addc | 25 | { |
aswild | 0:c09069b2addc | 26 | led = !button2; |
aswild | 0:c09069b2addc | 27 | wait_ms(50); |
aswild | 0:c09069b2addc | 28 | } |
aswild | 0:c09069b2addc | 29 | } |
aswild | 0:c09069b2addc | 30 | #endif //}}} |
aswild | 0:c09069b2addc | 31 | |
aswild | 0:c09069b2addc | 32 | #ifdef PART2 //{{{ |
aswild | 0:c09069b2addc | 33 | PwmOut led(p26); |
aswild | 0:c09069b2addc | 34 | |
aswild | 0:c09069b2addc | 35 | int main() |
aswild | 0:c09069b2addc | 36 | { |
aswild | 0:c09069b2addc | 37 | float val = 0.5; |
aswild | 0:c09069b2addc | 38 | |
aswild | 0:c09069b2addc | 39 | while (1) |
aswild | 0:c09069b2addc | 40 | { |
aswild | 0:c09069b2addc | 41 | if (button1) |
aswild | 0:c09069b2addc | 42 | { |
aswild | 0:c09069b2addc | 43 | val += 0.01; |
aswild | 0:c09069b2addc | 44 | if (val > 1) |
aswild | 0:c09069b2addc | 45 | val = 1; |
aswild | 0:c09069b2addc | 46 | } |
aswild | 0:c09069b2addc | 47 | if (button2) |
aswild | 0:c09069b2addc | 48 | { |
aswild | 0:c09069b2addc | 49 | val -= 0.01; |
aswild | 0:c09069b2addc | 50 | if (val < 0) |
aswild | 0:c09069b2addc | 51 | val = 0; |
aswild | 0:c09069b2addc | 52 | } |
aswild | 0:c09069b2addc | 53 | led = val; |
aswild | 0:c09069b2addc | 54 | wait_ms(20); |
aswild | 0:c09069b2addc | 55 | } |
aswild | 0:c09069b2addc | 56 | } |
aswild | 0:c09069b2addc | 57 | #endif //}}} |
aswild | 0:c09069b2addc | 58 | |
aswild | 0:c09069b2addc | 59 | #ifdef PART3 //{{{ |
aswild | 0:c09069b2addc | 60 | #include "MCP23S17.h" |
aswild | 0:c09069b2addc | 61 | SPI spi(p11, p12, p13); |
aswild | 0:c09069b2addc | 62 | MCP23S17 chip(spi, p14, 0x40); |
aswild | 0:c09069b2addc | 63 | |
aswild | 0:c09069b2addc | 64 | int main() |
aswild | 0:c09069b2addc | 65 | { |
aswild | 0:c09069b2addc | 66 | chip.direction(PORT_A, 0xFF); // input |
aswild | 0:c09069b2addc | 67 | chip.direction(PORT_B, 0x00); // output |
aswild | 0:c09069b2addc | 68 | chip.configurePullUps(PORT_A, 0x01); |
aswild | 0:c09069b2addc | 69 | |
aswild | 0:c09069b2addc | 70 | while (1) |
aswild | 0:c09069b2addc | 71 | { |
aswild | 0:c09069b2addc | 72 | char port_val = chip.read(PORT_A); |
aswild | 0:c09069b2addc | 73 | chip.write(PORT_B, ~port_val & 0x01); |
aswild | 0:c09069b2addc | 74 | wait_ms(50); |
aswild | 0:c09069b2addc | 75 | } |
aswild | 0:c09069b2addc | 76 | } |
aswild | 0:c09069b2addc | 77 | #endif //}}} |
aswild | 0:c09069b2addc | 78 | |
aswild | 0:c09069b2addc | 79 | #ifdef EXCRED1 //{{{ |
aswild | 0:c09069b2addc | 80 | // Watchdog Timer |
aswild | 0:c09069b2addc | 81 | |
aswild | 0:c09069b2addc | 82 | DigitalOut led1(LED1); |
aswild | 0:c09069b2addc | 83 | DigitalOut led2(LED2); |
aswild | 0:c09069b2addc | 84 | DigitalOut led(p26); |
aswild | 0:c09069b2addc | 85 | |
aswild | 0:c09069b2addc | 86 | void wdt_kick() |
aswild | 0:c09069b2addc | 87 | { |
aswild | 0:c09069b2addc | 88 | LPC_WDT->WDFEED = 0xAA; |
aswild | 0:c09069b2addc | 89 | LPC_WDT->WDFEED = 0x55; |
aswild | 0:c09069b2addc | 90 | } |
aswild | 0:c09069b2addc | 91 | |
aswild | 0:c09069b2addc | 92 | void wdt_setup(float s) |
aswild | 0:c09069b2addc | 93 | { |
aswild | 0:c09069b2addc | 94 | // from cookbook page |
aswild | 0:c09069b2addc | 95 | LPC_WDT->WDCLKSEL = 0x1; |
aswild | 0:c09069b2addc | 96 | uint32_t clk = SystemCoreClock / 16; |
aswild | 0:c09069b2addc | 97 | LPC_WDT->WDTC = s * (float)clk; |
aswild | 0:c09069b2addc | 98 | LPC_WDT->WDMOD = 0x3; |
aswild | 0:c09069b2addc | 99 | wdt_kick(); |
aswild | 0:c09069b2addc | 100 | } |
aswild | 0:c09069b2addc | 101 | |
aswild | 0:c09069b2addc | 102 | int main() |
aswild | 0:c09069b2addc | 103 | { |
aswild | 0:c09069b2addc | 104 | led1 = 0; |
aswild | 0:c09069b2addc | 105 | if ((LPC_WDT->WDMOD >> 2) & 1) |
aswild | 0:c09069b2addc | 106 | led2 = 1; |
aswild | 0:c09069b2addc | 107 | else |
aswild | 0:c09069b2addc | 108 | led2 = 0; |
aswild | 0:c09069b2addc | 109 | |
aswild | 0:c09069b2addc | 110 | wdt_setup(3.0); |
aswild | 0:c09069b2addc | 111 | |
aswild | 0:c09069b2addc | 112 | while (1) |
aswild | 0:c09069b2addc | 113 | { |
aswild | 0:c09069b2addc | 114 | led = !button2; |
aswild | 0:c09069b2addc | 115 | wait_ms(50); |
aswild | 0:c09069b2addc | 116 | if (!button1) |
aswild | 0:c09069b2addc | 117 | { |
aswild | 0:c09069b2addc | 118 | led1 = 1; |
aswild | 0:c09069b2addc | 119 | while (1); // get stuck if button1 pressed |
aswild | 0:c09069b2addc | 120 | } |
aswild | 0:c09069b2addc | 121 | wdt_kick(); |
aswild | 0:c09069b2addc | 122 | } |
aswild | 0:c09069b2addc | 123 | } |
aswild | 0:c09069b2addc | 124 | #endif //}}} |
aswild | 0:c09069b2addc | 125 | |
aswild | 0:c09069b2addc | 126 | #ifdef EXCRED3 //{{{ |
aswild | 0:c09069b2addc | 127 | |
aswild | 0:c09069b2addc | 128 | SPI spi(p5, p6, p7); |
aswild | 0:c09069b2addc | 129 | DigitalOut latch(p9); |
aswild | 0:c09069b2addc | 130 | DigitalOut nenable(p8); |
aswild | 0:c09069b2addc | 131 | |
aswild | 0:c09069b2addc | 132 | void shiftbrite_write(int color) |
aswild | 0:c09069b2addc | 133 | { |
aswild | 0:c09069b2addc | 134 | int red = (color >> 16) & 0xFF; |
aswild | 0:c09069b2addc | 135 | int green = (color >> 8) & 0xFF; |
aswild | 0:c09069b2addc | 136 | int blue = color & 0xFF; |
aswild | 0:c09069b2addc | 137 | int command = (blue << 20) | (red << 10) | green; |
aswild | 0:c09069b2addc | 138 | spi.write(command >> 16); |
aswild | 0:c09069b2addc | 139 | spi.write(command & 0x0000ffff); |
aswild | 0:c09069b2addc | 140 | latch = 1; |
aswild | 0:c09069b2addc | 141 | wait(0.00001); |
aswild | 0:c09069b2addc | 142 | latch = 0; |
aswild | 0:c09069b2addc | 143 | } |
aswild | 0:c09069b2addc | 144 | |
aswild | 0:c09069b2addc | 145 | #define N_COLORS 6 |
aswild | 0:c09069b2addc | 146 | const int colors[N_COLORS] = {0xff0000, 0xffff00, 0x00ff00, 0x00ffff, 0x0000ff, 0xff00ff}; |
aswild | 0:c09069b2addc | 147 | |
aswild | 0:c09069b2addc | 148 | int main() |
aswild | 0:c09069b2addc | 149 | { |
aswild | 0:c09069b2addc | 150 | // set up ShiftBrite |
aswild | 0:c09069b2addc | 151 | spi.format(16, 0); |
aswild | 0:c09069b2addc | 152 | spi.frequency(500000); |
aswild | 0:c09069b2addc | 153 | latch = 0; |
aswild | 0:c09069b2addc | 154 | nenable = 0; |
aswild | 0:c09069b2addc | 155 | shiftbrite_write(colors[0]); |
aswild | 0:c09069b2addc | 156 | |
aswild | 0:c09069b2addc | 157 | int i = 1; |
aswild | 0:c09069b2addc | 158 | while (1) |
aswild | 0:c09069b2addc | 159 | { |
aswild | 0:c09069b2addc | 160 | if (!button2) // change color when button pressed |
aswild | 0:c09069b2addc | 161 | { |
aswild | 0:c09069b2addc | 162 | shiftbrite_write(colors[i]); |
aswild | 0:c09069b2addc | 163 | if (++i >= N_COLORS) |
aswild | 0:c09069b2addc | 164 | i = 0; |
aswild | 0:c09069b2addc | 165 | while (!button2); // wait until button releases |
aswild | 0:c09069b2addc | 166 | } |
aswild | 0:c09069b2addc | 167 | if (!button1) |
aswild | 0:c09069b2addc | 168 | { |
aswild | 0:c09069b2addc | 169 | nenable = !nenable; // toggle enable pin |
aswild | 0:c09069b2addc | 170 | while (!button1); |
aswild | 0:c09069b2addc | 171 | } |
aswild | 0:c09069b2addc | 172 | wait_ms(50); |
aswild | 0:c09069b2addc | 173 | } |
aswild | 0:c09069b2addc | 174 | } |
aswild | 0:c09069b2addc | 175 | |
aswild | 0:c09069b2addc | 176 | #endif //}}} |
aswild | 0:c09069b2addc | 177 | |
aswild | 0:c09069b2addc | 178 | #ifdef EXCRED5 //{{{ |
aswild | 0:c09069b2addc | 179 | #include "MCP23S17.h" |
aswild | 0:c09069b2addc | 180 | |
aswild | 0:c09069b2addc | 181 | SPI spi(p11, p12, p13); |
aswild | 0:c09069b2addc | 182 | MCP23S17 chip1(spi, p14, 0x40); |
aswild | 0:c09069b2addc | 183 | MCP23S17 chip2(spi, p14, 0x42); |
aswild | 0:c09069b2addc | 184 | |
aswild | 0:c09069b2addc | 185 | int main() |
aswild | 0:c09069b2addc | 186 | { |
aswild | 0:c09069b2addc | 187 | chip1.direction(PORT_A, 0xFF); // input |
aswild | 0:c09069b2addc | 188 | chip1.direction(PORT_B, 0x00); // output |
aswild | 0:c09069b2addc | 189 | chip1.configurePullUps(PORT_A, 0x01); |
aswild | 0:c09069b2addc | 190 | chip2.direction(PORT_A, 0xFF); |
aswild | 0:c09069b2addc | 191 | chip2.direction(PORT_B, 0x00); |
aswild | 0:c09069b2addc | 192 | |
aswild | 0:c09069b2addc | 193 | while (1) |
aswild | 0:c09069b2addc | 194 | { |
aswild | 0:c09069b2addc | 195 | char port_val = chip1.read(PORT_A); |
aswild | 0:c09069b2addc | 196 | chip1.write(PORT_B, ~port_val & 0x01); |
aswild | 0:c09069b2addc | 197 | chip2.write(PORT_B, ~port_val & 0x01); |
aswild | 0:c09069b2addc | 198 | wait_ms(50); |
aswild | 0:c09069b2addc | 199 | } |
aswild | 0:c09069b2addc | 200 | } |
aswild | 0:c09069b2addc | 201 | |
aswild | 0:c09069b2addc | 202 | #endif //}}} |