ECE 4180 Lab 1
Dependencies: MCP23S17 ShiftBrite mbed-rtos mbed
main.cpp@1:0d16f1e4f642, 2014-01-30 (annotated)
- Committer:
- aswild
- Date:
- Thu Jan 30 20:12:28 2014 +0000
- Revision:
- 1:0d16f1e4f642
- Parent:
- 0:d5e1eec2689a
Lab Version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aswild | 0:d5e1eec2689a | 1 | /* |
aswild | 0:d5e1eec2689a | 2 | * Allen Wild |
aswild | 0:d5e1eec2689a | 3 | * Joseph Guinta |
aswild | 0:d5e1eec2689a | 4 | * |
aswild | 0:d5e1eec2689a | 5 | * ECE 4180 Lab 1 |
aswild | 0:d5e1eec2689a | 6 | */ |
aswild | 0:d5e1eec2689a | 7 | |
aswild | 0:d5e1eec2689a | 8 | #include "mbed.h" |
aswild | 0:d5e1eec2689a | 9 | #include "rtos.h" |
aswild | 0:d5e1eec2689a | 10 | #include "MCP23S17.h" |
aswild | 0:d5e1eec2689a | 11 | #include "ShiftBrite.h" |
aswild | 0:d5e1eec2689a | 12 | |
aswild | 0:d5e1eec2689a | 13 | #define PB0_PIN p20 |
aswild | 0:d5e1eec2689a | 14 | #define LED_PIN p29 |
aswild | 0:d5e1eec2689a | 15 | #define PWM_PIN p21 |
aswild | 0:d5e1eec2689a | 16 | #define EX_CS_PIN p18 |
aswild | 0:d5e1eec2689a | 17 | |
aswild | 0:d5e1eec2689a | 18 | void updateSBColor(void const *args); |
aswild | 0:d5e1eec2689a | 19 | |
aswild | 0:d5e1eec2689a | 20 | DigitalIn pb1(PB0_PIN); |
aswild | 0:d5e1eec2689a | 21 | DigitalOut led(LED_PIN); |
aswild | 0:d5e1eec2689a | 22 | PwmOut pwm(PWM_PIN); |
aswild | 0:d5e1eec2689a | 23 | |
aswild | 0:d5e1eec2689a | 24 | SPI ex_spi(p11, p12, p13); |
aswild | 0:d5e1eec2689a | 25 | MCP23S17 ex(ex_spi, EX_CS_PIN, 0x40); |
aswild | 0:d5e1eec2689a | 26 | |
aswild | 0:d5e1eec2689a | 27 | // flags set when reading/writing the SPI extender, |
aswild | 0:d5e1eec2689a | 28 | // helpful for knowing what's happening in the logic analyzer |
aswild | 0:d5e1eec2689a | 29 | DigitalOut ex_read(p24); |
aswild | 0:d5e1eec2689a | 30 | DigitalOut ex_write(p23); |
aswild | 0:d5e1eec2689a | 31 | |
aswild | 0:d5e1eec2689a | 32 | ShiftBrite sb(p5, p6, p7, p8); |
aswild | 0:d5e1eec2689a | 33 | const int sbcolors[] = {0xff0000, 0xffff00, 0x00ff00, 0x00ffff, 0x0000ff, 0xff00ff}; |
aswild | 0:d5e1eec2689a | 34 | int sbci = 0; |
aswild | 0:d5e1eec2689a | 35 | |
aswild | 0:d5e1eec2689a | 36 | // brightness of PWM output |
aswild | 0:d5e1eec2689a | 37 | float bright = 0.0f; |
aswild | 0:d5e1eec2689a | 38 | bool pb1p = false; |
aswild | 0:d5e1eec2689a | 39 | |
aswild | 0:d5e1eec2689a | 40 | int main() |
aswild | 0:d5e1eec2689a | 41 | { |
aswild | 0:d5e1eec2689a | 42 | // set extender as inputs, configure internal pullups |
aswild | 0:d5e1eec2689a | 43 | ex.direction(PORT_A, 0xFF); |
aswild | 0:d5e1eec2689a | 44 | ex.configurePullUps(PORT_A, 0x90); |
aswild | 0:d5e1eec2689a | 45 | // port B as outputs (for LED) |
aswild | 0:d5e1eec2689a | 46 | ex.direction(PORT_B, 0x00); |
aswild | 0:d5e1eec2689a | 47 | |
aswild | 0:d5e1eec2689a | 48 | ex_read = 0; |
aswild | 0:d5e1eec2689a | 49 | ex_write = 0; |
aswild | 0:d5e1eec2689a | 50 | |
aswild | 0:d5e1eec2689a | 51 | sb.writeInit(32, 0, 0); |
aswild | 0:d5e1eec2689a | 52 | sb.fadeColor(0, 0xff0000, 0.5); |
aswild | 0:d5e1eec2689a | 53 | |
aswild | 0:d5e1eec2689a | 54 | // set PWM to 100Hz |
aswild | 0:d5e1eec2689a | 55 | pwm.period_ms(10); |
aswild | 0:d5e1eec2689a | 56 | |
aswild | 0:d5e1eec2689a | 57 | // oh no, I'm multithreading this |
aswild | 0:d5e1eec2689a | 58 | // god help us all... |
aswild | 0:d5e1eec2689a | 59 | Thread sbThread(updateSBColor); |
aswild | 0:d5e1eec2689a | 60 | |
aswild | 0:d5e1eec2689a | 61 | while (true) |
aswild | 0:d5e1eec2689a | 62 | { |
aswild | 0:d5e1eec2689a | 63 | // read button and turn on LED if pressed |
aswild | 0:d5e1eec2689a | 64 | pb1p = !pb1; |
aswild | 0:d5e1eec2689a | 65 | led = pb1p; |
aswild | 0:d5e1eec2689a | 66 | if (pb1p) |
aswild | 0:d5e1eec2689a | 67 | sbThread.signal_set(0x1); |
aswild | 0:d5e1eec2689a | 68 | while (!pb1); |
aswild | 0:d5e1eec2689a | 69 | |
aswild | 0:d5e1eec2689a | 70 | // use pushbuttons on extender to control PWM brightness |
aswild | 0:d5e1eec2689a | 71 | // invert because active-low switches |
aswild | 0:d5e1eec2689a | 72 | ex_read = 1; |
aswild | 0:d5e1eec2689a | 73 | char edata = ~(ex.read(PORT_A)); |
aswild | 0:d5e1eec2689a | 74 | ex_read = 0; |
aswild | 0:d5e1eec2689a | 75 | |
aswild | 0:d5e1eec2689a | 76 | // if either button pressed, turn on ex LED |
aswild | 0:d5e1eec2689a | 77 | if (edata & 0x90) |
aswild | 0:d5e1eec2689a | 78 | { |
aswild | 0:d5e1eec2689a | 79 | ex_write = 1; // note: debugging signal only |
aswild | 0:d5e1eec2689a | 80 | ex.write(PORT_B, 1); |
aswild | 0:d5e1eec2689a | 81 | ex_write = 0; |
aswild | 0:d5e1eec2689a | 82 | } |
aswild | 0:d5e1eec2689a | 83 | else |
aswild | 0:d5e1eec2689a | 84 | { |
aswild | 0:d5e1eec2689a | 85 | ex_write = 1; |
aswild | 0:d5e1eec2689a | 86 | ex.write(PORT_B, 0); |
aswild | 0:d5e1eec2689a | 87 | ex_write = 0; |
aswild | 0:d5e1eec2689a | 88 | } |
aswild | 0:d5e1eec2689a | 89 | |
aswild | 0:d5e1eec2689a | 90 | // if button 1 and below max brightness, increment by 1% |
aswild | 0:d5e1eec2689a | 91 | if ((edata&0x80) && bright < 1.0) |
aswild | 0:d5e1eec2689a | 92 | bright += 0.01; |
aswild | 0:d5e1eec2689a | 93 | // likewise for button 2 to decrement |
aswild | 0:d5e1eec2689a | 94 | if ((edata&0x10) && bright > 0) |
aswild | 0:d5e1eec2689a | 95 | bright -= 0.01; |
aswild | 0:d5e1eec2689a | 96 | pwm = bright; |
aswild | 0:d5e1eec2689a | 97 | |
aswild | 0:d5e1eec2689a | 98 | Thread::wait(10); |
aswild | 0:d5e1eec2689a | 99 | } |
aswild | 0:d5e1eec2689a | 100 | } |
aswild | 0:d5e1eec2689a | 101 | |
aswild | 0:d5e1eec2689a | 102 | // SB color fading happens in a different thread |
aswild | 0:d5e1eec2689a | 103 | void updateSBColor(void const *args) |
aswild | 0:d5e1eec2689a | 104 | { |
aswild | 0:d5e1eec2689a | 105 | while (true) |
aswild | 0:d5e1eec2689a | 106 | { |
aswild | 0:d5e1eec2689a | 107 | //Thread::wait(100); |
aswild | 0:d5e1eec2689a | 108 | Thread::signal_wait(0x1); |
aswild | 0:d5e1eec2689a | 109 | sb.fadeColor(sbcolors[(sbci != 0) ? sbci-1 : 5], sbcolors[sbci], 0.5); |
aswild | 0:d5e1eec2689a | 110 | if (++sbci > 5) |
aswild | 0:d5e1eec2689a | 111 | sbci = 0; |
aswild | 0:d5e1eec2689a | 112 | } |
aswild | 0:d5e1eec2689a | 113 | } |