![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
app4
Dependencies: mbed-rtos mbed CRC16
Fork of S5info_APP2 by
main.cpp@13:a436ba0b78e8, 2017-03-07 (annotated)
- Committer:
- JoeyDionne
- Date:
- Tue Mar 07 04:37:39 2017 +0000
- Revision:
- 13:a436ba0b78e8
- Parent:
- 12:a55f77a0e188
- Child:
- 15:7c2e70c36b98
- Child:
- 21:73db1bea19b1
Ajout de l'?criture
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ericbisson | 7:5501dbea5650 | 1 | #include "mbed.h" |
ericbisson | 0:c637467eeb8f | 2 | #include "rtos.h" |
ericbisson | 7:5501dbea5650 | 3 | #include "bit.h" |
ericbisson | 8:5b87b1f9d91f | 4 | #include "uart.h" |
ericbisson | 1:b3ae0d9f02ad | 5 | |
ericbisson | 8:5b87b1f9d91f | 6 | const float HALF_PERIOD = 0.05; // secondes |
ericbisson | 2:c6465d4e82d2 | 7 | |
ericbisson | 7:5501dbea5650 | 8 | Serial pc(USBTX, USBRX, 9600); |
JoeyDionne | 13:a436ba0b78e8 | 9 | DigitalIn in(p14); |
JoeyDionne | 13:a436ba0b78e8 | 10 | DigitalOut out(p13); |
ericbisson | 8:5b87b1f9d91f | 11 | Thread ThreadLecture; |
ericbisson | 2:c6465d4e82d2 | 12 | |
JoeyDionne | 12:a55f77a0e188 | 13 | 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 | 14 | char trame_sent[80]; //tableau de la trame à envoyer |
JoeyDionne | 12:a55f77a0e188 | 15 | uint8_t byte_sent_pos, //position de l'octet dans le tableau d'envoi |
JoeyDionne | 12:a55f77a0e188 | 16 | bit_sent, //position du bit de l'octet en cours d'envoi (du MSB au LSB) 7..0 |
JoeyDionne | 12:a55f77a0e188 | 17 | trame_length; //longueur de la trame complete |
JoeyDionne | 11:b27d1a83f688 | 18 | //test |
JoeyDionne | 11:b27d1a83f688 | 19 | |
JoeyDionne | 13:a436ba0b78e8 | 20 | bool clockTick = false; |
ericbisson | 7:5501dbea5650 | 21 | |
ericbisson | 7:5501dbea5650 | 22 | extern "C" void RIT_IRQHandler(void) { |
ericbisson | 7:5501dbea5650 | 23 | //clear flag |
ericbisson | 7:5501dbea5650 | 24 | LPC_RIT->RICTRL |= bit0; //write 1 to clear bit |
ericbisson | 5:e878d87782ce | 25 | |
JoeyDionne | 13:a436ba0b78e8 | 26 | //bIsHalfPeriod = !bIsHalfPeriod; |
ericbisson | 1:b3ae0d9f02ad | 27 | } |
ericbisson | 1:b3ae0d9f02ad | 28 | |
ericbisson | 7:5501dbea5650 | 29 | void p14_interrupt() |
ericbisson | 7:5501dbea5650 | 30 | { |
ericbisson | 8:5b87b1f9d91f | 31 | // On turn off les interrupts de lecture une fois qu'on a détecter un message |
JoeyDionne | 13:a436ba0b78e8 | 32 | //uart.attach(NULL, uart.RxIrq); |
ericbisson | 8:5b87b1f9d91f | 33 | |
ericbisson | 7:5501dbea5650 | 34 | // On envoie le signal au thread de lecture |
ericbisson | 8:5b87b1f9d91f | 35 | ThreadLecture.signal_set(1); |
ericbisson | 7:5501dbea5650 | 36 | }; |
ericbisson | 1:b3ae0d9f02ad | 37 | |
ericbisson | 7:5501dbea5650 | 38 | void read() |
ericbisson | 7:5501dbea5650 | 39 | { |
ericbisson | 7:5501dbea5650 | 40 | while(true) |
ericbisson | 7:5501dbea5650 | 41 | { |
ericbisson | 8:5b87b1f9d91f | 42 | // Attente passive d'un message entrant |
JoeyDionne | 13:a436ba0b78e8 | 43 | //uart.attach(&p14_interrupt, uart.RxIrq); |
ericbisson | 8:5b87b1f9d91f | 44 | ThreadLecture.signal_wait(1); |
ericbisson | 2:c6465d4e82d2 | 45 | |
ericbisson | 8:5b87b1f9d91f | 46 | // Lis le message. Retourne une exception si il y a une erreur |
JoeyDionne | 13:a436ba0b78e8 | 47 | //vector<char> message = uart_read(uart); |
ericbisson | 2:c6465d4e82d2 | 48 | |
JoeyDionne | 13:a436ba0b78e8 | 49 | //if (!message.empty()) |
JoeyDionne | 13:a436ba0b78e8 | 50 | //{ |
ericbisson | 8:5b87b1f9d91f | 51 | // Affiche le message à l'écran |
JoeyDionne | 13:a436ba0b78e8 | 52 | //pc.printf(&message[0], message.size()); |
JoeyDionne | 13:a436ba0b78e8 | 53 | //} |
ericbisson | 1:b3ae0d9f02ad | 54 | } |
ericbisson | 7:5501dbea5650 | 55 | }; |
ericbisson | 3:3ecbcc05bc85 | 56 | |
ericbisson | 7:5501dbea5650 | 57 | void rit_init() |
ericbisson | 4:87e9b434bb4d | 58 | { |
JoeyDionne | 13:a436ba0b78e8 | 59 | //Timer 1 (match) |
JoeyDionne | 13:a436ba0b78e8 | 60 | LPC_SC->PCLKSEL0 |= (1 << 4); // pclk = cclk timer1 |
JoeyDionne | 13:a436ba0b78e8 | 61 | LPC_SC->PCONP |= (1 << 2); // timer1 power on |
JoeyDionne | 13:a436ba0b78e8 | 62 | LPC_TIM1->MR0 = CLOCKS_TO_SECOND / 100; // 10 ms |
JoeyDionne | 13:a436ba0b78e8 | 63 | LPC_TIM1->MCR = 3; // interrupt and reset control |
JoeyDionne | 13:a436ba0b78e8 | 64 | // Interrupt & reset timer on match |
JoeyDionne | 13:a436ba0b78e8 | 65 | LPC_TIM1->EMR = (3 << 4); |
JoeyDionne | 13:a436ba0b78e8 | 66 | NVIC_EnableIRQ(TIMER1_IRQn); // enable timer interrupt |
JoeyDionne | 13:a436ba0b78e8 | 67 | LPC_TIM1->TCR = 1; // enable Timer |
JoeyDionne | 13:a436ba0b78e8 | 68 | |
JoeyDionne | 13:a436ba0b78e8 | 69 | //Timer 2 (cap) |
JoeyDionne | 13:a436ba0b78e8 | 70 | LPC_SC->PCLKSEL1 |= (1 << 12); // pclk = cclk timer2 |
JoeyDionne | 13:a436ba0b78e8 | 71 | LPC_SC->PCONP |= (1 << 22); // timer2 power on |
JoeyDionne | 13:a436ba0b78e8 | 72 | LPC_TIM2->TC = 0; // clear timer counter |
JoeyDionne | 13:a436ba0b78e8 | 73 | LPC_TIM2->PC = 0; // clear prescale counter |
JoeyDionne | 13:a436ba0b78e8 | 74 | LPC_TIM2->PR = 0; // clear prescale register |
JoeyDionne | 13:a436ba0b78e8 | 75 | LPC_TIM2->TCR |= (1 << 1); // reset timer |
JoeyDionne | 13:a436ba0b78e8 | 76 | LPC_TIM2->TCR &= ~(1 << 1); // release reset |
JoeyDionne | 13:a436ba0b78e8 | 77 | LPC_TIM2->IR = 0xFFFFFFFF; // clear interrupt register |
JoeyDionne | 13:a436ba0b78e8 | 78 | LPC_TIM2->CCR |= 0x0000007; // enable rising-edge and falling-edge capture on 2.0 |
JoeyDionne | 13:a436ba0b78e8 | 79 | NVIC_EnableIRQ(TIMER2_IRQn); // enable timer interrupt |
JoeyDionne | 13:a436ba0b78e8 | 80 | LPC_TIM2->TCR = 1; // start Timer |
ericbisson | 7:5501dbea5650 | 81 | }; |
ericbisson | 4:87e9b434bb4d | 82 | |
JoeyDionne | 13:a436ba0b78e8 | 83 | bool codeManchester(bool bit, bool clock) |
JoeyDionne | 13:a436ba0b78e8 | 84 | { |
JoeyDionne | 13:a436ba0b78e8 | 85 | return (bit == clock); |
JoeyDionne | 13:a436ba0b78e8 | 86 | } |
JoeyDionne | 13:a436ba0b78e8 | 87 | |
JoeyDionne | 12:a55f77a0e188 | 88 | void send_data() |
JoeyDionne | 12:a55f77a0e188 | 89 | { |
JoeyDionne | 13:a436ba0b78e8 | 90 | out = codeManchester(((trame_sent[byte_sent_pos] >> bit_sent) & 0x01), clockTick); // Encodage Manchester |
JoeyDionne | 13:a436ba0b78e8 | 91 | if(clockTick) |
JoeyDionne | 13:a436ba0b78e8 | 92 | { |
JoeyDionne | 12:a55f77a0e188 | 93 | bit_sent--; |
JoeyDionne | 12:a55f77a0e188 | 94 | } |
JoeyDionne | 13:a436ba0b78e8 | 95 | clockTick = !clockTick; //varier entre la 1ere et 2eme partie de demi-periode |
JoeyDionne | 12:a55f77a0e188 | 96 | if (bit_sent < 0) { //Si l'octet a ete envoye |
JoeyDionne | 12:a55f77a0e188 | 97 | bit_sent = 7; //remettre la position initiale pour le prochain octet |
JoeyDionne | 12:a55f77a0e188 | 98 | byte_sent_pos++; //incrementer l'octet |
JoeyDionne | 13:a436ba0b78e8 | 99 | if (byte_sent_pos >= trame_length) { //Si la trame a ete envoyee |
JoeyDionne | 12:a55f77a0e188 | 100 | byte_sent_pos = 0; |
JoeyDionne | 13:a436ba0b78e8 | 101 | clockTick = false; |
JoeyDionne | 12:a55f77a0e188 | 102 | } |
JoeyDionne | 12:a55f77a0e188 | 103 | } |
JoeyDionne | 12:a55f77a0e188 | 104 | } |
JoeyDionne | 12:a55f77a0e188 | 105 | |
JoeyDionne | 13:a436ba0b78e8 | 106 | //création de la trame |
JoeyDionne | 13:a436ba0b78e8 | 107 | void create_trame(char message[],int taille) |
JoeyDionne | 12:a55f77a0e188 | 108 | { |
JoeyDionne | 12:a55f77a0e188 | 109 | CRC16 *myCRC = new CRC16(); |
JoeyDionne | 13:a436ba0b78e8 | 110 | unsigned short resultCRC = myCRC->calculateCRC16(message,taille); |
JoeyDionne | 12:a55f77a0e188 | 111 | |
JoeyDionne | 12:a55f77a0e188 | 112 | trame_sent[0] = 0x55; //Preambule |
JoeyDionne | 12:a55f77a0e188 | 113 | trame_sent[1] = 0x7E; //Start |
JoeyDionne | 12:a55f77a0e188 | 114 | trame_sent[2] = 0x00; //Type + Flag mis a 0x00 |
JoeyDionne | 13:a436ba0b78e8 | 115 | trame_sent[3] = (char)taille; //Longueur du message (Max 33 caractères) |
JoeyDionne | 12:a55f77a0e188 | 116 | |
JoeyDionne | 13:a436ba0b78e8 | 117 | //message |
JoeyDionne | 13:a436ba0b78e8 | 118 | for (int i=0;i<taille;i++) |
JoeyDionne | 13:a436ba0b78e8 | 119 | { |
JoeyDionne | 13:a436ba0b78e8 | 120 | trame_sent[taille + 4] = message[i]; |
JoeyDionne | 13:a436ba0b78e8 | 121 | } |
JoeyDionne | 13:a436ba0b78e8 | 122 | |
JoeyDionne | 13:a436ba0b78e8 | 123 | //CRC16 |
JoeyDionne | 13:a436ba0b78e8 | 124 | trame_sent[taille + 4] = (resultCRC >> 8) & 0xFF; |
JoeyDionne | 13:a436ba0b78e8 | 125 | trame_sent[taille + 5] = resultCRC & 0xFF; |
JoeyDionne | 13:a436ba0b78e8 | 126 | |
JoeyDionne | 13:a436ba0b78e8 | 127 | trame_sent[taille + 6] = 0x7E; //End |
JoeyDionne | 13:a436ba0b78e8 | 128 | trame_length = taille + 7; //Longueur de la trame |
JoeyDionne | 13:a436ba0b78e8 | 129 | } |
JoeyDionne | 13:a436ba0b78e8 | 130 | |
JoeyDionne | 13:a436ba0b78e8 | 131 | //obtention du texte |
JoeyDionne | 13:a436ba0b78e8 | 132 | void get_text() |
JoeyDionne | 13:a436ba0b78e8 | 133 | { |
JoeyDionne | 12:a55f77a0e188 | 134 | pc.printf("\n\rYour text : "); |
JoeyDionne | 12:a55f77a0e188 | 135 | int count = 0; |
JoeyDionne | 12:a55f77a0e188 | 136 | char c = 0x00; |
JoeyDionne | 12:a55f77a0e188 | 137 | char text[73]; |
JoeyDionne | 13:a436ba0b78e8 | 138 | while(c != 0x0D && count < 73) { //Tant que c'est different de '\r' et pour un maximum de 73 caractères |
JoeyDionne | 12:a55f77a0e188 | 139 | c = pc.getc(); |
JoeyDionne | 12:a55f77a0e188 | 140 | text[count] = c; |
JoeyDionne | 12:a55f77a0e188 | 141 | pc.putc(c); |
JoeyDionne | 12:a55f77a0e188 | 142 | count++; |
JoeyDionne | 12:a55f77a0e188 | 143 | } |
JoeyDionne | 12:a55f77a0e188 | 144 | |
JoeyDionne | 13:a436ba0b78e8 | 145 | create_trame(text,count); |
JoeyDionne | 12:a55f77a0e188 | 146 | } |
JoeyDionne | 12:a55f77a0e188 | 147 | |
JoeyDionne | 12:a55f77a0e188 | 148 | void write() |
JoeyDionne | 12:a55f77a0e188 | 149 | { |
JoeyDionne | 12:a55f77a0e188 | 150 | byte_sent_pos = 0; |
JoeyDionne | 12:a55f77a0e188 | 151 | bit_sent = 7; |
JoeyDionne | 13:a436ba0b78e8 | 152 | clockTick = false; |
JoeyDionne | 13:a436ba0b78e8 | 153 | //TODO start interrupt timer 1 |
JoeyDionne | 13:a436ba0b78e8 | 154 | //LPC_RIT->MCR = 1; //Permettre les interruption du MAT |
JoeyDionne | 13:a436ba0b78e8 | 155 | //LPC_RIT->MR0 = LPC_RIT->TC + HALF_PERIOD; //Faire une interruption a la prochaine demi-periode |
JoeyDionne | 12:a55f77a0e188 | 156 | } |
JoeyDionne | 12:a55f77a0e188 | 157 | |
ericbisson | 2:c6465d4e82d2 | 158 | int main() { |
ericbisson | 7:5501dbea5650 | 159 | rit_init(); |
ericbisson | 0:c637467eeb8f | 160 | |
ericbisson | 8:5b87b1f9d91f | 161 | ThreadLecture.start(read); |
ericbisson | 0:c637467eeb8f | 162 | |
ericbisson | 3:3ecbcc05bc85 | 163 | while(true) { |
JoeyDionne | 12:a55f77a0e188 | 164 | get_text(); |
JoeyDionne | 12:a55f77a0e188 | 165 | write(); |
JoeyDionne | 12:a55f77a0e188 | 166 | //uart.printf("12345"); |
ericbisson | 7:5501dbea5650 | 167 | wait_ms(100); |
ericbisson | 0:c637467eeb8f | 168 | } |
ericbisson | 7:5501dbea5650 | 169 | }; |