app4

Dependencies:   mbed-rtos mbed CRC16

Fork of S5info_APP2 by Éric Bisson

Committer:
JoeyDionne
Date:
Tue Mar 07 05:04:40 2017 +0000
Revision:
21:73db1bea19b1
Parent:
13:a436ba0b78e8
test commit

Who changed what in which revision?

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