V1
Dependencies: mbed 25LCxxx_SPI MCP23S17
main_ihm_2.cpp
- Committer:
- gr66
- Date:
- 2021-02-17
- Revision:
- 1:ab2526b30b34
File content as of revision 1:ab2526b30b34:
#include "mbed.h" #include "MCP23S17.h" #define TOGGLE_BIT(REG,BIT) ((REG)^=(BIT)) // // macro // Serial pc(PA_2, PA_3); // I/O terminal PC Serial bt(PA_9, PA_10); // I/O terminal PC DigitalOut led(PA_15); // led SPI spi(PA_7, PA_6, PA_5); // mosi miso clk Ticker automate; Ticker telemesure; Timer voyant0; Timer voyant1; Timer voyant2; Timer voyant3; CAN can(PA_11,PA_12 ); //canRX canTX //expander char Opcode = 0x40; MCP23S17 chip = MCP23S17(spi, PF_1, Opcode); DigitalOut reset(PA_4); // reset expander //CAN CANMessage msg; // message recu can char tab[5]= {0x00,0xcc,0,0,0}; // void send(void); // unsigned char leds=0xFF,flag_t=0; // void autom(void) { //led=!led; send(); } // fonction can en reception sur ISR void rxcan() { //pc.printf("receive\n"); can.read(msg); if(msg.id==0x11) { led=!led; //CLEAR_BIT(leds,1); //leds=2; //chip.write(PORT_A, leds); switch (msg.data[0]) { case 0 : leds=chip.read(PORT_A); CLEAR_BIT(leds,1); chip.write(PORT_A, leds); break; case 1 : leds=chip.read(PORT_A); SET_BIT(leds,1); chip.write(PORT_A, leds); break; case 2 : voyant0.start(); if(voyant0.read_ms()>100) { voyant0.reset(); TOGGLE_BIT(leds,1); chip.write(PORT_A, leds); } break; case 3 : voyant0.start(); if(voyant0.read_ms()>1000) { voyant0.reset(); TOGGLE_BIT(leds,1); chip.write(PORT_A, leds); } break; } switch (msg.data[1]) { case 0 : leds=chip.read(PORT_A); CLEAR_BIT(leds,2); chip.write(PORT_A, leds); break; case 1 : leds=chip.read(PORT_A); SET_BIT(leds,2); chip.write(PORT_A, leds); break; case 2 : voyant1.start(); if(voyant1.read_ms()>100) { voyant1.reset(); TOGGLE_BIT(leds,2); chip.write(PORT_A, leds); } break; case 3 : voyant1.start(); if(voyant1.read_ms()>1000) { voyant1.reset(); TOGGLE_BIT(leds,2); chip.write(PORT_A, leds); } break; } switch (msg.data[2]) { case 0 : leds=chip.read(PORT_A); CLEAR_BIT(leds,4); chip.write(PORT_A, leds); break; case 1 : leds=chip.read(PORT_A); SET_BIT(leds,4); chip.write(PORT_A, leds); break; case 2 : voyant2.start(); if(voyant2.read_ms()>100) { voyant2.reset(); TOGGLE_BIT(leds,4); chip.write(PORT_A, leds); } break; case 3 : voyant2.start(); if(voyant2.read_ms()>1000) { voyant2.reset(); TOGGLE_BIT(leds,4); chip.write(PORT_A, leds); } break; } switch (msg.data[3]) { case 0 : leds=chip.read(PORT_A); CLEAR_BIT(leds,8); chip.write(PORT_A, leds); break; case 1 : leds=chip.read(PORT_A); SET_BIT(leds,8); chip.write(PORT_A, leds); break; case 2 : voyant3.start(); if(voyant3.read_ms()>100) { voyant3.reset(); TOGGLE_BIT(leds,8); chip.write(PORT_A, leds); } break; case 3 : voyant3.start(); if(voyant3.read_ms()>1000) { voyant3.reset(); TOGGLE_BIT(leds,8); chip.write(PORT_A, leds); } break; } //leds=msg.data[1]+; //chip.write(PORT_A, leds); //bt.printf("%0X\r",msg.data[0]); //bt.printf("%0X\r",chip.read(PORT_B)); } } // fonction d'envoi trame de test can void send() { //pc.printf("send()\n"); tab[1]=~chip.read(PORT_B); // lecture des boutons et inversion while(!can.write(CANMessage(0x22, tab, 3))); // if(can.write(CANMessage(0x11, tab, 2))) { tab[0]++; } void telem() { flag_t=1; } int main() { automate.attach(&autom,1./10); telemesure.attach(&telem,1.0); can.frequency(1000000); can.attach(&rxcan); bt.baud(115200); // vitesse bluetooth // RAZ expandeur de bus reset = 0; wait_us(1); reset = 1; // // Set all 8 Port A bits to output direction chip.direction(PORT_A, 0x00); // Set all 8 Port B bits to input direction chip.direction(PORT_B, 0xFF); chip.configurePullUps(PORT_B, 0xFF); //pc.printf("Hello Viti2 \r\n"); chip.write(PORT_A, leds); while(1) { if(flag_t) { bt.printf("led %02X, boutons %02X \n\r",leds, (unsigned char)(~chip.read(PORT_B))); flag_t=0; } } }