app4

Dependencies:   mbed-rtos mbed CRC16

Fork of S5info_APP2 by Éric Bisson

Committer:
ericbisson
Date:
Tue Mar 07 08:52:38 2017 +0000
Revision:
24:2034362db66f
Parent:
23:9c4e4898b741
Child:
25:d0c348c3c85d
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ericbisson 15:7c2e70c36b98 1 #include "CRC16.h"
ericbisson 7:5501dbea5650 2 #include "mbed.h"
ericbisson 0:c637467eeb8f 3 #include "rtos.h"
ericbisson 15:7c2e70c36b98 4 #include <vector>
ericbisson 15:7c2e70c36b98 5 using std::vector;
ericbisson 15:7c2e70c36b98 6 DigitalIn in(p30);
ericbisson 8:5b87b1f9d91f 7 Thread ThreadLecture;
ericbisson 24:2034362db66f 8 Thread ThreadWrite;
ericbisson 15:7c2e70c36b98 9 const int PREAMBULE = 0b01010101;
ericbisson 15:7c2e70c36b98 10 const int START = 0b01111110;
ericbisson 15:7c2e70c36b98 11 const int END = 0b01111110;
ericbisson 14:bd909277eb13 12 Serial pc(USBTX, USBRX);
ericbisson 24:2034362db66f 13 DigitalOut out(p13);
ericbisson 24:2034362db66f 14 DigitalOut myled1(LED1);
ericbisson 24:2034362db66f 15 DigitalOut myled2(LED2);
ericbisson 2:c6465d4e82d2 16
JoeyDionne 12:a55f77a0e188 17 bool transmit = false; //faux pour le debut de demi-periode d'envoie d'un bit, vrai pour la 2ème demi-periode
JoeyDionne 12:a55f77a0e188 18 char trame_sent[80]; //tableau de la trame à envoyer
JoeyDionne 12:a55f77a0e188 19 uint8_t byte_sent_pos, //position de l'octet dans le tableau d'envoi
JoeyDionne 12:a55f77a0e188 20 trame_length; //longueur de la trame complete
ericbisson 20:ac8682cf923b 21
JoeyDionne 23:9c4e4898b741 22 signed char bit_sent; //position du bit de l'octet en cours d'envoi (du MSB au LSB) 7..0
JoeyDionne 23:9c4e4898b741 23 bool bTimer1 = false;
JoeyDionne 11:b27d1a83f688 24
JoeyDionne 23:9c4e4898b741 25 //encodage manchester
JoeyDionne 23:9c4e4898b741 26 bool codeManchester(bool bit, bool clock)
JoeyDionne 23:9c4e4898b741 27 {
JoeyDionne 23:9c4e4898b741 28 return (bit == clock);
JoeyDionne 23:9c4e4898b741 29 }
JoeyDionne 23:9c4e4898b741 30
JoeyDionne 23:9c4e4898b741 31 //Envoie de données bit par bit
JoeyDionne 23:9c4e4898b741 32 void send_data()
JoeyDionne 23:9c4e4898b741 33 {
JoeyDionne 23:9c4e4898b741 34 out = codeManchester(((trame_sent[byte_sent_pos] >> bit_sent) & 0x01), bTimer1);
JoeyDionne 23:9c4e4898b741 35 if(bTimer1)
JoeyDionne 23:9c4e4898b741 36 {
JoeyDionne 23:9c4e4898b741 37 bit_sent--;
JoeyDionne 23:9c4e4898b741 38 }
JoeyDionne 23:9c4e4898b741 39 bTimer1 = !bTimer1; //varier entre la 1ere et 2eme partie de demi-periode
JoeyDionne 23:9c4e4898b741 40 if (bit_sent < 0) //Si l'octet a ete envoye
JoeyDionne 23:9c4e4898b741 41 {
JoeyDionne 23:9c4e4898b741 42 bit_sent = 7; //remettre la position initiale pour le prochain octet
JoeyDionne 23:9c4e4898b741 43 byte_sent_pos++; //incrementer l'octet
JoeyDionne 23:9c4e4898b741 44 if (byte_sent_pos >= trame_length) //Si la trame a ete envoyee
JoeyDionne 23:9c4e4898b741 45 {
JoeyDionne 23:9c4e4898b741 46 byte_sent_pos = 0;
JoeyDionne 23:9c4e4898b741 47 bTimer1 = false;
JoeyDionne 23:9c4e4898b741 48 LPC_TIM1->TCR = 0; // disable Timer
JoeyDionne 23:9c4e4898b741 49 }
JoeyDionne 23:9c4e4898b741 50 }
JoeyDionne 23:9c4e4898b741 51 }
JoeyDionne 23:9c4e4898b741 52
ericbisson 14:bd909277eb13 53 extern "C" void TIMER1_IRQHandler()
ericbisson 14:bd909277eb13 54 {
ericbisson 24:2034362db66f 55 LPC_TIM1->TC = 0;
ericbisson 24:2034362db66f 56
ericbisson 24:2034362db66f 57 myled1 = !myled1;
ericbisson 14:bd909277eb13 58 if ((LPC_TIM1->IR & 0x01) == 0x01)
ericbisson 14:bd909277eb13 59 {
JoeyDionne 22:7244c3391bac 60 send_data();
ericbisson 14:bd909277eb13 61 LPC_TIM1->IR |= 1 << 0; // clear
ericbisson 14:bd909277eb13 62 }
ericbisson 1:b3ae0d9f02ad 63 }
ericbisson 1:b3ae0d9f02ad 64
ericbisson 14:bd909277eb13 65 int PeriodLength = 0;
ericbisson 14:bd909277eb13 66 bool bReceivedFirstBit = false;
ericbisson 24:2034362db66f 67 bool bInvert = false;
ericbisson 14:bd909277eb13 68 extern "C" void TIMER2_IRQHandler()
ericbisson 7:5501dbea5650 69 {
ericbisson 24:2034362db66f 70 LPC_TIM2->TC = 0;
ericbisson 24:2034362db66f 71 LPC_TIM2->IR |= 0xFFFFFFFF; // clear
ericbisson 24:2034362db66f 72
ericbisson 24:2034362db66f 73 myled2 = !myled2;
ericbisson 14:bd909277eb13 74 if (PeriodLength > 0)
ericbisson 7:5501dbea5650 75 {
ericbisson 24:2034362db66f 76 if (LPC_TIM2->CR0 >= PeriodLength)
ericbisson 8:5b87b1f9d91f 77 {
ericbisson 24:2034362db66f 78 bInvert = false;
ericbisson 14:bd909277eb13 79 }
ericbisson 14:bd909277eb13 80 else
ericbisson 14:bd909277eb13 81 {
ericbisson 24:2034362db66f 82 bInvert = true;
ericbisson 8:5b87b1f9d91f 83 }
ericbisson 1:b3ae0d9f02ad 84 }
ericbisson 14:bd909277eb13 85 else if (bReceivedFirstBit)
ericbisson 14:bd909277eb13 86 {
ericbisson 24:2034362db66f 87 PeriodLength = (LPC_TIM2->CR0 / 2) * 1.5;
ericbisson 14:bd909277eb13 88 }
ericbisson 14:bd909277eb13 89 else
ericbisson 14:bd909277eb13 90 {
ericbisson 14:bd909277eb13 91 bReceivedFirstBit = true;
ericbisson 14:bd909277eb13 92 }
ericbisson 24:2034362db66f 93 ThreadLecture.signal_set(1);
ericbisson 14:bd909277eb13 94 }
ericbisson 4:87e9b434bb4d 95
JoeyDionne 13:a436ba0b78e8 96 //création de la trame
ericbisson 20:ac8682cf923b 97 void create_trame(char message[],unsigned char taille)
JoeyDionne 12:a55f77a0e188 98 {
ericbisson 20:ac8682cf923b 99 CRC16 myCRC;
ericbisson 20:ac8682cf923b 100 unsigned short resultCRC = myCRC.calculateCRC16(message,taille);
JoeyDionne 12:a55f77a0e188 101
ericbisson 20:ac8682cf923b 102 trame_sent[0] = PREAMBULE; //Preambule
ericbisson 20:ac8682cf923b 103 trame_sent[1] = START; //Start
JoeyDionne 12:a55f77a0e188 104 trame_sent[2] = 0x00; //Type + Flag mis a 0x00
ericbisson 20:ac8682cf923b 105 trame_sent[3] = taille; //Longueur du message (Max 33 caractères)
JoeyDionne 12:a55f77a0e188 106
JoeyDionne 13:a436ba0b78e8 107 //message
ericbisson 20:ac8682cf923b 108 for (char i=0;i<taille;i++)
JoeyDionne 13:a436ba0b78e8 109 {
JoeyDionne 13:a436ba0b78e8 110 trame_sent[taille + 4] = message[i];
JoeyDionne 13:a436ba0b78e8 111 }
JoeyDionne 13:a436ba0b78e8 112
JoeyDionne 13:a436ba0b78e8 113 //CRC16
JoeyDionne 13:a436ba0b78e8 114 trame_sent[taille + 4] = (resultCRC >> 8) & 0xFF;
JoeyDionne 13:a436ba0b78e8 115 trame_sent[taille + 5] = resultCRC & 0xFF;
JoeyDionne 13:a436ba0b78e8 116
ericbisson 20:ac8682cf923b 117 trame_sent[taille + 6] = END; //End
JoeyDionne 13:a436ba0b78e8 118 trame_length = taille + 7; //Longueur de la trame
JoeyDionne 13:a436ba0b78e8 119 }
JoeyDionne 13:a436ba0b78e8 120
JoeyDionne 13:a436ba0b78e8 121 //obtention du texte
JoeyDionne 13:a436ba0b78e8 122 void get_text()
JoeyDionne 13:a436ba0b78e8 123 {
ericbisson 24:2034362db66f 124 while (true)
ericbisson 24:2034362db66f 125 {
ericbisson 24:2034362db66f 126 char text[4] = {'a','l','l','o'};
ericbisson 24:2034362db66f 127 unsigned char count = 4;
ericbisson 24:2034362db66f 128
ericbisson 24:2034362db66f 129 create_trame(text,count);
ericbisson 24:2034362db66f 130 byte_sent_pos = 0;
ericbisson 24:2034362db66f 131 bit_sent = 7;
ericbisson 24:2034362db66f 132 bTimer1 = false;
ericbisson 24:2034362db66f 133 LPC_TIM1->TCR = 1; // enable and reset Timer
ericbisson 24:2034362db66f 134
ericbisson 24:2034362db66f 135 wait_ms(1000);
ericbisson 24:2034362db66f 136 }
ericbisson 24:2034362db66f 137 /*pc.printf("\n\rYour text : ");
ericbisson 20:ac8682cf923b 138 unsigned char count = 0;
JoeyDionne 12:a55f77a0e188 139 char c = 0x00;
JoeyDionne 12:a55f77a0e188 140 char text[73];
ericbisson 20:ac8682cf923b 141 while(c != '\r' && count < 73) {
JoeyDionne 12:a55f77a0e188 142 c = pc.getc();
JoeyDionne 12:a55f77a0e188 143 text[count] = c;
JoeyDionne 12:a55f77a0e188 144 pc.putc(c);
JoeyDionne 12:a55f77a0e188 145 count++;
JoeyDionne 12:a55f77a0e188 146 }
ericbisson 24:2034362db66f 147 pc.printf("get_text();\n");*/
JoeyDionne 12:a55f77a0e188 148 }
JoeyDionne 12:a55f77a0e188 149
ericbisson 15:7c2e70c36b98 150 void read()
ericbisson 15:7c2e70c36b98 151 {
ericbisson 16:f2661759714c 152 char byte = 0;
ericbisson 15:7c2e70c36b98 153 vector<char> bytes;
ericbisson 15:7c2e70c36b98 154 char shift = 0;
ericbisson 16:f2661759714c 155 char totalsize = 7;
ericbisson 17:2b4b3f3a0489 156 CRC16 mycrc16;
ericbisson 15:7c2e70c36b98 157 while (true)
ericbisson 15:7c2e70c36b98 158 {
ericbisson 15:7c2e70c36b98 159 ThreadLecture.signal_wait(1);
ericbisson 15:7c2e70c36b98 160
ericbisson 24:2034362db66f 161 if (bInvert)
ericbisson 24:2034362db66f 162 {
ericbisson 24:2034362db66f 163 byte = (byte << 1) + !in;
ericbisson 24:2034362db66f 164 }
ericbisson 24:2034362db66f 165 else
ericbisson 24:2034362db66f 166 {
ericbisson 24:2034362db66f 167 byte = (byte << 1) + in;
ericbisson 24:2034362db66f 168 }
ericbisson 15:7c2e70c36b98 169
ericbisson 15:7c2e70c36b98 170 shift++;
ericbisson 15:7c2e70c36b98 171 if (shift == 8)
ericbisson 15:7c2e70c36b98 172 {
ericbisson 16:f2661759714c 173 shift = 0;
ericbisson 16:f2661759714c 174
ericbisson 16:f2661759714c 175 // à partir d'ici, je travaille en byte et non bit
ericbisson 15:7c2e70c36b98 176 bytes.push_back(byte);
ericbisson 16:f2661759714c 177
ericbisson 16:f2661759714c 178 // Validations de base
ericbisson 16:f2661759714c 179 if ((bytes.size() == 1 && bytes[0] != PREAMBULE) ||
ericbisson 16:f2661759714c 180 (bytes.size() == 2 && bytes[1] != START))
ericbisson 16:f2661759714c 181 {
ericbisson 20:ac8682cf923b 182 if (bytes.size() == 1)
ericbisson 20:ac8682cf923b 183 {
ericbisson 20:ac8682cf923b 184 pc.printf("[DEBUG] - Invalid PREAMBULE : %x\n", bytes[0]);
ericbisson 20:ac8682cf923b 185 }
ericbisson 20:ac8682cf923b 186 else
ericbisson 20:ac8682cf923b 187 {
ericbisson 20:ac8682cf923b 188 pc.printf("[DEBUG] - Invalid START : %x\n", bytes[1]);
ericbisson 20:ac8682cf923b 189 }
ericbisson 24:2034362db66f 190 bytes.clear();
ericbisson 16:f2661759714c 191 }
ericbisson 24:2034362db66f 192 if (bytes.size() == 3)
ericbisson 24:2034362db66f 193 {
ericbisson 24:2034362db66f 194 pc.printf("[DEBUG] - YESSSSSSSSSSSSSSSSSSSS\n");
ericbisson 24:2034362db66f 195 }
ericbisson 24:2034362db66f 196
ericbisson 19:e13ac9d940ab 197 if (bytes.size() == 4)
ericbisson 16:f2661759714c 198 {
ericbisson 19:e13ac9d940ab 199 totalsize = 7 + bytes[3];
ericbisson 16:f2661759714c 200 }
ericbisson 16:f2661759714c 201
ericbisson 16:f2661759714c 202 // fin
ericbisson 16:f2661759714c 203 if (totalsize == bytes.size())
ericbisson 16:f2661759714c 204 {
ericbisson 16:f2661759714c 205 // Calcul du CRC
ericbisson 16:f2661759714c 206 unsigned short currentCRC = bytes[bytes.size()-2] + bytes[bytes.size()-3]<<8;
ericbisson 16:f2661759714c 207
ericbisson 16:f2661759714c 208 vector<char> charge_utile(&bytes[4], &bytes[bytes.size()-4]);
ericbisson 16:f2661759714c 209
ericbisson 16:f2661759714c 210 if (currentCRC == mycrc16.calculateCRC16(&charge_utile[0], charge_utile.size()) && bytes.back() == END)
ericbisson 16:f2661759714c 211 {
ericbisson 16:f2661759714c 212 // Affiche à l'écran le message valide
ericbisson 16:f2661759714c 213 pc.printf(&charge_utile[0], charge_utile.size());
ericbisson 16:f2661759714c 214 }
ericbisson 20:ac8682cf923b 215 else
ericbisson 20:ac8682cf923b 216 {
ericbisson 20:ac8682cf923b 217 pc.printf("[DEBUG] - Invalid CRC, dumping message\n");
ericbisson 20:ac8682cf923b 218 }
ericbisson 16:f2661759714c 219 bytes.clear();
ericbisson 16:f2661759714c 220 }
ericbisson 15:7c2e70c36b98 221 }
ericbisson 15:7c2e70c36b98 222 }
ericbisson 15:7c2e70c36b98 223 }
ericbisson 15:7c2e70c36b98 224
ericbisson 24:2034362db66f 225 void initTimers()
ericbisson 24:2034362db66f 226 {
ericbisson 24:2034362db66f 227 //Timer 1 (match)
ericbisson 24:2034362db66f 228 LPC_SC->PCLKSEL0 |= (1 << 4); // pclk = cclk timer1
ericbisson 24:2034362db66f 229 LPC_SC->PCONP |= (1 << 2); // timer1 power on
ericbisson 24:2034362db66f 230 LPC_TIM1->MCR = 3; // interrupt and reset control
ericbisson 24:2034362db66f 231 LPC_TIM1->TC = 0; // clear timer counter
ericbisson 24:2034362db66f 232 LPC_TIM1->PC = 0; // clear prescale counter
ericbisson 24:2034362db66f 233 LPC_TIM1->PR = 0; // clear prescale register
ericbisson 24:2034362db66f 234 LPC_TIM1->MR0 = (960000 / 2) * 10; // 10/2 ms
ericbisson 24:2034362db66f 235 LPC_TIM1->EMR = (3 << 4); // Interrupt & reset timer on match
ericbisson 24:2034362db66f 236 NVIC_EnableIRQ(TIMER1_IRQn); // enable timer interrupt
ericbisson 24:2034362db66f 237 LPC_TIM1->TCR = 0; // disable Timer
ericbisson 24:2034362db66f 238
ericbisson 24:2034362db66f 239 //Timer 2 (cap)
ericbisson 24:2034362db66f 240 LPC_SC->PCLKSEL1 |= (1 << 12); // pclk = cclk timer2
ericbisson 24:2034362db66f 241 LPC_SC->PCONP |= (1 << 22); // timer2 power on
ericbisson 24:2034362db66f 242 LPC_TIM2->TC = 0; // clear timer counter
ericbisson 24:2034362db66f 243 LPC_TIM2->PC = 0; // clear prescale counter
ericbisson 24:2034362db66f 244 LPC_TIM2->PR = 0; // clear prescale register
ericbisson 24:2034362db66f 245 LPC_TIM2->TCR |= (1 << 1); // reset timer
ericbisson 24:2034362db66f 246 LPC_TIM2->TCR &= ~(1 << 1); // release reset
ericbisson 24:2034362db66f 247 LPC_TIM2->CCR |= 0x0000007; // enable rising-edge and falling-edge capture
ericbisson 24:2034362db66f 248 NVIC_EnableIRQ(TIMER2_IRQn); // enable timer interrupt
ericbisson 24:2034362db66f 249 LPC_TIM2->TCR = 1; // start Timer
ericbisson 24:2034362db66f 250 }
ericbisson 24:2034362db66f 251
ericbisson 2:c6465d4e82d2 252 int main() {
ericbisson 14:bd909277eb13 253 LPC_PINCON->PINSEL0 |= (3 << 8); // pin30
ericbisson 24:2034362db66f 254 LPC_PINCON->PINMODE1 |= 3;
ericbisson 14:bd909277eb13 255 initTimers();
ericbisson 8:5b87b1f9d91f 256 ThreadLecture.start(read);
ericbisson 24:2034362db66f 257 ThreadWrite.start(get_text);
ericbisson 0:c637467eeb8f 258
JoeyDionne 22:7244c3391bac 259 while(true)
JoeyDionne 22:7244c3391bac 260 {
ericbisson 0:c637467eeb8f 261 }
ericbisson 7:5501dbea5650 262 };