app4

Dependencies:   mbed-rtos mbed CRC16

Fork of S5info_APP2 by Éric Bisson

Committer:
JoeyDionne
Date:
Tue Mar 07 02:12:21 2017 +0000
Revision:
12:a55f77a0e188
Parent:
11:b27d1a83f688
Child:
13:a436ba0b78e8
add ?criture

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"
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);
ericbisson 7:5501dbea5650 9 Serial uart(p13, p14, 9600);
ericbisson 8:5b87b1f9d91f 10 Thread ThreadLecture;
ericbisson 2:c6465d4e82d2 11
JoeyDionne 12:a55f77a0e188 12 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 13 char trame_sent[80]; //tableau de la trame à envoyer
JoeyDionne 12:a55f77a0e188 14 uint8_t byte_sent_pos, //position de l'octet dans le tableau d'envoi
JoeyDionne 12:a55f77a0e188 15 bit_sent, //position du bit de l'octet en cours d'envoi (du MSB au LSB) 7..0
JoeyDionne 12:a55f77a0e188 16 trame_length; //longueur de la trame complete
JoeyDionne 11:b27d1a83f688 17 //test
JoeyDionne 11:b27d1a83f688 18
ericbisson 7:5501dbea5650 19 bool bIsHalfPeriod = false;
ericbisson 7:5501dbea5650 20
ericbisson 7:5501dbea5650 21 extern "C" void RIT_IRQHandler(void) {
ericbisson 7:5501dbea5650 22 //clear flag
ericbisson 7:5501dbea5650 23 LPC_RIT->RICTRL |= bit0; //write 1 to clear bit
ericbisson 5:e878d87782ce 24
ericbisson 7:5501dbea5650 25 bIsHalfPeriod = !bIsHalfPeriod;
ericbisson 1:b3ae0d9f02ad 26 }
ericbisson 1:b3ae0d9f02ad 27
ericbisson 7:5501dbea5650 28 void p14_interrupt()
ericbisson 7:5501dbea5650 29 {
ericbisson 8:5b87b1f9d91f 30 // On turn off les interrupts de lecture une fois qu'on a détecter un message
ericbisson 8:5b87b1f9d91f 31 uart.attach(NULL, uart.RxIrq);
ericbisson 8:5b87b1f9d91f 32
ericbisson 7:5501dbea5650 33 // On envoie le signal au thread de lecture
ericbisson 8:5b87b1f9d91f 34 ThreadLecture.signal_set(1);
ericbisson 7:5501dbea5650 35 };
ericbisson 1:b3ae0d9f02ad 36
ericbisson 7:5501dbea5650 37 void read()
ericbisson 7:5501dbea5650 38 {
ericbisson 7:5501dbea5650 39 while(true)
ericbisson 7:5501dbea5650 40 {
ericbisson 8:5b87b1f9d91f 41 // Attente passive d'un message entrant
ericbisson 8:5b87b1f9d91f 42 uart.attach(&p14_interrupt, uart.RxIrq);
ericbisson 8:5b87b1f9d91f 43 ThreadLecture.signal_wait(1);
ericbisson 2:c6465d4e82d2 44
ericbisson 8:5b87b1f9d91f 45 // Lis le message. Retourne une exception si il y a une erreur
ericbisson 10:8b066285c2e0 46 vector<char> message = uart_read(uart);
ericbisson 2:c6465d4e82d2 47
ericbisson 8:5b87b1f9d91f 48 if (!message.empty())
ericbisson 8:5b87b1f9d91f 49 {
ericbisson 8:5b87b1f9d91f 50 // Affiche le message à l'écran
ericbisson 8:5b87b1f9d91f 51 pc.printf(&message[0], message.size());
ericbisson 8:5b87b1f9d91f 52 }
ericbisson 1:b3ae0d9f02ad 53 }
ericbisson 7:5501dbea5650 54 };
ericbisson 3:3ecbcc05bc85 55
ericbisson 7:5501dbea5650 56 void rit_init()
ericbisson 4:87e9b434bb4d 57 {
ericbisson 7:5501dbea5650 58 LPC_SC->PCONP |= bit16; //Power Control for Peripherals register: power up RIT clock
ericbisson 7:5501dbea5650 59 LPC_SC->PCLKSEL1 |= (bit26 && bit27); //Peripheral clock selection: divide clock by 8 (run RIT clock by 12.5MHz)
ericbisson 7:5501dbea5650 60 LPC_RIT->RICOUNTER = 0; //set counter to zero
ericbisson 8:5b87b1f9d91f 61 LPC_RIT->RICOMPVAL = 250000000 * HALF_PERIOD; //interrupt tick every HALF_PERIOD
ericbisson 7:5501dbea5650 62 LPC_RIT->RICTRL |= bit1; // clear timer when counter reaches value
ericbisson 7:5501dbea5650 63 LPC_RIT->RICTRL |= bit3; // enable timer
ericbisson 7:5501dbea5650 64
ericbisson 7:5501dbea5650 65 //enable interrupt
ericbisson 7:5501dbea5650 66 NVIC_SetPriority(RIT_IRQn, 31);
ericbisson 7:5501dbea5650 67 NVIC_EnableIRQ(RIT_IRQn);
ericbisson 7:5501dbea5650 68 };
ericbisson 4:87e9b434bb4d 69
JoeyDionne 12:a55f77a0e188 70 void send_data()
JoeyDionne 12:a55f77a0e188 71 {
JoeyDionne 12:a55f77a0e188 72 if (!transmit) { //Si on est dans la premiere demi-periode d'envoie
JoeyDionne 12:a55f77a0e188 73 if (((trame_sent[byte_sent_pos] >> bit_sent) & 0x01) == 1) { //Verifier le bit à envoyer et preparer la prochaine interruption pour prendre sa valeur
JoeyDionne 12:a55f77a0e188 74 LPC_RIT->EMR |= 1 << 5;
JoeyDionne 12:a55f77a0e188 75 LPC_RIT->EMR &= ~(1 << 4);
JoeyDionne 12:a55f77a0e188 76 } else {
JoeyDionne 12:a55f77a0e188 77 LPC_RIT->EMR |= 1 << 4;
JoeyDionne 12:a55f77a0e188 78 LPC_RIT->EMR &= ~(1 << 5);
JoeyDionne 12:a55f77a0e188 79 }
JoeyDionne 12:a55f77a0e188 80 } else { //Si on est dans la 2eme demi-periode d'envoie, toggle a la prochaine interruption
JoeyDionne 12:a55f77a0e188 81 LPC_RIT->EMR |= 3 << 4;
JoeyDionne 12:a55f77a0e188 82 bit_sent--;
JoeyDionne 12:a55f77a0e188 83 }
JoeyDionne 12:a55f77a0e188 84 transmit = !transmit; //varier entre la 1ere et 2eme partie de demi-periode
JoeyDionne 12:a55f77a0e188 85 LPC_RIT->MR0 += HALF_PERIOD; //preparer la prochaine interruption a une demi-periode plus loin
JoeyDionne 12:a55f77a0e188 86 if (bit_sent < 0) { //Si l'octet a ete envoye
JoeyDionne 12:a55f77a0e188 87 bit_sent = 7; //remettre la position initiale pour le prochain octet
JoeyDionne 12:a55f77a0e188 88 byte_sent_pos++; //incrementer l'octet
JoeyDionne 12:a55f77a0e188 89 if (byte_sent_pos > trame_length) { //Si la trame a ete envoyee
JoeyDionne 12:a55f77a0e188 90 LPC_RIT->MCR &= 0; //desactiver les interruptions du MAT
JoeyDionne 12:a55f77a0e188 91 LPC_RIT->EMR &= ~(3 << 4); //remettre a zero le registre EMR (00 pour rien faire, 01 pour mettre a 1, 10 pour mettre a 0 et 11 pour toggle)
JoeyDionne 12:a55f77a0e188 92 byte_sent_pos = 0;
JoeyDionne 12:a55f77a0e188 93 transmit = false;
JoeyDionne 12:a55f77a0e188 94 }
JoeyDionne 12:a55f77a0e188 95 }
JoeyDionne 12:a55f77a0e188 96 }
JoeyDionne 12:a55f77a0e188 97
JoeyDionne 12:a55f77a0e188 98 void get_text()
JoeyDionne 12:a55f77a0e188 99 {
JoeyDionne 12:a55f77a0e188 100 CRC16 *myCRC = new CRC16();
JoeyDionne 12:a55f77a0e188 101
JoeyDionne 12:a55f77a0e188 102 trame_sent[0] = 0x55; //Preambule
JoeyDionne 12:a55f77a0e188 103 trame_sent[1] = 0x7E; //Start
JoeyDionne 12:a55f77a0e188 104 trame_sent[2] = 0x00; //Type + Flag mis a 0x00
JoeyDionne 12:a55f77a0e188 105
JoeyDionne 12:a55f77a0e188 106 pc.printf("\n\rYour text : ");
JoeyDionne 12:a55f77a0e188 107 int count = 0;
JoeyDionne 12:a55f77a0e188 108 char c = 0x00;
JoeyDionne 12:a55f77a0e188 109 char text[73];
JoeyDionne 12:a55f77a0e188 110 while(c != 0x0D && count < 73) { //Tant que c'est different de '\r' et un maximum de 33 caractères
JoeyDionne 12:a55f77a0e188 111 c = pc.getc();
JoeyDionne 12:a55f77a0e188 112 trame_sent[count + 4] = c; //Ajouter les caractères tapés au clavier dans le message
JoeyDionne 12:a55f77a0e188 113 text[count] = c;
JoeyDionne 12:a55f77a0e188 114 pc.putc(c);
JoeyDionne 12:a55f77a0e188 115 count++;
JoeyDionne 12:a55f77a0e188 116 }
JoeyDionne 12:a55f77a0e188 117 trame_sent[3] = (char)count; //Longueur du message (Max 33 caractères)
JoeyDionne 12:a55f77a0e188 118
JoeyDionne 12:a55f77a0e188 119 unsigned short resultCRC = myCRC->calculateCRC16(text,count);
JoeyDionne 12:a55f77a0e188 120 trame_sent[count + 4] = (resultCRC >> 8) & 0xFF;
JoeyDionne 12:a55f77a0e188 121 trame_sent[count + 5] = resultCRC & 0xFF;
JoeyDionne 12:a55f77a0e188 122
JoeyDionne 12:a55f77a0e188 123 trame_sent[count + 6] = 0x7E; //End
JoeyDionne 12:a55f77a0e188 124 trame_length = count + 6; //Longueur de la trame
JoeyDionne 12:a55f77a0e188 125
JoeyDionne 12:a55f77a0e188 126 }
JoeyDionne 12:a55f77a0e188 127
JoeyDionne 12:a55f77a0e188 128 void write()
JoeyDionne 12:a55f77a0e188 129 {
JoeyDionne 12:a55f77a0e188 130 byte_sent_pos = 0;
JoeyDionne 12:a55f77a0e188 131 bit_sent = 7;
JoeyDionne 12:a55f77a0e188 132 LPC_RIT->MCR = 1; //Permettre les interruption du MAT
JoeyDionne 12:a55f77a0e188 133 LPC_RIT->MR0 = LPC_RIT->TC + HALF_PERIOD; //Faire une interruption a la prochaine demi-periode
JoeyDionne 12:a55f77a0e188 134 }
JoeyDionne 12:a55f77a0e188 135
ericbisson 2:c6465d4e82d2 136 int main() {
ericbisson 7:5501dbea5650 137 rit_init();
ericbisson 0:c637467eeb8f 138
ericbisson 8:5b87b1f9d91f 139 ThreadLecture.start(read);
ericbisson 0:c637467eeb8f 140
ericbisson 3:3ecbcc05bc85 141 while(true) {
JoeyDionne 12:a55f77a0e188 142 get_text();
JoeyDionne 12:a55f77a0e188 143 write();
JoeyDionne 12:a55f77a0e188 144 //uart.printf("12345");
ericbisson 7:5501dbea5650 145 wait_ms(100);
ericbisson 0:c637467eeb8f 146 }
ericbisson 7:5501dbea5650 147 };