Éric Bisson / Mbed 2 deprecated S5info_APP4

Dependencies:   mbed-rtos mbed CRC16

Fork of S5info_APP2 by Éric Bisson

Committer:
ericbisson
Date:
Tue Mar 07 04:54:45 2017 +0000
Revision:
15:7c2e70c36b98
merged

Who changed what in which revision?

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