![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
app4
Dependencies: mbed-rtos mbed CRC16
Fork of S5info_APP2 by
Diff: main.cpp
- Revision:
- 15:7c2e70c36b98
- Parent:
- 13:a436ba0b78e8
- Parent:
- 14:bd909277eb13
- Child:
- 16:f2661759714c
--- a/main.cpp Tue Mar 07 04:37:39 2017 +0000 +++ b/main.cpp Tue Mar 07 04:54:45 2017 +0000 @@ -1,68 +1,30 @@ +#include "CRC16.h" #include "mbed.h" #include "rtos.h" -#include "bit.h" -#include "uart.h" - -const float HALF_PERIOD = 0.05; // secondes - -Serial pc(USBTX, USBRX, 9600); -DigitalIn in(p14); -DigitalOut out(p13); +#include <vector> +using std::vector; +DigitalIn in(p30); Thread ThreadLecture; +const int PREAMBULE = 0b01010101; +const int START = 0b01111110; +const int END = 0b01111110; +Serial pc(USBTX, USBRX); +DigitalOut out(p8); bool transmit = false; //faux pour le debut de demi-periode d'envoie d'un bit, vrai pour la 2ème demi-periode char trame_sent[80]; //tableau de la trame à envoyer uint8_t byte_sent_pos, //position de l'octet dans le tableau d'envoi bit_sent, //position du bit de l'octet en cours d'envoi (du MSB au LSB) 7..0 trame_length; //longueur de la trame complete -//test -bool clockTick = false; - -extern "C" void RIT_IRQHandler(void) { - //clear flag - LPC_RIT->RICTRL |= bit0; //write 1 to clear bit - - //bIsHalfPeriod = !bIsHalfPeriod; -} - -void p14_interrupt() -{ - // On turn off les interrupts de lecture une fois qu'on a détecter un message - //uart.attach(NULL, uart.RxIrq); - - // On envoie le signal au thread de lecture - ThreadLecture.signal_set(1); -}; - -void read() -{ - while(true) - { - // Attente passive d'un message entrant - //uart.attach(&p14_interrupt, uart.RxIrq); - ThreadLecture.signal_wait(1); - - // Lis le message. Retourne une exception si il y a une erreur - //vector<char> message = uart_read(uart); - - //if (!message.empty()) - //{ - // Affiche le message à l'écran - //pc.printf(&message[0], message.size()); - //} - } -}; - -void rit_init() +void initTimers() { //Timer 1 (match) LPC_SC->PCLKSEL0 |= (1 << 4); // pclk = cclk timer1 LPC_SC->PCONP |= (1 << 2); // timer1 power on - LPC_TIM1->MR0 = CLOCKS_TO_SECOND / 100; // 10 ms + LPC_TIM1->MR0 = 960000; // 100 ms LPC_TIM1->MCR = 3; // interrupt and reset control - // Interrupt & reset timer on match - LPC_TIM1->EMR = (3 << 4); + LPC_TIM1->EMR = (3 << 4); // Interrupt & reset timer on match NVIC_EnableIRQ(TIMER1_IRQn); // enable timer interrupt LPC_TIM1->TCR = 1; // enable Timer @@ -75,10 +37,54 @@ LPC_TIM2->TCR |= (1 << 1); // reset timer LPC_TIM2->TCR &= ~(1 << 1); // release reset LPC_TIM2->IR = 0xFFFFFFFF; // clear interrupt register - LPC_TIM2->CCR |= 0x0000007; // enable rising-edge and falling-edge capture on 2.0 + LPC_TIM2->CCR |= 0x0000007; // enable rising-edge and falling-edge capture NVIC_EnableIRQ(TIMER2_IRQn); // enable timer interrupt LPC_TIM2->TCR = 1; // start Timer -}; +} + +bool bTimer1 = false; +extern "C" void TIMER1_IRQHandler() +{ + if ((LPC_TIM1->IR & 0x01) == 0x01) + { + bTimer1 = !bTimer1; + + LPC_TIM1->IR |= 1 << 0; // clear + } +} + +int sumClocks = 0; +int PeriodLength = 0; +bool bReceivedFirstBit = false; +extern "C" void TIMER2_IRQHandler() +{ + if (PeriodLength > 0) + { + if (LPC_TIM2->CR0 >= PeriodLength*1.5 || (sumClocks + LPC_TIM2->CR0) >= PeriodLength*1.5) + { + sumClocks = 0; + + ThreadLecture.signal_set(1); + } + else + { + sumClocks += LPC_TIM2->CR0; + } + } + else if (bReceivedFirstBit) + { + PeriodLength = LPC_TIM2->CR0 / 2; + ThreadLecture.signal_set(1); + } + else + { + bReceivedFirstBit = true; + ThreadLecture.signal_set(1); + } + + LPC_TIM2->TC = 0; + LPC_TIM2->IR |= 0xFFFFFFFF; // clear +} bool codeManchester(bool bit, bool clock) { @@ -87,18 +93,18 @@ void send_data() { - out = codeManchester(((trame_sent[byte_sent_pos] >> bit_sent) & 0x01), clockTick); // Encodage Manchester - if(clockTick) + out = codeManchester(((trame_sent[byte_sent_pos] >> bit_sent) & 0x01), bTimer1); // Encodage Manchester + if(bTimer1) { bit_sent--; } - clockTick = !clockTick; //varier entre la 1ere et 2eme partie de demi-periode + bTimer1 = !bTimer1; //varier entre la 1ere et 2eme partie de demi-periode if (bit_sent < 0) { //Si l'octet a ete envoye bit_sent = 7; //remettre la position initiale pour le prochain octet byte_sent_pos++; //incrementer l'octet if (byte_sent_pos >= trame_length) { //Si la trame a ete envoyee byte_sent_pos = 0; - clockTick = false; + bTimer1 = false; } } } @@ -149,21 +155,37 @@ { byte_sent_pos = 0; bit_sent = 7; - clockTick = false; + bTimer1 = false; //TODO start interrupt timer 1 //LPC_RIT->MCR = 1; //Permettre les interruption du MAT //LPC_RIT->MR0 = LPC_RIT->TC + HALF_PERIOD; //Faire une interruption a la prochaine demi-periode } +void read() +{ + char byte; + vector<char> bytes; + char shift = 0; + while (true) + { + ThreadLecture.signal_wait(1); + + byte = (byte << 1) + in; + + shift++; + if (shift == 8) + { + bytes.push_back(byte); + shift = 0; + } + } +} + int main() { - rit_init(); - + LPC_PINCON->PINSEL0 |= (3 << 8); // pin30 + initTimers(); ThreadLecture.start(read); while(true) { - get_text(); - write(); - //uart.printf("12345"); - wait_ms(100); } }; \ No newline at end of file