CRAC Team / Mbed 2 deprecated spi_traitement_v4

Dependencies:   mbed

Committer:
haarkon2
Date:
Fri May 22 12:23:47 2020 +0000
Revision:
0:4b4597f9e0df
progamme uC balise

Who changed what in which revision?

UserRevisionLine numberNew contents of line
haarkon2 0:4b4597f9e0df 1 #include "mbed.h"
haarkon2 0:4b4597f9e0df 2 #include <stdio.h>
haarkon2 0:4b4597f9e0df 3
haarkon2 0:4b4597f9e0df 4 //les 4 premiers bits de la variable trame sont pour la couleur
haarkon2 0:4b4597f9e0df 5 #define bleu 0x1000
haarkon2 0:4b4597f9e0df 6 #define rouge 0x2000
haarkon2 0:4b4597f9e0df 7 #define violet 0x4000 //bleu et rouge
haarkon2 0:4b4597f9e0df 8 #define rose 0x8000
haarkon2 0:4b4597f9e0df 9 //les 4 suivants pour le nombre de capteurs recus
haarkon2 0:4b4597f9e0df 10 //les 12 suivants toutes les positions des robots
haarkon2 0:4b4597f9e0df 11 #define nord 0x0100
haarkon2 0:4b4597f9e0df 12 #define est 0x0200
haarkon2 0:4b4597f9e0df 13 #define ouest 0x0400
haarkon2 0:4b4597f9e0df 14 #define sud 0x0800
haarkon2 0:4b4597f9e0df 15 //les directions des robots advers
haarkon2 0:4b4597f9e0df 16 #define face 0x0010
haarkon2 0:4b4597f9e0df 17 #define droite 0x0020
haarkon2 0:4b4597f9e0df 18 #define gauche 0x0040
haarkon2 0:4b4597f9e0df 19 #define derriere 0x0080
haarkon2 0:4b4597f9e0df 20
haarkon2 0:4b4597f9e0df 21 Serial pc(SERIAL_TX, SERIAL_RX, 115200);
haarkon2 0:4b4597f9e0df 22
haarkon2 0:4b4597f9e0df 23 DigitalIn IT(PA_3);
haarkon2 0:4b4597f9e0df 24
haarkon2 0:4b4597f9e0df 25 Ticker ticker;
haarkon2 0:4b4597f9e0df 26 DigitalOut tick(PA_8);
haarkon2 0:4b4597f9e0df 27
haarkon2 0:4b4597f9e0df 28 SPI spi(PA_7, PA_6, PA_5); //mosi, miso, sclk
haarkon2 0:4b4597f9e0df 29 DigitalOut cs(PA_4); //lance le compteur du SPI sur le FPGA
haarkon2 0:4b4597f9e0df 30
haarkon2 0:4b4597f9e0df 31 //cette fonction permet de generer un tick au FPGA pour changer le numero du capteur et aussi cadencé appel_spi()
haarkon2 0:4b4597f9e0df 32 void flip();
haarkon2 0:4b4597f9e0df 33
haarkon2 0:4b4597f9e0df 34 //permet de parler en SPI avec le FPGA
haarkon2 0:4b4597f9e0df 35 int appel_spi();
haarkon2 0:4b4597f9e0df 36
haarkon2 0:4b4597f9e0df 37 //calculer le nombre de capteur + le type du robot
haarkon2 0:4b4597f9e0df 38 void mini_traitement(unsigned int tableau[]);
haarkon2 0:4b4597f9e0df 39
haarkon2 0:4b4597f9e0df 40 //pour le SPI
haarkon2 0:4b4597f9e0df 41 int trame_spi = 0, pause_entre_trame = 0, ctp_ticker = 0, incrementation_for = 0;
haarkon2 0:4b4597f9e0df 42 //pour le traitement
haarkon2 0:4b4597f9e0df 43 int trame = 0, trame_robot1 = 0, trame_robot2 = 0, trame_robot3 = 0, urgence = 0;
haarkon2 0:4b4597f9e0df 44
haarkon2 0:4b4597f9e0df 45
haarkon2 0:4b4597f9e0df 46 int main()
haarkon2 0:4b4597f9e0df 47 {
haarkon2 0:4b4597f9e0df 48 cs = 1;
haarkon2 0:4b4597f9e0df 49 spi.format(16,0);
haarkon2 0:4b4597f9e0df 50 spi.frequency(1000000); //1MHz soit 1µs de periode par bits dans la trame si
haarkon2 0:4b4597f9e0df 51 ticker.attach(&flip, 0.0005); //soit 1ms entre chaque trame
haarkon2 0:4b4597f9e0df 52 unsigned int tableau[20] = {0};
haarkon2 0:4b4597f9e0df 53
haarkon2 0:4b4597f9e0df 54 while(1) {
haarkon2 0:4b4597f9e0df 55
haarkon2 0:4b4597f9e0df 56 //partie SPI
haarkon2 0:4b4597f9e0df 57 if(IT == 1) {
haarkon2 0:4b4597f9e0df 58 for(incrementation_for = 0; incrementation_for < 17; incrementation_for++) {
haarkon2 0:4b4597f9e0df 59 //je lis tout les capteurs soit 16 fois, +1 fois (cours de S3) car le premier appel en SPI n'est pas correct
haarkon2 0:4b4597f9e0df 60 appel_spi();
haarkon2 0:4b4597f9e0df 61 tableau[incrementation_for] = trame_spi;
haarkon2 0:4b4597f9e0df 62 //normalement si on printf l'ordre des trames est 0/8/4/C/2/A/6/E/1/9/5/D/3/B/7/F soit les numeros des capteurs
haarkon2 0:4b4597f9e0df 63 //pc.printf("%X\n\n\r",trame_spi);
haarkon2 0:4b4597f9e0df 64 }
haarkon2 0:4b4597f9e0df 65 //on fait une pause de 18 tick avant de redemander les 16 trames
haarkon2 0:4b4597f9e0df 66 if(incrementation_for == 17) pause_entre_trame = 1;
haarkon2 0:4b4597f9e0df 67
haarkon2 0:4b4597f9e0df 68 mini_traitement(tableau);
haarkon2 0:4b4597f9e0df 69 trame = 0;
haarkon2 0:4b4597f9e0df 70 }
haarkon2 0:4b4597f9e0df 71 }
haarkon2 0:4b4597f9e0df 72 }
haarkon2 0:4b4597f9e0df 73
haarkon2 0:4b4597f9e0df 74 void flip()
haarkon2 0:4b4597f9e0df 75 {
haarkon2 0:4b4597f9e0df 76 if(pause_entre_trame == 0) tick = !tick;
haarkon2 0:4b4597f9e0df 77 if(pause_entre_trame == 1) {
haarkon2 0:4b4597f9e0df 78 ctp_ticker++;
haarkon2 0:4b4597f9e0df 79 if(ctp_ticker == 18) {
haarkon2 0:4b4597f9e0df 80 pause_entre_trame = 0;
haarkon2 0:4b4597f9e0df 81 ctp_ticker = 0;
haarkon2 0:4b4597f9e0df 82 }
haarkon2 0:4b4597f9e0df 83 }
haarkon2 0:4b4597f9e0df 84 }
haarkon2 0:4b4597f9e0df 85
haarkon2 0:4b4597f9e0df 86 int appel_spi()
haarkon2 0:4b4597f9e0df 87 {
haarkon2 0:4b4597f9e0df 88 if(incrementation_for == 16) {
haarkon2 0:4b4597f9e0df 89 cs = 0;
haarkon2 0:4b4597f9e0df 90 trame_spi = spi.write(0x5555);
haarkon2 0:4b4597f9e0df 91 cs = 1;
haarkon2 0:4b4597f9e0df 92 } else {
haarkon2 0:4b4597f9e0df 93 while(tick == 1);
haarkon2 0:4b4597f9e0df 94 cs = 0;
haarkon2 0:4b4597f9e0df 95 trame_spi = spi.write(0x5555);
haarkon2 0:4b4597f9e0df 96 wait_ms(0.05);
haarkon2 0:4b4597f9e0df 97 cs = 1;
haarkon2 0:4b4597f9e0df 98 while(tick == 0);
haarkon2 0:4b4597f9e0df 99 }
haarkon2 0:4b4597f9e0df 100 return trame_spi;
haarkon2 0:4b4597f9e0df 101 }
haarkon2 0:4b4597f9e0df 102
haarkon2 0:4b4597f9e0df 103 void mini_traitement(unsigned int tableau[])
haarkon2 0:4b4597f9e0df 104 {
haarkon2 0:4b4597f9e0df 105 char a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0, j = 0, k = 0, l = 0, m = 0;
haarkon2 0:4b4597f9e0df 106 int traitement_type = 0;
haarkon2 0:4b4597f9e0df 107 int nb_robot = 0, nb_capteur = 0, type_robot = 0, type_robot_1 = 0, type_robot_2 = 0, type_robot_3 = 0, cote = 0, cote_robot_1 = 0, cote_robot_2 = 0, cote_robot_3 = 0;
haarkon2 0:4b4597f9e0df 108 unsigned char tab[4][20];
haarkon2 0:4b4597f9e0df 109 for(char i = 0; i < 4; i++) {
haarkon2 0:4b4597f9e0df 110 for(char n = 0; n < 20; n++) tab[i][n] = 0;
haarkon2 0:4b4597f9e0df 111 }
haarkon2 0:4b4597f9e0df 112 int cote_robot[4];
haarkon2 0:4b4597f9e0df 113 for(char i = 0; i < 4; i++) cote_robot[i] = 0;
haarkon2 0:4b4597f9e0df 114
haarkon2 0:4b4597f9e0df 115 for(char i = 1; i < 17; i++) {
haarkon2 0:4b4597f9e0df 116 if((tableau[i] & 0xFFF0) != 0) {
haarkon2 0:4b4597f9e0df 117 nb_capteur ++;
haarkon2 0:4b4597f9e0df 118 traitement_type = (tableau[i] & 0x1800);
haarkon2 0:4b4597f9e0df 119 if(i == 5 || i == 6 || (i >= 8 && i <= 12)) {
haarkon2 0:4b4597f9e0df 120 if (traitement_type == 0x1000) {b++;tab[2][i] = 1;
haarkon2 0:4b4597f9e0df 121 } else if(traitement_type == 0x0800) {a++;tab[1][i] = 1;
haarkon2 0:4b4597f9e0df 122 } else if(traitement_type == 0x1800 || traitement_type == 0x0000) {c++;tab[3][i] = 1;}
haarkon2 0:4b4597f9e0df 123 } else {
haarkon2 0:4b4597f9e0df 124 if (traitement_type == 0x1000) {a++;tab[1][i] = 1;
haarkon2 0:4b4597f9e0df 125 } else if(traitement_type == 0x0800) {b++;tab[2][i] = 1;
haarkon2 0:4b4597f9e0df 126 } else if(traitement_type == 0x1800 || traitement_type == 0x0000) {c++;tab[3][i] = 1;}
haarkon2 0:4b4597f9e0df 127 }
haarkon2 0:4b4597f9e0df 128 }
haarkon2 0:4b4597f9e0df 129 }
haarkon2 0:4b4597f9e0df 130
haarkon2 0:4b4597f9e0df 131 //nombre de robot + type de robot + nb capteur
haarkon2 0:4b4597f9e0df 132 //methode 2 de spi_traitement_v1
haarkon2 0:4b4597f9e0df 133 if(a >= 1) { nb_robot++; type_robot = bleu; type_robot_1 = bleu; }
haarkon2 0:4b4597f9e0df 134 if(b >= 1) { if(nb_robot == 1) type_robot = violet; else type_robot = rouge; nb_robot++; type_robot_2 = rouge; }
haarkon2 0:4b4597f9e0df 135 if(c >= 1) { if(nb_robot == 2) type_robot = type_robot | rose; else if(nb_robot == 1) type_robot = type_robot | rose; else type_robot = rose; nb_robot++; type_robot_3 = rose; }
haarkon2 0:4b4597f9e0df 136 trame_robot1 = type_robot_1 | a;
haarkon2 0:4b4597f9e0df 137 trame_robot2 = type_robot_2 | b;
haarkon2 0:4b4597f9e0df 138 trame_robot3 = type_robot_3 | c;
haarkon2 0:4b4597f9e0df 139 d = a + b + c;
haarkon2 0:4b4597f9e0df 140 trame = type_robot | (d << 4) | nb_robot;
haarkon2 0:4b4597f9e0df 141
haarkon2 0:4b4597f9e0df 142 //cote par rapport a notre robot
haarkon2 0:4b4597f9e0df 143 for(char i = 1; i < 4; i++) {
haarkon2 0:4b4597f9e0df 144
haarkon2 0:4b4597f9e0df 145 if((tab[i][16] == 1 || tab[i][15] == 1 || tab[i][1] == 1) && e == 0) {
haarkon2 0:4b4597f9e0df 146 e = 1;
haarkon2 0:4b4597f9e0df 147 cote = est;
haarkon2 0:4b4597f9e0df 148 if(tab[i][3] == 1) cote = cote | nord;
haarkon2 0:4b4597f9e0df 149 if(tab[i][13] == 1) cote = cote | sud;
haarkon2 0:4b4597f9e0df 150 } else if((tab[i][4] == 1 || tab[i][3] == 1 || tab[i][5] == 1) && f == 0) {
haarkon2 0:4b4597f9e0df 151 f = 1;
haarkon2 0:4b4597f9e0df 152 cote = nord;
haarkon2 0:4b4597f9e0df 153 if(tab[i][1] == 1) cote = cote | est;
haarkon2 0:4b4597f9e0df 154 if(tab[i][7] == 1) cote = cote | ouest;
haarkon2 0:4b4597f9e0df 155 } else if((tab[i][8] == 1 || tab[i][7] == 1 || tab[i][9] == 1) && g == 0) {
haarkon2 0:4b4597f9e0df 156 g = 1;
haarkon2 0:4b4597f9e0df 157 cote = ouest;
haarkon2 0:4b4597f9e0df 158 if(tab[i][5] == 1) cote = cote | nord;
haarkon2 0:4b4597f9e0df 159 if(tab[i][11] == 1) cote = cote | sud;
haarkon2 0:4b4597f9e0df 160 } else if((tab[i][12] == 1 || tab[i][11] == 1 || tab[i][13] == 1) && h == 0) {
haarkon2 0:4b4597f9e0df 161 h = 1;
haarkon2 0:4b4597f9e0df 162 cote = sud;
haarkon2 0:4b4597f9e0df 163 if(tab[i][9] == 1) cote = cote | ouest;
haarkon2 0:4b4597f9e0df 164 if(tab[i][15] == 1) cote = cote | est;
haarkon2 0:4b4597f9e0df 165 } else {
haarkon2 0:4b4597f9e0df 166 if(tab[i][2] == 1 && j == 0) {
haarkon2 0:4b4597f9e0df 167 j = 1;
haarkon2 0:4b4597f9e0df 168 cote = est | nord;
haarkon2 0:4b4597f9e0df 169 } else if(tab[i][6] == 1 && k == 0) {
haarkon2 0:4b4597f9e0df 170 k = 1;
haarkon2 0:4b4597f9e0df 171 cote = nord | ouest;
haarkon2 0:4b4597f9e0df 172 } else if(tab[i][10] == 1 && l == 0) {
haarkon2 0:4b4597f9e0df 173 l = 1;
haarkon2 0:4b4597f9e0df 174 cote = ouest | sud;
haarkon2 0:4b4597f9e0df 175 } else if(tab[i][14] == 1 && m == 0) {
haarkon2 0:4b4597f9e0df 176 m = 1;
haarkon2 0:4b4597f9e0df 177 cote = sud | est;
haarkon2 0:4b4597f9e0df 178 }
haarkon2 0:4b4597f9e0df 179 }
haarkon2 0:4b4597f9e0df 180 if(i == 1) cote_robot_1 = cote;
haarkon2 0:4b4597f9e0df 181 if(i == 2) cote_robot_2 = cote;
haarkon2 0:4b4597f9e0df 182 if(i == 3) cote_robot_3 = cote;
haarkon2 0:4b4597f9e0df 183 cote = 0;
haarkon2 0:4b4597f9e0df 184
haarkon2 0:4b4597f9e0df 185 //cote robot advers
haarkon2 0:4b4597f9e0df 186 for(char o = 1; o < 17; o++) {
haarkon2 0:4b4597f9e0df 187 if(tab[i][o] == 1) {
haarkon2 0:4b4597f9e0df 188 cote_robot[i] = (tableau[i] & 0x0700);
haarkon2 0:4b4597f9e0df 189 if (cote_robot[i] == 0x0000) cote_robot[i] = face; //pc.printf("face\n\n\r"); }
haarkon2 0:4b4597f9e0df 190 else if(cote_robot[i] == 0x0100) cote_robot[i] = derriere; //pc.printf("derriere\n\n\r"); }
haarkon2 0:4b4597f9e0df 191 else if(cote_robot[i] == 0x0200) cote_robot[i] = droite; //pc.printf("droite\n\n\r"); }
haarkon2 0:4b4597f9e0df 192 else if(cote_robot[i] == 0x0300) cote_robot[i] = gauche; //pc.printf("gauche\n\n\r"); }
haarkon2 0:4b4597f9e0df 193 else if(cote_robot[i] == 0x0400) cote_robot[i] = face | droite; //pc.printf("face droite\n\n\r"); }
haarkon2 0:4b4597f9e0df 194 else if(cote_robot[i] == 0x0500) cote_robot[i] = face | gauche; //pc.printf("face gauche\n\n\r"); }
haarkon2 0:4b4597f9e0df 195 else if(cote_robot[i] == 0x0600) cote_robot[i] = derriere | droite; //pc.printf("derriere droite\n\n\r"); }
haarkon2 0:4b4597f9e0df 196 else cote_robot[i] = derriere | gauche; //pc.printf("derriere gauche\n\n\r"); }
haarkon2 0:4b4597f9e0df 197 }
haarkon2 0:4b4597f9e0df 198 }
haarkon2 0:4b4597f9e0df 199 }
haarkon2 0:4b4597f9e0df 200 trame_robot1 = trame_robot1 | cote_robot_1 | cote_robot[1];
haarkon2 0:4b4597f9e0df 201 trame_robot2 = trame_robot2 | cote_robot_2 | cote_robot[2];
haarkon2 0:4b4597f9e0df 202 trame_robot3 = trame_robot3 | cote_robot_3 | cote_robot[3];
haarkon2 0:4b4597f9e0df 203 trame = trame | cote_robot_1 | cote_robot_2 | cote_robot_3;
haarkon2 0:4b4597f9e0df 204
haarkon2 0:4b4597f9e0df 205
haarkon2 0:4b4597f9e0df 206 pc.printf("%X ; %X ; %X ; %X\n\n\r", trame, trame_robot1, trame_robot2, trame_robot3);
haarkon2 0:4b4597f9e0df 207 }