ok

Dependencies:   mbed ssd1306_library

Committer:
emmanueldavid
Date:
Wed Mar 10 18:20:16 2021 +0000
Revision:
5:9c975d6bd219
Parent:
4:4f681e272268
Version 10/03

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emmanueldavid 0:bce63d085dc2 1 /*
emmanueldavid 0:bce63d085dc2 2 * Programme Carte 1
emmanueldavid 0:bce63d085dc2 3 * E. DAVID - Fevrier 2021
emmanueldavid 0:bce63d085dc2 4 */
emmanueldavid 0:bce63d085dc2 5
emmanueldavid 0:bce63d085dc2 6 #if !DEVICE_CAN
emmanueldavid 0:bce63d085dc2 7 #error [NOT_SUPPORTED] CAN not supported for this target
emmanueldavid 0:bce63d085dc2 8 #endif
emmanueldavid 0:bce63d085dc2 9
emmanueldavid 0:bce63d085dc2 10 #include "mbed.h"
emmanueldavid 0:bce63d085dc2 11 #include "ssd1306.h"
emmanueldavid 5:9c975d6bd219 12 #include "stm32f3xx_hal_can.h"
emmanueldavid 5:9c975d6bd219 13
emmanueldavid 5:9c975d6bd219 14 CAN_HandleTypeDef hcan1;
emmanueldavid 0:bce63d085dc2 15
emmanueldavid 0:bce63d085dc2 16 typedef enum{
emmanueldavid 0:bce63d085dc2 17 DataFrame,
emmanueldavid 0:bce63d085dc2 18 RemoteFrame,
emmanueldavid 0:bce63d085dc2 19 ErrorFrame,
emmanueldavid 0:bce63d085dc2 20 OverloadFrame
emmanueldavid 0:bce63d085dc2 21 } TypeTrame;
emmanueldavid 0:bce63d085dc2 22 TypeTrame Trame;
emmanueldavid 0:bce63d085dc2 23
emmanueldavid 5:9c975d6bd219 24 SSD1306 OLED (I2C_SDA, I2C_SCL, 0x78); // assumes default I2C address of 0x78
emmanueldavid 5:9c975d6bd219 25 //SSD1306 OLED (I2C_SDA, I2C_SCL, 0x3C); // assumes default I2C address of 0x78
emmanueldavid 4:4f681e272268 26
emmanueldavid 0:bce63d085dc2 27 /*
emmanueldavid 0:bce63d085dc2 28 typedef struct{
emmanueldavid 0:bce63d085dc2 29 can_id_t id;
emmanueldavid 0:bce63d085dc2 30 Uchar ctrl;
emmanueldavid 0:bce63d085dc2 31 Uchar * pt_donne;
emmanueldavid 0:bce63d085dc2 32 } can_msg_t;
emmanueldavid 0:bce63d085dc2 33 */
emmanueldavid 0:bce63d085dc2 34
emmanueldavid 5:9c975d6bd219 35 DigitalOut ledD9(PA_4);
emmanueldavid 5:9c975d6bd219 36 DigitalOut ledD8(PA_5); // Attention, désouder SB16&SB18 si utilisation I2c
emmanueldavid 5:9c975d6bd219 37 DigitalOut ledD7(PA_6);
emmanueldavid 5:9c975d6bd219 38 DigitalOut ledD6(PA_7);
emmanueldavid 0:bce63d085dc2 39
emmanueldavid 5:9c975d6bd219 40 DigitalIn SW4_1(PA_1);
emmanueldavid 5:9c975d6bd219 41 DigitalIn SW4_0(PA_3);
emmanueldavid 5:9c975d6bd219 42 DigitalIn SW1(PB_4, PullUp);
emmanueldavid 5:9c975d6bd219 43 DigitalIn SW2(PB_5, PullUp);
emmanueldavid 5:9c975d6bd219 44 //DigitalIn SW3(PA_8, PullUp);
emmanueldavid 0:bce63d085dc2 45
emmanueldavid 5:9c975d6bd219 46 //InterruptIn SW1(PB_4, PullUp);
emmanueldavid 5:9c975d6bd219 47 //InterruptIn SW2(PB_5, PullUp);
emmanueldavid 0:bce63d085dc2 48 InterruptIn SW3(PA_8, PullUp);
emmanueldavid 0:bce63d085dc2 49
emmanueldavid 4:4f681e272268 50 AnalogIn adc_RV1(PA_0);
emmanueldavid 5:9c975d6bd219 51 //Timer antirebond;
emmanueldavid 4:4f681e272268 52
emmanueldavid 0:bce63d085dc2 53 CAN can(PA_11, PA_12);
emmanueldavid 5:9c975d6bd219 54 Serial pc(USBTX, USBRX);
emmanueldavid 0:bce63d085dc2 55
emmanueldavid 4:4f681e272268 56 int value_SW4; // valeur 0,1,2,3
emmanueldavid 5:9c975d6bd219 57
emmanueldavid 5:9c975d6bd219 58 char Reset[6] = "Reset";
emmanueldavid 5:9c975d6bd219 59 char Donnees[12]="";
emmanueldavid 0:bce63d085dc2 60 char Data[5] = "GEII";
emmanueldavid 5:9c975d6bd219 61 char DataArbitrage[5] = "K1bb";
emmanueldavid 5:9c975d6bd219 62 int Nb_messT = 0;
emmanueldavid 5:9c975d6bd219 63 int Nb_messR = 0;
emmanueldavid 5:9c975d6bd219 64
emmanueldavid 0:bce63d085dc2 65
emmanueldavid 5:9c975d6bd219 66 int detectionFrontSW1(void) {
emmanueldavid 5:9c975d6bd219 67 int frontDescendant = 0;
emmanueldavid 5:9c975d6bd219 68 static int etatPrecedent1=1;
emmanueldavid 5:9c975d6bd219 69 int bp1 = SW1.read();
emmanueldavid 5:9c975d6bd219 70 if(bp1!=etatPrecedent1 && !bp1)
emmanueldavid 5:9c975d6bd219 71 frontDescendant = 1;
emmanueldavid 5:9c975d6bd219 72 etatPrecedent1= bp1;
emmanueldavid 5:9c975d6bd219 73 return frontDescendant;
emmanueldavid 0:bce63d085dc2 74 }
emmanueldavid 0:bce63d085dc2 75
emmanueldavid 5:9c975d6bd219 76 int detectionFrontSW2(void) {
emmanueldavid 5:9c975d6bd219 77 int frontDescendant = 0;
emmanueldavid 5:9c975d6bd219 78 static int etatPrecedent2=1;
emmanueldavid 5:9c975d6bd219 79 int bp2 = SW2.read();
emmanueldavid 5:9c975d6bd219 80 if(bp2!=etatPrecedent2 && !bp2)
emmanueldavid 5:9c975d6bd219 81 frontDescendant = 1;
emmanueldavid 5:9c975d6bd219 82 etatPrecedent2= bp2;
emmanueldavid 5:9c975d6bd219 83 return frontDescendant;
emmanueldavid 0:bce63d085dc2 84 }
emmanueldavid 0:bce63d085dc2 85
emmanueldavid 5:9c975d6bd219 86 /*
emmanueldavid 5:9c975d6bd219 87 int detectionFrontSW3(void) {
emmanueldavid 5:9c975d6bd219 88 int frontDescendant = 0;
emmanueldavid 5:9c975d6bd219 89 static int etatPrecedent1=1;
emmanueldavid 5:9c975d6bd219 90 int bp = SW3.read();
emmanueldavid 5:9c975d6bd219 91 if(bp!=etatPrecedent1 && !bp)
emmanueldavid 5:9c975d6bd219 92 frontDescendant = 1;
emmanueldavid 5:9c975d6bd219 93 etatPrecedent1= bp;
emmanueldavid 5:9c975d6bd219 94 return frontDescendant;
emmanueldavid 5:9c975d6bd219 95 }
emmanueldavid 5:9c975d6bd219 96 */
emmanueldavid 5:9c975d6bd219 97
emmanueldavid 5:9c975d6bd219 98 /* Test Arbitrage */
emmanueldavid 5:9c975d6bd219 99 void AppuiSW3() {
emmanueldavid 5:9c975d6bd219 100 if (value_SW4 == 3) {
emmanueldavid 5:9c975d6bd219 101 if (can.write(CANMessage(60, DataArbitrage, 5 , CANData, CANStandard))) { // Rmq : tableau = pointeur
emmanueldavid 5:9c975d6bd219 102 ledD8 = !ledD8;
emmanueldavid 5:9c975d6bd219 103 Nb_messT++;
emmanueldavid 5:9c975d6bd219 104 }
emmanueldavid 5:9c975d6bd219 105 }
emmanueldavid 5:9c975d6bd219 106 }
emmanueldavid 5:9c975d6bd219 107
emmanueldavid 5:9c975d6bd219 108
emmanueldavid 1:a119d8dc3ef7 109 int LectureSW4(){
emmanueldavid 2:8bc7e935c5a6 110 int ETAT;
emmanueldavid 4:4f681e272268 111 int value_SW4_0 = SW4_0.read();
emmanueldavid 4:4f681e272268 112 int value_SW4_1 = SW4_1.read();
emmanueldavid 4:4f681e272268 113
emmanueldavid 4:4f681e272268 114 if (value_SW4_1 == 1) {
emmanueldavid 4:4f681e272268 115 if (value_SW4_0 == 1)
emmanueldavid 1:a119d8dc3ef7 116 ETAT = 3;
emmanueldavid 1:a119d8dc3ef7 117 else
emmanueldavid 1:a119d8dc3ef7 118 ETAT = 2;
emmanueldavid 1:a119d8dc3ef7 119 }
emmanueldavid 1:a119d8dc3ef7 120 else {
emmanueldavid 4:4f681e272268 121 if (value_SW4_0 == 1)
emmanueldavid 1:a119d8dc3ef7 122 ETAT = 1;
emmanueldavid 1:a119d8dc3ef7 123 else
emmanueldavid 1:a119d8dc3ef7 124 ETAT = 0;
emmanueldavid 1:a119d8dc3ef7 125 }
emmanueldavid 2:8bc7e935c5a6 126 return ETAT;
emmanueldavid 1:a119d8dc3ef7 127 }
emmanueldavid 1:a119d8dc3ef7 128
emmanueldavid 5:9c975d6bd219 129 int main() {
emmanueldavid 5:9c975d6bd219 130 //HAL_Init();
emmanueldavid 5:9c975d6bd219 131
emmanueldavid 5:9c975d6bd219 132 //uint8_t receivedMessage[8];
emmanueldavid 5:9c975d6bd219 133 //CAN_RxHeaderTypeDef RxHeader;
emmanueldavid 1:a119d8dc3ef7 134
emmanueldavid 5:9c975d6bd219 135 //HAL_CAN_Start(&hcan);
emmanueldavid 5:9c975d6bd219 136
emmanueldavid 5:9c975d6bd219 137 pc.baud(115200);
emmanueldavid 5:9c975d6bd219 138 pc.printf("Affichage serie Carte 1 \n");
emmanueldavid 4:4f681e272268 139
emmanueldavid 0:bce63d085dc2 140 can.frequency(500000);
emmanueldavid 0:bce63d085dc2 141
emmanueldavid 5:9c975d6bd219 142 CANMessage msg;
emmanueldavid 5:9c975d6bd219 143 //unsigned char REC, TEC ;
emmanueldavid 4:4f681e272268 144
emmanueldavid 5:9c975d6bd219 145 ledD6 = 1; ledD7 = 1; ledD8 = 1; ledD9 = 1;
emmanueldavid 5:9c975d6bd219 146
emmanueldavid 4:4f681e272268 147 OLED.speed (SSD1306::Medium); // set working frequency
emmanueldavid 4:4f681e272268 148 OLED.init(); // initialize SSD1306
emmanueldavid 4:4f681e272268 149 OLED.cls(); // clear frame buffer
emmanueldavid 5:9c975d6bd219 150 /*
emmanueldavid 4:4f681e272268 151 OLED.locate (0,0); // set text cursor to line 3, column 1
emmanueldavid 5:9c975d6bd219 152 OLED.printf ("GEII - Bus CAN"); // print to frame buffer
emmanueldavid 4:4f681e272268 153 OLED.redraw(); // updates actual display transferring frame buffer over I2C bus
emmanueldavid 5:9c975d6bd219 154 */
emmanueldavid 5:9c975d6bd219 155 //SW1.fall(&AppuiSW1);
emmanueldavid 5:9c975d6bd219 156 SW3.fall(&AppuiSW3);
emmanueldavid 5:9c975d6bd219 157 //antirebond.start();
emmanueldavid 0:bce63d085dc2 158
emmanueldavid 5:9c975d6bd219 159 OLED.locate (0,0);
emmanueldavid 5:9c975d6bd219 160 OLED.printf ("NbRx = 0");
emmanueldavid 5:9c975d6bd219 161 OLED.locate (1,0);
emmanueldavid 5:9c975d6bd219 162 OLED.printf ("NbTx = 0");
emmanueldavid 0:bce63d085dc2 163
emmanueldavid 0:bce63d085dc2 164 while(1)
emmanueldavid 4:4f681e272268 165 {
emmanueldavid 4:4f681e272268 166 value_SW4 = LectureSW4();
emmanueldavid 5:9c975d6bd219 167
emmanueldavid 5:9c975d6bd219 168 if (detectionFrontSW1())
emmanueldavid 5:9c975d6bd219 169 {
emmanueldavid 5:9c975d6bd219 170 if (value_SW4 == 0) {
emmanueldavid 5:9c975d6bd219 171 if (can.write(CANMessage(1975, Data, 5 , CANData, CANStandard))) { // Rmq : tableau = pointeur
emmanueldavid 5:9c975d6bd219 172 ledD6 = !ledD6;
emmanueldavid 5:9c975d6bd219 173 Nb_messT++;
emmanueldavid 5:9c975d6bd219 174 }
emmanueldavid 5:9c975d6bd219 175 }
emmanueldavid 5:9c975d6bd219 176 }
emmanueldavid 5:9c975d6bd219 177 if (detectionFrontSW2())
emmanueldavid 5:9c975d6bd219 178 {
emmanueldavid 5:9c975d6bd219 179 if (value_SW4 == 0) {
emmanueldavid 5:9c975d6bd219 180 if (can.write(CANMessage(1975, CANStandard))) { // Remote frame
emmanueldavid 5:9c975d6bd219 181 ledD7 = !ledD7;
emmanueldavid 5:9c975d6bd219 182 Nb_messT++;
emmanueldavid 5:9c975d6bd219 183 }
emmanueldavid 5:9c975d6bd219 184 }
emmanueldavid 5:9c975d6bd219 185 }
emmanueldavid 5:9c975d6bd219 186 /*
emmanueldavid 5:9c975d6bd219 187 if (detectionFrontSW3())
emmanueldavid 5:9c975d6bd219 188 {
emmanueldavid 5:9c975d6bd219 189 if (value_SW4 == 3) {
emmanueldavid 5:9c975d6bd219 190 if (can.write(CANMessage(60, DataArbitrage, 5 , CANData, CANStandard))) { // Rmq : tableau = pointeur
emmanueldavid 5:9c975d6bd219 191 ledD8 = !ledD8;
emmanueldavid 5:9c975d6bd219 192 Nb_messT++;
emmanueldavid 5:9c975d6bd219 193 }
emmanueldavid 5:9c975d6bd219 194 }
emmanueldavid 5:9c975d6bd219 195 }
emmanueldavid 5:9c975d6bd219 196 */
emmanueldavid 5:9c975d6bd219 197
emmanueldavid 5:9c975d6bd219 198 if (can.read(msg)) {
emmanueldavid 5:9c975d6bd219 199 Nb_messR++;
emmanueldavid 5:9c975d6bd219 200 ledD9 = !ledD9;
emmanueldavid 5:9c975d6bd219 201 for (int i =0; i < msg.len; i++)
emmanueldavid 5:9c975d6bd219 202 Donnees[i] = msg.data[i];
emmanueldavid 5:9c975d6bd219 203 pc.printf("ID = 0x%.3x\r\n", msg.id); //ID sous forme 0x suivi de l'id
emmanueldavid 5:9c975d6bd219 204 pc.printf("Length = %d\r\n", msg.len);
emmanueldavid 5:9c975d6bd219 205 pc.printf("Boucle envoi CAN rderrors : %d, CAN tderrors : %d\n", can.rderror(), can.tderror());
emmanueldavid 5:9c975d6bd219 206 //REC = can.rderror();
emmanueldavid 5:9c975d6bd219 207 }
emmanueldavid 5:9c975d6bd219 208
emmanueldavid 5:9c975d6bd219 209 OLED.locate (0,0);
emmanueldavid 5:9c975d6bd219 210 OLED.printf ("NbRx = %d", Nb_messR);
emmanueldavid 5:9c975d6bd219 211 OLED.locate (1,0);
emmanueldavid 5:9c975d6bd219 212 OLED.printf ("NbTx = %d", Nb_messT);
emmanueldavid 5:9c975d6bd219 213 OLED.locate (3,0);
emmanueldavid 5:9c975d6bd219 214 OLED.printf ("Message recu ");
emmanueldavid 5:9c975d6bd219 215 OLED.locate (4,0);
emmanueldavid 5:9c975d6bd219 216 OLED.printf ("=> ");
emmanueldavid 5:9c975d6bd219 217 OLED.puts(Donnees);
emmanueldavid 5:9c975d6bd219 218 OLED.locate (6,0);
emmanueldavid 5:9c975d6bd219 219 OLED.printf("Valeur REC=%u", can.rderror());
emmanueldavid 5:9c975d6bd219 220 OLED.locate (7,0);
emmanueldavid 5:9c975d6bd219 221 OLED.printf("Valeur TEC=%u", can.tderror());
emmanueldavid 5:9c975d6bd219 222 OLED.redraw();
emmanueldavid 5:9c975d6bd219 223 wait(0.2);
emmanueldavid 5:9c975d6bd219 224 }
emmanueldavid 5:9c975d6bd219 225 }
emmanueldavid 5:9c975d6bd219 226
emmanueldavid 5:9c975d6bd219 227
emmanueldavid 5:9c975d6bd219 228 /* Envoi d'une trame de requete */
emmanueldavid 5:9c975d6bd219 229 /*
emmanueldavid 5:9c975d6bd219 230 void AppuiSW2() {
emmanueldavid 5:9c975d6bd219 231 if (can.write(CANMessage(1620, CANStandard ))) {
emmanueldavid 5:9c975d6bd219 232 ledD7 = !ledD7;
emmanueldavid 5:9c975d6bd219 233 }
emmanueldavid 5:9c975d6bd219 234 }
emmanueldavid 5:9c975d6bd219 235 */
emmanueldavid 5:9c975d6bd219 236
emmanueldavid 5:9c975d6bd219 237
emmanueldavid 5:9c975d6bd219 238
emmanueldavid 5:9c975d6bd219 239 /* Envoi d'une trame de donnees */
emmanueldavid 5:9c975d6bd219 240 /*
emmanueldavid 5:9c975d6bd219 241 void AppuiSW1() {
emmanueldavid 5:9c975d6bd219 242 if (antirebond.read_ms() > 100)
emmanueldavid 5:9c975d6bd219 243 {
emmanueldavid 5:9c975d6bd219 244 //while(!SW1);
emmanueldavid 5:9c975d6bd219 245 if (value_SW4 == 1)
emmanueldavid 5:9c975d6bd219 246 {
emmanueldavid 5:9c975d6bd219 247 if (can.write(CANMessage(2021, Data, 5 , CANData, CANStandard))) // Rmq : tableau = pointeur
emmanueldavid 5:9c975d6bd219 248 ledD6 = !ledD6;
emmanueldavid 5:9c975d6bd219 249 }
emmanueldavid 5:9c975d6bd219 250 antirebond.reset();
emmanueldavid 5:9c975d6bd219 251 }
emmanueldavid 5:9c975d6bd219 252 }
emmanueldavid 5:9c975d6bd219 253 */
emmanueldavid 5:9c975d6bd219 254 /*
emmanueldavid 5:9c975d6bd219 255 char *conversionIntChaine(int longueurChaine, int Valeur_int, char *ChaineAffichage)
emmanueldavid 5:9c975d6bd219 256 {
emmanueldavid 5:9c975d6bd219 257 while (longueurChaine >= 0)
emmanueldavid 5:9c975d6bd219 258 {
emmanueldavid 5:9c975d6bd219 259 ChaineAffichage[longueurChaine] = (Valeur_int % 10) + 48;
emmanueldavid 5:9c975d6bd219 260 Valeur_int /= 10;
emmanueldavid 5:9c975d6bd219 261 longueurChaine--;
emmanueldavid 5:9c975d6bd219 262 }
emmanueldavid 5:9c975d6bd219 263 return (ChaineAffichage);
emmanueldavid 5:9c975d6bd219 264 }
emmanueldavid 5:9c975d6bd219 265 */
emmanueldavid 5:9c975d6bd219 266 /*
emmanueldavid 4:4f681e272268 267 OLED.locate (2,0);
emmanueldavid 5:9c975d6bd219 268 OLED.printf("ADC A0=%2.1f", (adc_RV1.read()*100));
emmanueldavid 4:4f681e272268 269 OLED.locate (3,0);
emmanueldavid 4:4f681e272268 270 OLED.printf("Valeur SW4_1=%d", SW4_0.read());
emmanueldavid 4:4f681e272268 271 OLED.locate (4,0);
emmanueldavid 4:4f681e272268 272 OLED.printf("Valeur SW4_2=%d", SW4_1.read());
emmanueldavid 4:4f681e272268 273 OLED.locate (5,0);
emmanueldavid 4:4f681e272268 274 OLED.printf("Valeur SW4=%d", value_SW4);
emmanueldavid 5:9c975d6bd219 275 */