Dependencies: MCP23S17 PinDetect mbed
lab1.cpp@0:9dc33481ce1b, 2017-03-01 (annotated)
- Committer:
- jderemer3
- Date:
- Wed Mar 01 16:36:55 2017 +0000
- Revision:
- 0:9dc33481ce1b
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jderemer3 | 0:9dc33481ce1b | 1 | // ECE 4180 |
jderemer3 | 0:9dc33481ce1b | 2 | // Lab/Project 1 |
jderemer3 | 0:9dc33481ce1b | 3 | // Jeremy M. Deremer |
jderemer3 | 0:9dc33481ce1b | 4 | // Due 26 January, 2017 |
jderemer3 | 0:9dc33481ce1b | 5 | |
jderemer3 | 0:9dc33481ce1b | 6 | #include "mbed.h" |
jderemer3 | 0:9dc33481ce1b | 7 | #include "PinDetect.h" |
jderemer3 | 0:9dc33481ce1b | 8 | #include "LEDColor.h" |
jderemer3 | 0:9dc33481ce1b | 9 | #include "RGBLed.h" |
jderemer3 | 0:9dc33481ce1b | 10 | #include "MCP23S17.h" |
jderemer3 | 0:9dc33481ce1b | 11 | #include "Nav_Switch.h" |
jderemer3 | 0:9dc33481ce1b | 12 | |
jderemer3 | 0:9dc33481ce1b | 13 | PwmOut led(p24); |
jderemer3 | 0:9dc33481ce1b | 14 | |
jderemer3 | 0:9dc33481ce1b | 15 | // Instantiate pushbuttons on analog pins |
jderemer3 | 0:9dc33481ce1b | 16 | PinDetect pb1(p17); |
jderemer3 | 0:9dc33481ce1b | 17 | PinDetect pb2(p18); |
jderemer3 | 0:9dc33481ce1b | 18 | PinDetect pb3(p19); |
jderemer3 | 0:9dc33481ce1b | 19 | |
jderemer3 | 0:9dc33481ce1b | 20 | // Instantiate RGBLed and allocate default colors |
jderemer3 | 0:9dc33481ce1b | 21 | //RGBLed myRGBled(p23,p22,p21); //RGB PWM pins |
jderemer3 | 0:9dc33481ce1b | 22 | //const LEDColor off(0.0,0.0,0.0); |
jderemer3 | 0:9dc33481ce1b | 23 | //const LEDColor blue(0.0,0.0,1.0); |
jderemer3 | 0:9dc33481ce1b | 24 | |
jderemer3 | 0:9dc33481ce1b | 25 | // Instantiate I/O Expander |
jderemer3 | 0:9dc33481ce1b | 26 | // Create SPI bus |
jderemer3 | 0:9dc33481ce1b | 27 | SPI spi(p5, p6, p7); |
jderemer3 | 0:9dc33481ce1b | 28 | char Opcode = 0x40; |
jderemer3 | 0:9dc33481ce1b | 29 | // Next create a MCP23S17 |
jderemer3 | 0:9dc33481ce1b | 30 | MCP23S17 chip = MCP23S17(spi, p20, Opcode); |
jderemer3 | 0:9dc33481ce1b | 31 | DigitalOut led1(LED1); // mbed LED1 is used for test status display |
jderemer3 | 0:9dc33481ce1b | 32 | |
jderemer3 | 0:9dc33481ce1b | 33 | // Instantiate Nav Joystick |
jderemer3 | 0:9dc33481ce1b | 34 | Nav_Switch myNav(p15, p12, p13, p11, p8); //pin order on Sparkfun breakout |
jderemer3 | 0:9dc33481ce1b | 35 | |
jderemer3 | 0:9dc33481ce1b | 36 | float inc = 0.1f; |
jderemer3 | 0:9dc33481ce1b | 37 | float val = 0.5f; |
jderemer3 | 0:9dc33481ce1b | 38 | |
jderemer3 | 0:9dc33481ce1b | 39 | // Callback routine is interrupt activated by a debounced pb1 hit |
jderemer3 | 0:9dc33481ce1b | 40 | void pb1_hit_callback (void) |
jderemer3 | 0:9dc33481ce1b | 41 | { |
jderemer3 | 0:9dc33481ce1b | 42 | val = led.read(); |
jderemer3 | 0:9dc33481ce1b | 43 | if (val == 0.00f) |
jderemer3 | 0:9dc33481ce1b | 44 | { |
jderemer3 | 0:9dc33481ce1b | 45 | led.write(0.50f); // 50% duty cycle |
jderemer3 | 0:9dc33481ce1b | 46 | } |
jderemer3 | 0:9dc33481ce1b | 47 | else |
jderemer3 | 0:9dc33481ce1b | 48 | { |
jderemer3 | 0:9dc33481ce1b | 49 | led.write(0.00f); // 0% duty cycle |
jderemer3 | 0:9dc33481ce1b | 50 | } |
jderemer3 | 0:9dc33481ce1b | 51 | } |
jderemer3 | 0:9dc33481ce1b | 52 | |
jderemer3 | 0:9dc33481ce1b | 53 | // Callback routine is interrupt activated by a debounced pb2 hit |
jderemer3 | 0:9dc33481ce1b | 54 | void pb2_hit_callback (void) |
jderemer3 | 0:9dc33481ce1b | 55 | { |
jderemer3 | 0:9dc33481ce1b | 56 | // add brightness |
jderemer3 | 0:9dc33481ce1b | 57 | val = led.read(); |
jderemer3 | 0:9dc33481ce1b | 58 | if (val < 1.00f) |
jderemer3 | 0:9dc33481ce1b | 59 | { |
jderemer3 | 0:9dc33481ce1b | 60 | val += inc; |
jderemer3 | 0:9dc33481ce1b | 61 | led.write(val); |
jderemer3 | 0:9dc33481ce1b | 62 | } |
jderemer3 | 0:9dc33481ce1b | 63 | } |
jderemer3 | 0:9dc33481ce1b | 64 | |
jderemer3 | 0:9dc33481ce1b | 65 | // Callback routine is interrupt activated by a debounced pb3 hit |
jderemer3 | 0:9dc33481ce1b | 66 | void pb3_hit_callback (void) |
jderemer3 | 0:9dc33481ce1b | 67 | { |
jderemer3 | 0:9dc33481ce1b | 68 | // subtract brightness |
jderemer3 | 0:9dc33481ce1b | 69 | val = led.read(); |
jderemer3 | 0:9dc33481ce1b | 70 | if (val > 0.0f) |
jderemer3 | 0:9dc33481ce1b | 71 | { |
jderemer3 | 0:9dc33481ce1b | 72 | val -= inc; |
jderemer3 | 0:9dc33481ce1b | 73 | led.write(val); |
jderemer3 | 0:9dc33481ce1b | 74 | } |
jderemer3 | 0:9dc33481ce1b | 75 | } |
jderemer3 | 0:9dc33481ce1b | 76 | |
jderemer3 | 0:9dc33481ce1b | 77 | int main() { |
jderemer3 | 0:9dc33481ce1b | 78 | |
jderemer3 | 0:9dc33481ce1b | 79 | led.write(0.5f); // 50% duty cycle |
jderemer3 | 0:9dc33481ce1b | 80 | |
jderemer3 | 0:9dc33481ce1b | 81 | // Use internal pullups for the three pushbuttons |
jderemer3 | 0:9dc33481ce1b | 82 | pb1.mode(PullUp); |
jderemer3 | 0:9dc33481ce1b | 83 | pb2.mode(PullUp); |
jderemer3 | 0:9dc33481ce1b | 84 | pb3.mode(PullUp); |
jderemer3 | 0:9dc33481ce1b | 85 | // Delay for initial pullup to take effect |
jderemer3 | 0:9dc33481ce1b | 86 | wait(.01); |
jderemer3 | 0:9dc33481ce1b | 87 | // Setup Interrupt callback functions for a pb hit |
jderemer3 | 0:9dc33481ce1b | 88 | pb1.attach_deasserted(&pb1_hit_callback); |
jderemer3 | 0:9dc33481ce1b | 89 | pb2.attach_deasserted(&pb2_hit_callback); |
jderemer3 | 0:9dc33481ce1b | 90 | pb3.attach_deasserted(&pb3_hit_callback); |
jderemer3 | 0:9dc33481ce1b | 91 | // Start sampling pb inputs using interrupts |
jderemer3 | 0:9dc33481ce1b | 92 | pb1.setSampleFrequency(); |
jderemer3 | 0:9dc33481ce1b | 93 | pb2.setSampleFrequency(); |
jderemer3 | 0:9dc33481ce1b | 94 | pb3.setSampleFrequency(); |
jderemer3 | 0:9dc33481ce1b | 95 | // pushbuttons now setup and running |
jderemer3 | 0:9dc33481ce1b | 96 | |
jderemer3 | 0:9dc33481ce1b | 97 | // Set all 8 Port A bits to output direction |
jderemer3 | 0:9dc33481ce1b | 98 | chip.direction(PORT_A, 0x00); |
jderemer3 | 0:9dc33481ce1b | 99 | // Set all 8 Port B bits to input direction |
jderemer3 | 0:9dc33481ce1b | 100 | chip.direction(PORT_B, 0xFF); |
jderemer3 | 0:9dc33481ce1b | 101 | |
jderemer3 | 0:9dc33481ce1b | 102 | while(1) // led flashing |
jderemer3 | 0:9dc33481ce1b | 103 | { |
jderemer3 | 0:9dc33481ce1b | 104 | // write 0xAA to MCP23S17 Port A |
jderemer3 | 0:9dc33481ce1b | 105 | chip.write(PORT_A, 0xAA); |
jderemer3 | 0:9dc33481ce1b | 106 | |
jderemer3 | 0:9dc33481ce1b | 107 | // read back value from MCP23S17 Port B and display B0 on mbed led1 |
jderemer3 | 0:9dc33481ce1b | 108 | if ((chip.read(PORT_B)& 0x01) == 0x01) |
jderemer3 | 0:9dc33481ce1b | 109 | { |
jderemer3 | 0:9dc33481ce1b | 110 | chip.write(PORT_A, 0x55); |
jderemer3 | 0:9dc33481ce1b | 111 | } |
jderemer3 | 0:9dc33481ce1b | 112 | |
jderemer3 | 0:9dc33481ce1b | 113 | //chip.write(PORT_A, (chip.read(PORT_B)& 0x01)); |
jderemer3 | 0:9dc33481ce1b | 114 | |
jderemer3 | 0:9dc33481ce1b | 115 | |
jderemer3 | 0:9dc33481ce1b | 116 | //with pullups a button hit is a "0" - "~" inverts data to leds |
jderemer3 | 0:9dc33481ce1b | 117 | mbedleds = ~(myNav & 0x0F); //update leds with nav switch direction inputs |
jderemer3 | 0:9dc33481ce1b | 118 | if(myNav.fire()) mbedleds = 0x0F; //special all leds on case for fire (center button) |
jderemer3 | 0:9dc33481ce1b | 119 | //or use - if(myNav[4]==0) mbedleds = 0x0F; //can index a switch bit like this |
jderemer3 | 0:9dc33481ce1b | 120 | //wait(0.02); |
jderemer3 | 0:9dc33481ce1b | 121 | |
jderemer3 | 0:9dc33481ce1b | 122 | } |
jderemer3 | 0:9dc33481ce1b | 123 | } |