![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Test CBS-GPIO-CAN
Dependencies: mbed
Fork of Amplificatore_bomboni_rev2 by
CBS-GPIO_CAN.cpp
- Committer:
- pinofal
- Date:
- 2018-07-27
- Revision:
- 8:3c919f5d6036
File content as of revision 8:3c919f5d6036:
// Tested : NUCLEO-F401RE NUCLEO-L476LG #include "mbed.h" #include<stdlib.h> // dimensione del pacchetto di comunicazione tra PC e uC #define PACKETDIM 64 // Definizione periferiche Serial pc(USBTX, USBRX); // User Button, LED DigitalIn myButton(USER_BUTTON); // Output di servizio sul LED2 della scheda NUCLEO DigitalOut myLed1(LED1); DigitalOut myLed2(LED2); DigitalOut myLed3(LED3); // Output della NUCLEO e Input del DUT. Saranno inviati dal PC alla NUCLEO, nell'ordine in cui si trovano dichiarati di seguito DigitalOut myOut1(PA_13); DigitalOut myOut2(PA_14); DigitalOut myOut3(PA_15); DigitalOut myTest(PG_2); // Input della NUCLEO e Output del DUT. Saranno inviati dalla NUCLEO al PC, nell'ordine in cui si trovano dichiarati di seguito DigitalIn myIn1(PA_8); DigitalIn myIn2(PB_10); DigitalIn myIn3(PB_4); DigitalIn myIn4(PB_5); DigitalIn myIn5(PB_3); // Output di pilotaggio Relè per test CANBUS DigitalOut myRelayH1(PB_6); DigitalOut myRelayL1(PC_7); DigitalOut myNotRelayH2(PA_9); // A questo Output è collegato un OptoRelay normalmente chiuso e quindi lavora in logica negata DigitalOut myNotRelayL2(PA_10); // A questo Output è collegato un OptoRelay normalmente chiuso e quindi lavora in logica negata DigitalOut myNotRelayH3(PB_8); // A questo Output è collegato un OptoRelay normalmente chiuso e quindi lavora in logica negata DigitalOut myRelayL3(PB_9); // indice per i cicli int nIndex; // comando ricevuto dal PC attraverso la routine di gestione interrupt Rx // 1: read all GPIO // 2: write all GPIO volatile int nReadCmd=0; // stato degli input volatile int myIn1Status; volatile int myIn2Status; volatile int myIn3Status; volatile int myIn4Status; volatile int myIn5Status; //********************************************** // IRQ per la Rx su seriale //********************************************** void RxInterrupt(void) { // array per la ricezione dei messaggi da seriale char caRxPacket[PACKETDIM]; int nRxPacketSize; // pntatore al comando, nella stringa ricevuta sulla seriale char* cCmdPosition; // reset array contenente pacchetto ricevuto nIndex=0; for(nIndex=0;nIndex<PACKETDIM;nIndex++) { caRxPacket[nIndex]='\0'; } // ricevi caratteri su seriale, se disponibili nRxPacketSize =0; while((pc.readable())) { // acquisice stringa in input e relativa dimensione pc.scanf("%s", &caRxPacket); nRxPacketSize = strlen(caRxPacket); } // restituisce il comando ricevuto e la dimensione pc.printf("Command: %s\n\r",caRxPacket); pc.printf("PacketSize: %d\n\r",nRxPacketSize); // COMANDO DI LETTURA INPUT: comando di lettura dei GPIO è "ReadGPIO" // confronta il comando ricevuto con quello di Read GPIO. // Restituisce le seguenti stringhe: // "USER-BUTTON: x"; x = 0/1 // "In1: 0/1"; x = 0/1 // "In2: 0/1"; x = 0/1 // "In3: 0/1"; x = 0/1 // "In4: 0/1"; x = 0/1 // "In5: 0/1"; x = 0/1 nReadCmd = strcmp(caRxPacket, "ReadGPIO"); if(nReadCmd==0) { // rileva lo stato degli input e trasmettili al PC-HOST pc.printf("USER-BUTTON: %d\n\r",myButton.read()); // il primo input è lo User-Button per scopi di diagnostica // myIn1: se legge 0/1, trasmette lo stato al PC if(myIn1==1) { pc.printf("In1: 1\n\r"); } else { pc.printf("In1: 0\n\r"); } // myIn2: se legge 0/1, trasmette lo stato al PC if(myIn2==1) { pc.printf("In2: 1\n\r"); } else { pc.printf("In2: 0\n\r"); } // myIn3: se legge 0/1, trasmette lo stato al PC if(myIn3==1) { pc.printf("In3: 1\n\r"); } else { pc.printf("In3: 0\n\r"); } // myIn4: se legge 0/1, trasmette lo stato al PC if(myIn4==1) { pc.printf("In4: 1\n\r"); } else { pc.printf("In4: 0\n\r"); } // myIn5: se legge 0/1, trasmette lo stato al PC if(myIn5==1) { pc.printf("In5: 1\n\r"); } else { pc.printf("In5: 0\n\r"); } } // if comando ricevuto == ReadGPIO else { // COMANDO PILOTAGGIO OUTPUT: il comando di pilotaggio output è composto da WriteGPIO-abcd // a=1/0: accende/spegne il LED di diagnostica LED2 // b=1/0: Out1 = 1/0 // c=1/0: Out1 = 1/0 // d=1/0: Out1 = 1/0 // verifica se nel comando ricevuto si trova la stringa WriteGPIO cCmdPosition=strstr(caRxPacket, "WriteGPIO"); if(cCmdPosition != NULL) // se il comando ricevuto contiene WriteGPIO, procedi con l'analisi dei dati { // si posiziona sul delimitatore '-' , tra il comando e i dati ed estrae la stringa contenente lo stato da inviare sugli Output cCmdPosition = strtok(caRxPacket,"-"); cCmdPosition = strtok(NULL,"-"); pc.printf("Data: %s\n\r", cCmdPosition); // USER_LED LED2 se il dato ricevto è '0/1' spegni/accendi il LED if(cCmdPosition[0]=='1') { // accendi LED e comunica al PC pc.printf("Led2: ON\n\r"); myLed2 = 1; } else { // spegni LED e comunica al PC pc.printf("Led2: OFF\n\r"); myLed2 = 0; } // Out1: se il dato ricevto è '0/1' spegni/accendi l'output if(cCmdPosition[1]=='1') { // accendi Out1 e comunica al PC pc.printf("Out1: ON\n\r"); myOut1 = 1; } else { // spegni Out1 e comunica al PC pc.printf("Out1: OFF\n\r"); myOut1 = 0; } // Out2: se il dato ricevto è '0/1' spegni/accendi l'output if(cCmdPosition[2]=='1') { // accendi Out2 e comunica al PC pc.printf("Out2: ON\n\r"); myOut2 = 1; } else { // spegni Out2 e comunica al PC pc.printf("Out2: OFF\n\r"); myOut2 = 0; } // Out3: se il dato ricevto è '0/1' spegni/accendi l'output if(cCmdPosition[3]=='1') { // accendi Out3 e comunica al PC pc.printf("Out3: ON\n\r"); myOut3 = 1; } else { // spegni Out3 e comunica al PC pc.printf("Out3: OFF\n\r"); myOut3 = 0; } } // if (comando ricevuto contiene "WriteGPIO") // COMANDO DI PILOTAGGIO CANBUS: Il comando ricevuto per il pilotaggio CANBUS è "CAN-abcd" // a=1/0: accende/spegne il LED di diagnostica LED2 // b=1/0: chiude/apre i relay del connettore 1: Relay11 e Relay12 // c=1/0: chiude/apre i relay del connettore 2: Relay21 e Relay22 // d=1/0: chiude/apre i relay del connettore 3: Relay31 e Relay32 // verifica se nel comando ricevuto è presente la strinca CAN; cCmdPosition=strstr(caRxPacket, "CAN"); if(cCmdPosition != NULL) // se il comando ricevuto contiene CAN, procedi con l'analisi dei dati { // si posiziona sul delimitatore '-' , tra il comando e i dati ed estrae la stringa contenente lo stato da inviare sugli Output cCmdPosition = strtok(caRxPacket,"-"); cCmdPosition = strtok(NULL,"-"); pc.printf("CAN-Data: %s\n\r", cCmdPosition); // Resetta: per commutare, apre tutti i relay di commutazione del CANBUS. Negli if() successivi aprirà i canali indirizzati myRelayH1 = 0; myRelayL1 = 0; myNotRelayH2 = 1; myNotRelayL2 = 1; myNotRelayH3 = 1; myRelayL3 = 0; // USER_LED LED2 se il dato ricevto è '0/1' spegni/accendi il LED if(cCmdPosition[0]=='1') { // Accendi LED e comunica al PC pc.printf("Led2: ON\n\r"); myLed2 = 1; } else { // spegni LED e comunica al PC pc.printf("Led2: OFF\n\r"); myLed2 = 0; } // CAN1: attiva il CAN sul connettore 1 if(cCmdPosition[1]=='1') { // Chiudi relay del connettore identificato e comunica al PC pc.printf("RelayH1: ON\n\r"); pc.printf("RelayL1: ON\n\r"); myRelayH1 = 1; myRelayL1 = 1; //myTest = 1; // solo per scopi di debug } else { // Apri relay del connettore identificato e comunica al PC pc.printf("RelayH1: OFF\n\r"); pc.printf("RelayL1: OFF\n\r"); myRelayH1 = 0; myRelayL1 = 0; //myTest = 0; // solo per scopi di debug } // CAN2: attiva il CAN sul connettore 2 if(cCmdPosition[2]=='1') { // Chiudi relay del connettore identificato e comunica al PC pc.printf("RelayH2: ON\n\r"); pc.printf("RelayL2: ON\n\r"); myNotRelayH2 = 0; myNotRelayL2 = 0; } else { // Apri relay del connettore identificato e comunica al PC pc.printf("RelayH2: OFF\n\r"); pc.printf("RelayL2: OFF\n\r"); myNotRelayH2 = 1; myNotRelayL2 = 1; } // CAN2: attiva il CAN sul connettore 3 if(cCmdPosition[3]=='1') { // Chiudi relay del connettore identificato e comunica al PC pc.printf("RelayH3: ON\n\r"); pc.printf("RelayL3: ON\n\r"); myNotRelayH3 = 0; myRelayL3 = 1; } else { // Apri relay del connettore identificato e comunica al PC pc.printf("RelayH3: OFF\n\r"); pc.printf("RelayL3: OFF\n\r"); myNotRelayH3 = 1; myRelayL3 = 0; } }// if (comando ricevuto contiene "CAN") } } //********************************************** // IRQ per la Rx su seriale //********************************************** int main() { // array per la ricezione dei messaggi da seriale //char caRxPacket[PACKETDIM]; //int nRxPacketSize; // puntatore al comando, nella stringa ricevuta sulla seriale //char* cCmdPosition; // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto //pc.baud(56000); // 57600 bps pc.baud(9600); // 9600 bps //pc.baud(19200); // 19200 bps //pc.baud(57600); // a questa velocità CVI sulla USB del PC perde dei dati //pc.baud(921600); // a questa velocità CVI sulla USB del PC perde dei dati // inizializza il LED myLed1 = 1; myLed2 = 1; myLed3 = 1; wait(1); myLed1 = 0; myLed2 = 0; myLed3 = 0; // configura il Button come input PullUp. Non premuto = 1, Premuto = 0; //+++ myButton.mode(PullUp); //Questo funziona con la F401 myButton.mode(PullDown); //Questo funziona con la F207 // configura gli input come PullUp. Aperto = 1; myIn1.mode(PullUp); myIn2.mode(PullUp); myIn3.mode(PullUp); myIn4.mode(PullUp); myIn5.mode(PullUp); /********** START Ciclo di test ******* while(true) { //if(myButton == 0) { myLed1 = 1; myLed2 = 1; myLed3 = 1; myTest = 0; myRelayH1 = 0; myRelayL1 = 0; myRelayH2 = 0; myRelayL2 = 0; myRelayH3 = 0; myRelayL3 = 0; } //else wait (1); { myLed1 = 0; myLed2 = 0; myLed3 = 0; myTest =1; myRelayH1 = 1; myRelayL1 = 1; myRelayH2 = 1; myRelayL2 = 1; myRelayH3 = 1; myRelayL3 = 1; } wait(1); } ********* END Ciclo di test ********/ // Attiva la IRQ per la RX su seriale pc.attach(&RxInterrupt,Serial::RxIrq); // ciclo in cui attende interrupt while(true) { } }