![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
app4
Dependencies: mbed-rtos mbed CRC16
Fork of S5info_APP2 by
main.cpp@24:2034362db66f, 2017-03-07 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |