V1
Dependencies: mbed 25LCxxx_SPI MCP23S17
main_ihm_2.cpp@1:ab2526b30b34, 2021-02-17 (annotated)
- Committer:
- gr66
- Date:
- Wed Feb 17 20:53:53 2021 +0000
- Revision:
- 1:ab2526b30b34
V1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gr66 | 1:ab2526b30b34 | 1 | #include "mbed.h" |
gr66 | 1:ab2526b30b34 | 2 | #include "MCP23S17.h" |
gr66 | 1:ab2526b30b34 | 3 | #define TOGGLE_BIT(REG,BIT) ((REG)^=(BIT)) |
gr66 | 1:ab2526b30b34 | 4 | // |
gr66 | 1:ab2526b30b34 | 5 | // macro |
gr66 | 1:ab2526b30b34 | 6 | |
gr66 | 1:ab2526b30b34 | 7 | |
gr66 | 1:ab2526b30b34 | 8 | // |
gr66 | 1:ab2526b30b34 | 9 | Serial pc(PA_2, PA_3); // I/O terminal PC |
gr66 | 1:ab2526b30b34 | 10 | Serial bt(PA_9, PA_10); // I/O terminal PC |
gr66 | 1:ab2526b30b34 | 11 | DigitalOut led(PA_15); // led |
gr66 | 1:ab2526b30b34 | 12 | |
gr66 | 1:ab2526b30b34 | 13 | SPI spi(PA_7, PA_6, PA_5); // mosi miso clk |
gr66 | 1:ab2526b30b34 | 14 | Ticker automate; |
gr66 | 1:ab2526b30b34 | 15 | Ticker telemesure; |
gr66 | 1:ab2526b30b34 | 16 | Timer voyant0; |
gr66 | 1:ab2526b30b34 | 17 | Timer voyant1; |
gr66 | 1:ab2526b30b34 | 18 | Timer voyant2; |
gr66 | 1:ab2526b30b34 | 19 | Timer voyant3; |
gr66 | 1:ab2526b30b34 | 20 | CAN can(PA_11,PA_12 ); //canRX canTX |
gr66 | 1:ab2526b30b34 | 21 | //expander |
gr66 | 1:ab2526b30b34 | 22 | char Opcode = 0x40; |
gr66 | 1:ab2526b30b34 | 23 | MCP23S17 chip = MCP23S17(spi, PF_1, Opcode); |
gr66 | 1:ab2526b30b34 | 24 | DigitalOut reset(PA_4); // reset expander |
gr66 | 1:ab2526b30b34 | 25 | |
gr66 | 1:ab2526b30b34 | 26 | //CAN |
gr66 | 1:ab2526b30b34 | 27 | CANMessage msg; // message recu can |
gr66 | 1:ab2526b30b34 | 28 | char tab[5]= {0x00,0xcc,0,0,0}; // |
gr66 | 1:ab2526b30b34 | 29 | void send(void); |
gr66 | 1:ab2526b30b34 | 30 | // |
gr66 | 1:ab2526b30b34 | 31 | unsigned char leds=0xFF,flag_t=0; |
gr66 | 1:ab2526b30b34 | 32 | // |
gr66 | 1:ab2526b30b34 | 33 | void autom(void) |
gr66 | 1:ab2526b30b34 | 34 | { |
gr66 | 1:ab2526b30b34 | 35 | //led=!led; |
gr66 | 1:ab2526b30b34 | 36 | send(); |
gr66 | 1:ab2526b30b34 | 37 | } |
gr66 | 1:ab2526b30b34 | 38 | // fonction can en reception sur ISR |
gr66 | 1:ab2526b30b34 | 39 | void rxcan() |
gr66 | 1:ab2526b30b34 | 40 | { |
gr66 | 1:ab2526b30b34 | 41 | //pc.printf("receive\n"); |
gr66 | 1:ab2526b30b34 | 42 | can.read(msg); |
gr66 | 1:ab2526b30b34 | 43 | if(msg.id==0x11) { |
gr66 | 1:ab2526b30b34 | 44 | led=!led; |
gr66 | 1:ab2526b30b34 | 45 | |
gr66 | 1:ab2526b30b34 | 46 | |
gr66 | 1:ab2526b30b34 | 47 | |
gr66 | 1:ab2526b30b34 | 48 | //CLEAR_BIT(leds,1); |
gr66 | 1:ab2526b30b34 | 49 | //leds=2; |
gr66 | 1:ab2526b30b34 | 50 | //chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 51 | switch (msg.data[0]) { |
gr66 | 1:ab2526b30b34 | 52 | case 0 : |
gr66 | 1:ab2526b30b34 | 53 | leds=chip.read(PORT_A); |
gr66 | 1:ab2526b30b34 | 54 | CLEAR_BIT(leds,1); |
gr66 | 1:ab2526b30b34 | 55 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 56 | break; |
gr66 | 1:ab2526b30b34 | 57 | case 1 : |
gr66 | 1:ab2526b30b34 | 58 | leds=chip.read(PORT_A); |
gr66 | 1:ab2526b30b34 | 59 | SET_BIT(leds,1); |
gr66 | 1:ab2526b30b34 | 60 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 61 | break; |
gr66 | 1:ab2526b30b34 | 62 | case 2 : |
gr66 | 1:ab2526b30b34 | 63 | voyant0.start(); |
gr66 | 1:ab2526b30b34 | 64 | if(voyant0.read_ms()>100) { |
gr66 | 1:ab2526b30b34 | 65 | voyant0.reset(); |
gr66 | 1:ab2526b30b34 | 66 | TOGGLE_BIT(leds,1); |
gr66 | 1:ab2526b30b34 | 67 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 68 | } |
gr66 | 1:ab2526b30b34 | 69 | break; |
gr66 | 1:ab2526b30b34 | 70 | case 3 : |
gr66 | 1:ab2526b30b34 | 71 | voyant0.start(); |
gr66 | 1:ab2526b30b34 | 72 | if(voyant0.read_ms()>1000) { |
gr66 | 1:ab2526b30b34 | 73 | voyant0.reset(); |
gr66 | 1:ab2526b30b34 | 74 | TOGGLE_BIT(leds,1); |
gr66 | 1:ab2526b30b34 | 75 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 76 | } |
gr66 | 1:ab2526b30b34 | 77 | break; |
gr66 | 1:ab2526b30b34 | 78 | } |
gr66 | 1:ab2526b30b34 | 79 | switch (msg.data[1]) { |
gr66 | 1:ab2526b30b34 | 80 | case 0 : |
gr66 | 1:ab2526b30b34 | 81 | leds=chip.read(PORT_A); |
gr66 | 1:ab2526b30b34 | 82 | CLEAR_BIT(leds,2); |
gr66 | 1:ab2526b30b34 | 83 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 84 | break; |
gr66 | 1:ab2526b30b34 | 85 | case 1 : |
gr66 | 1:ab2526b30b34 | 86 | leds=chip.read(PORT_A); |
gr66 | 1:ab2526b30b34 | 87 | SET_BIT(leds,2); |
gr66 | 1:ab2526b30b34 | 88 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 89 | break; |
gr66 | 1:ab2526b30b34 | 90 | case 2 : |
gr66 | 1:ab2526b30b34 | 91 | voyant1.start(); |
gr66 | 1:ab2526b30b34 | 92 | if(voyant1.read_ms()>100) { |
gr66 | 1:ab2526b30b34 | 93 | voyant1.reset(); |
gr66 | 1:ab2526b30b34 | 94 | TOGGLE_BIT(leds,2); |
gr66 | 1:ab2526b30b34 | 95 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 96 | } |
gr66 | 1:ab2526b30b34 | 97 | break; |
gr66 | 1:ab2526b30b34 | 98 | case 3 : |
gr66 | 1:ab2526b30b34 | 99 | voyant1.start(); |
gr66 | 1:ab2526b30b34 | 100 | if(voyant1.read_ms()>1000) { |
gr66 | 1:ab2526b30b34 | 101 | voyant1.reset(); |
gr66 | 1:ab2526b30b34 | 102 | TOGGLE_BIT(leds,2); |
gr66 | 1:ab2526b30b34 | 103 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 104 | } |
gr66 | 1:ab2526b30b34 | 105 | break; |
gr66 | 1:ab2526b30b34 | 106 | } |
gr66 | 1:ab2526b30b34 | 107 | switch (msg.data[2]) { |
gr66 | 1:ab2526b30b34 | 108 | case 0 : |
gr66 | 1:ab2526b30b34 | 109 | leds=chip.read(PORT_A); |
gr66 | 1:ab2526b30b34 | 110 | CLEAR_BIT(leds,4); |
gr66 | 1:ab2526b30b34 | 111 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 112 | break; |
gr66 | 1:ab2526b30b34 | 113 | case 1 : |
gr66 | 1:ab2526b30b34 | 114 | leds=chip.read(PORT_A); |
gr66 | 1:ab2526b30b34 | 115 | SET_BIT(leds,4); |
gr66 | 1:ab2526b30b34 | 116 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 117 | break; |
gr66 | 1:ab2526b30b34 | 118 | case 2 : |
gr66 | 1:ab2526b30b34 | 119 | voyant2.start(); |
gr66 | 1:ab2526b30b34 | 120 | if(voyant2.read_ms()>100) { |
gr66 | 1:ab2526b30b34 | 121 | voyant2.reset(); |
gr66 | 1:ab2526b30b34 | 122 | TOGGLE_BIT(leds,4); |
gr66 | 1:ab2526b30b34 | 123 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 124 | } |
gr66 | 1:ab2526b30b34 | 125 | break; |
gr66 | 1:ab2526b30b34 | 126 | case 3 : |
gr66 | 1:ab2526b30b34 | 127 | voyant2.start(); |
gr66 | 1:ab2526b30b34 | 128 | if(voyant2.read_ms()>1000) { |
gr66 | 1:ab2526b30b34 | 129 | voyant2.reset(); |
gr66 | 1:ab2526b30b34 | 130 | TOGGLE_BIT(leds,4); |
gr66 | 1:ab2526b30b34 | 131 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 132 | } |
gr66 | 1:ab2526b30b34 | 133 | break; |
gr66 | 1:ab2526b30b34 | 134 | } |
gr66 | 1:ab2526b30b34 | 135 | switch (msg.data[3]) { |
gr66 | 1:ab2526b30b34 | 136 | case 0 : |
gr66 | 1:ab2526b30b34 | 137 | leds=chip.read(PORT_A); |
gr66 | 1:ab2526b30b34 | 138 | CLEAR_BIT(leds,8); |
gr66 | 1:ab2526b30b34 | 139 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 140 | break; |
gr66 | 1:ab2526b30b34 | 141 | case 1 : |
gr66 | 1:ab2526b30b34 | 142 | leds=chip.read(PORT_A); |
gr66 | 1:ab2526b30b34 | 143 | SET_BIT(leds,8); |
gr66 | 1:ab2526b30b34 | 144 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 145 | break; |
gr66 | 1:ab2526b30b34 | 146 | case 2 : |
gr66 | 1:ab2526b30b34 | 147 | voyant3.start(); |
gr66 | 1:ab2526b30b34 | 148 | if(voyant3.read_ms()>100) { |
gr66 | 1:ab2526b30b34 | 149 | voyant3.reset(); |
gr66 | 1:ab2526b30b34 | 150 | TOGGLE_BIT(leds,8); |
gr66 | 1:ab2526b30b34 | 151 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 152 | } |
gr66 | 1:ab2526b30b34 | 153 | break; |
gr66 | 1:ab2526b30b34 | 154 | case 3 : |
gr66 | 1:ab2526b30b34 | 155 | voyant3.start(); |
gr66 | 1:ab2526b30b34 | 156 | if(voyant3.read_ms()>1000) { |
gr66 | 1:ab2526b30b34 | 157 | voyant3.reset(); |
gr66 | 1:ab2526b30b34 | 158 | TOGGLE_BIT(leds,8); |
gr66 | 1:ab2526b30b34 | 159 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 160 | } |
gr66 | 1:ab2526b30b34 | 161 | break; |
gr66 | 1:ab2526b30b34 | 162 | } |
gr66 | 1:ab2526b30b34 | 163 | //leds=msg.data[1]+; |
gr66 | 1:ab2526b30b34 | 164 | //chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 165 | //bt.printf("%0X\r",msg.data[0]); |
gr66 | 1:ab2526b30b34 | 166 | //bt.printf("%0X\r",chip.read(PORT_B)); |
gr66 | 1:ab2526b30b34 | 167 | } |
gr66 | 1:ab2526b30b34 | 168 | } |
gr66 | 1:ab2526b30b34 | 169 | // fonction d'envoi trame de test can |
gr66 | 1:ab2526b30b34 | 170 | void send() |
gr66 | 1:ab2526b30b34 | 171 | { |
gr66 | 1:ab2526b30b34 | 172 | //pc.printf("send()\n"); |
gr66 | 1:ab2526b30b34 | 173 | tab[1]=~chip.read(PORT_B); // lecture des boutons et inversion |
gr66 | 1:ab2526b30b34 | 174 | while(!can.write(CANMessage(0x22, tab, 3))); |
gr66 | 1:ab2526b30b34 | 175 | // if(can.write(CANMessage(0x11, tab, 2))) { |
gr66 | 1:ab2526b30b34 | 176 | tab[0]++; |
gr66 | 1:ab2526b30b34 | 177 | } |
gr66 | 1:ab2526b30b34 | 178 | void telem() |
gr66 | 1:ab2526b30b34 | 179 | { |
gr66 | 1:ab2526b30b34 | 180 | flag_t=1; |
gr66 | 1:ab2526b30b34 | 181 | } |
gr66 | 1:ab2526b30b34 | 182 | int main() |
gr66 | 1:ab2526b30b34 | 183 | { |
gr66 | 1:ab2526b30b34 | 184 | automate.attach(&autom,1./10); |
gr66 | 1:ab2526b30b34 | 185 | telemesure.attach(&telem,1.0); |
gr66 | 1:ab2526b30b34 | 186 | can.frequency(1000000); |
gr66 | 1:ab2526b30b34 | 187 | can.attach(&rxcan); |
gr66 | 1:ab2526b30b34 | 188 | bt.baud(115200); // vitesse bluetooth |
gr66 | 1:ab2526b30b34 | 189 | // RAZ expandeur de bus |
gr66 | 1:ab2526b30b34 | 190 | reset = 0; |
gr66 | 1:ab2526b30b34 | 191 | wait_us(1); |
gr66 | 1:ab2526b30b34 | 192 | reset = 1; |
gr66 | 1:ab2526b30b34 | 193 | // |
gr66 | 1:ab2526b30b34 | 194 | // Set all 8 Port A bits to output direction |
gr66 | 1:ab2526b30b34 | 195 | chip.direction(PORT_A, 0x00); |
gr66 | 1:ab2526b30b34 | 196 | // Set all 8 Port B bits to input direction |
gr66 | 1:ab2526b30b34 | 197 | chip.direction(PORT_B, 0xFF); |
gr66 | 1:ab2526b30b34 | 198 | chip.configurePullUps(PORT_B, 0xFF); |
gr66 | 1:ab2526b30b34 | 199 | //pc.printf("Hello Viti2 \r\n"); |
gr66 | 1:ab2526b30b34 | 200 | chip.write(PORT_A, leds); |
gr66 | 1:ab2526b30b34 | 201 | while(1) { |
gr66 | 1:ab2526b30b34 | 202 | if(flag_t) { |
gr66 | 1:ab2526b30b34 | 203 | bt.printf("led %02X, boutons %02X \n\r",leds, (unsigned char)(~chip.read(PORT_B))); |
gr66 | 1:ab2526b30b34 | 204 | flag_t=0; |
gr66 | 1:ab2526b30b34 | 205 | } |
gr66 | 1:ab2526b30b34 | 206 | } |
gr66 | 1:ab2526b30b34 | 207 | } |