app4

Dependencies:   mbed-rtos mbed CRC16

Fork of S5info_APP2 by Éric Bisson

Committer:
JoeyDionne
Date:
Tue Mar 07 06:09:06 2017 +0000
Revision:
23:9c4e4898b741
Parent:
22:7244c3391bac
Child:
24:2034362db66f
envoi de donn?es sur Timer1

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