Lab 1 solution code for ECE 4180. Everything except the assembly and power management extra credit.

Dependencies:   MCP23S17 mbed

Committer:
aswild
Date:
Thu Jan 29 05:30:52 2015 +0000
Revision:
0:c09069b2addc
initial commit

Who changed what in which revision?

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