app4

Dependencies:   mbed-rtos mbed CRC16

Fork of S5info_APP2 by Éric Bisson

Revision:
14:bd909277eb13
Parent:
11:b27d1a83f688
Child:
15:7c2e70c36b98
--- a/main.cpp	Tue Mar 07 00:54:26 2017 +0000
+++ b/main.cpp	Tue Mar 07 04:39:57 2017 +0000
@@ -1,75 +1,83 @@
-#include "mbed.h"
-#include "rtos.h"
-#include "bit.h"
-#include "uart.h"
+#include "read.h"
 
-const float HALF_PERIOD = 0.05; // secondes
+Serial pc(USBTX, USBRX);
+DigitalOut out(p8);
 
-Serial pc(USBTX, USBRX, 9600);
-Serial uart(p13, p14, 9600);
-Thread ThreadLecture;
-
-//test
+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; // 100 ms
+    LPC_TIM1->MCR = 3;                      // interrupt and reset control
+    LPC_TIM1->EMR = (3 << 4);               // Interrupt & reset timer on match
+    NVIC_EnableIRQ(TIMER1_IRQn);            // enable timer interrupt
+    LPC_TIM1->TCR = 1;                      // enable Timer
+ 
+    //Timer 2 (cap)
+    LPC_SC->PCLKSEL1 |= (1 << 12);          // pclk = cclk timer2
+    LPC_SC->PCONP |= (1 << 22);             // timer2 power on
+    LPC_TIM2->TC = 0;                       // clear timer counter
+    LPC_TIM2->PC = 0;                       // clear prescale counter
+    LPC_TIM2->PR = 0;                       // clear prescale register
+    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
+    NVIC_EnableIRQ(TIMER2_IRQn);            // enable timer interrupt
+    LPC_TIM2->TCR = 1;                      // start Timer
+}
 
-bool bIsHalfPeriod = false;
-  
-extern "C" void RIT_IRQHandler(void) {
-    //clear flag
-    LPC_RIT->RICTRL |= bit0; //write 1 to clear bit
-    
-    bIsHalfPeriod = !bIsHalfPeriod;
+bool bTimer1 = false;
+extern "C" void TIMER1_IRQHandler()
+{
+    if ((LPC_TIM1->IR & 0x01) == 0x01)
+    {
+        bTimer1 = !bTimer1;
+        
+        LPC_TIM1->IR |= 1 << 0; // clear
+    }
 }
 
-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()
+int sumClocks = 0;
+int PeriodLength = 0;
+bool bReceivedFirstBit = false;
+extern "C" void TIMER2_IRQHandler()
 {
-    while(true) 
+    if (PeriodLength > 0)
     {
-        // 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())
+        if (LPC_TIM2->CR0 >= PeriodLength*1.5 || (sumClocks + clocks) >= PeriodLength*1.5)
         {
-            // Affiche le message à l'écran
-            pc.printf(&message[0], message.size());
+            sumClocks = 0;
+            
+            ThreadLecture.signal_set(1);
+        }
+        else
+        {
+            sumClocks += LPC_TIM2->CR0;
         }
     }
-};
-
-void rit_init()
-{
-    LPC_SC->PCONP |= bit16;                             //Power Control for Peripherals register: power up RIT clock
-    LPC_SC->PCLKSEL1 |= (bit26 && bit27);               //Peripheral clock selection: divide clock by 8 (run RIT clock by 12.5MHz)
-    LPC_RIT->RICOUNTER = 0;                             //set counter to zero
-    LPC_RIT->RICOMPVAL = 250000000 * HALF_PERIOD;       //interrupt tick every HALF_PERIOD
-    LPC_RIT->RICTRL |= bit1;                            // clear timer when counter reaches value
-    LPC_RIT->RICTRL |= bit3;                            // enable timer
-     
-    //enable interrupt
-    NVIC_SetPriority(RIT_IRQn, 31);
-    NVIC_EnableIRQ(RIT_IRQn);
-};
+    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
+}
 
 int main() {
-    rit_init();
-    
-    ThreadLecture.start(read);
+    LPC_PINCON->PINSEL0 |= (3 << 8); // pin30
+    initTimers();
+    ThreadLecture.attach(read);
+    ThreadLecture.start();
     
     while(true) {
-        // TODO: Mettre ici le code pour l'input et l'envoie de message
-        uart.printf("12345");
-        wait_ms(100);
     }
 };
\ No newline at end of file