led example with 2 timers

Dependencies:   mbed mbed-rtos

Files at this revision

API Documentation at this revision

Comitter:
passelin
Date:
Wed Feb 12 07:07:48 2014 +0000
Parent:
4:af325c921e79
Commit message:
02:07

Changed in this revision

main.h Show annotated file Show diff for this revision Revisions of this file
reader.cpp Show annotated file Show diff for this revision Revisions of this file
receiver.cpp Show annotated file Show diff for this revision Revisions of this file
sender.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.h	Tue Feb 11 20:38:43 2014 +0000
+++ b/main.h	Wed Feb 12 07:07:48 2014 +0000
@@ -15,6 +15,8 @@
 #define TYPE 0x00
 #define STOP 0x3E
 
+#define TIME 600000 // 100 ms
+
 typedef struct {
   string trame;
   char size;
@@ -28,7 +30,7 @@
 void Sender_thread(void const *args);
 void Receiver_thread(void const *args);
 
-extern "C" void TIMER0_IRQHandler (void);
+extern "C" void TIMER3_IRQHandler (void);
 extern "C" void TIMER2_IRQHandler (void);
 
 
--- a/reader.cpp	Tue Feb 11 20:38:43 2014 +0000
+++ b/reader.cpp	Wed Feb 12 07:07:48 2014 +0000
@@ -3,17 +3,11 @@
 extern Serial pc;
 extern Queue<string, 16> ReaderQueue;
 
-void Reader_init()
-{
-
-}
-
 void Reader_thread(void const *args)
 {
     string message= "";
     char c;
     unsigned int count = 0;
-    Reader_init();
 
     while(1) 
     {
--- a/receiver.cpp	Tue Feb 11 20:38:43 2014 +0000
+++ b/receiver.cpp	Wed Feb 12 07:07:48 2014 +0000
@@ -1,34 +1,109 @@
 #include "main.h"
 
 extern Serial pc;
-DigitalOut myled2(LED2);
+DigitalOut myled2(LED2);                                                                         
+char s[300];
+enum steps {STEP_A,STEP_B,STEP_C};
+steps state;
+int t[7];
+int temps;
+int b_count;
+int last_value;
+
+// TEST
+bool msgReady;
+string testString;
 
 
 void Receiver_init(void)
 {
     myled2 = 0;
+   // s = "";
+    msgReady = false;
+    state = STEP_A;
     
-    LPC_SC->PCONP |=1<<22;            //timer1 power on
-    LPC_TIM2->MR0 = 2398000;        //100 msec
-    LPC_TIM2->MCR = 3;              //interrupt and reset control
-                                    //3 = Interrupt & reset timer1 on match
-                                    //1 = Interrupt only, no reset of timer0
-    NVIC_EnableIRQ(TIMER2_IRQn);    //enable timer1 interrupt
-    LPC_TIM2->TCR = 1;              //enable Timer1
+    
+    
+    // Enable the pins on the device to use TIMER CAP2.0 on pin 30
+    LPC_PINCON->PINSEL0 |= 3<<8;
+    
+    NVIC_SetVector(TIMER2_IRQn, uint32_t(TIMER2_IRQHandler));
+    
+    // init Timer 2 (cap2.0 = DIP30, cap2.1 = DIP29)
+    LPC_SC->PCONP |= (1 << 22);         // Timer2 power on
+    //LPC_SC->PCLKSEL1 |= (1 << 12);      // Divide CCLK by 1 for Timer2
+    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->IR |= 1 << 0;         // Clear MR0 interrupt flag
+    LPC_TIM2->CCR |= (7 << 0);        // enable cap2.0 rising-edge capture and falling-edge; interrupt on cap2.0
+    //LPC_TIM2->TCR = 1;          // start Timer2
+    
+    NVIC_EnableIRQ(TIMER2_IRQn);    //enable timer2 interrupt
+    
+    b_count = 0;
 }
 
 extern "C"  void TIMER2_IRQHandler (void)
-{
-
-
-    if((LPC_TIM2->IR & 0x01) == 0x01)   // if MR0 interrupt, proceed
-    {
-        LPC_TIM2->IR |= 1 << 0;         // Clear MR0 interrupt flag
+{       
+        int ecart = 0;
+        char buffer[1];
+        myled2 =!myled2;
+        string endChar;
+              
+        LPC_TIM2->IR |= 1 << 0;         // Clear MR0 interrupt flag        
+      
+        switch (state)
+        {
+            case STEP_A:    LPC_TIM2->TCR = 1;      // start Timer2
+                            state = STEP_B;
+                            b_count = 0;
+                            s[0] = '0';
+                            break;
+                            
+            case STEP_B:    t[b_count-1] = LPC_TIM2->CR0;  
+                            LPC_TIM2->TCR = (1 << 1);
+                            LPC_TIM2->TCR = 1;
+                            if(b_count>6)
+                            {
+                                state = STEP_C;
+                                //temps = (t[0] + t[1] + t[2] + t[3] + t[4] + t[5] + t[6])/7;
+                                temps = TIME;
+                                 s[1] = '1';s[2] = '0';s[3] = '1';s[4] = '0';s[5] = '1';s[6] = '0';s[7] = '1';
+                                last_value = 1;                             
+                            }
+                            
+                            
+                            break;                             
+            case STEP_C:    /*ecart = LPC_TIM2->CR0;
+                            if(ecart*1.5<temps)
+                            {
+                                sprintf(buffer, "%d", last_value);
+                                s+= buffer[0];
+                            }
+                            else
+                            {
+                                last_value = 1-last_value;
+                                sprintf(buffer, "%d", last_value);
+                                s+= buffer[0];
+                            }
     
-        
-        myled2 =!myled2;
-    
-    }
+                            endChar = s.substr((s.size()-8), 8); 
+                            if(endChar == "00111110")
+                            {*/
+                                state = STEP_A;
+                                testString = s; 
+                               // s = ""; 
+                                msgReady= true;  
+                           // }
+                        
+                            LPC_TIM2->TCR = (1 << 1);
+                            LPC_TIM2->TCR = 1;
+                            
+                            break;                         
+        }   
+        b_count++;
 }
 
 void Receiver_thread(void const *args)
@@ -37,6 +112,11 @@
     
     while(1)
     {
-    // wait forever...        
+        if(msgReady == true)
+       {
+            pc.printf("\n\rmessage recu: %d", b_count);
+            b_count =0;
+            msgReady= false;   
+        }
     }
 }
\ No newline at end of file
--- a/sender.cpp	Tue Feb 11 20:38:43 2014 +0000
+++ b/sender.cpp	Wed Feb 12 07:07:48 2014 +0000
@@ -3,61 +3,84 @@
 extern Serial pc;
 extern Mail<message_t, 16> mailBox;
 DigitalOut myled(LED1);
-DigitalOut M0(p26);
-volatile unsigned short timer_count;
-unsigned int trameSize = 0; 
-unsigned int trameCounter = 0;
+unsigned int trameSize; 
+unsigned int trameCounter;
 char trameArray[696];
 bool trameReady;
 
-
 void Sender_init(void)
 {
     myled = 0;
-    trameCounter = 0;
+    trameCounter = 1;
+    trameSize = 0;
     trameReady = false;
     
-    LPC_SC->PCONP |=1<1;            //timer0 power on
-    LPC_TIM0->MR0 = 2398000;        //100 msec ??
-    LPC_TIM0->MCR = 3;              //interrupt and reset control
-                                    //3 = Interrupt & reset timer0 on match
-                                    //1 = Interrupt only, no reset of timer0
-    NVIC_EnableIRQ(TIMER0_IRQn);    //enable timer0 interrupt
-    LPC_TIM0->TCR = 1;              //enable Timer0
+    // Enable the pins on the device to use TIMER MAT3.0
+    LPC_PINCON->PINSEL0 |= 3<<20;
+    
+    NVIC_SetVector(TIMER3_IRQn, uint32_t(TIMER3_IRQHandler));
+    
+    LPC_SC->PCONP |=1<<23;            //timer3 power on
+    LPC_TIM3->MR0 = TIME;           //100 msec ??
+    LPC_TIM3->MCR |= 3;              //interrupt and reset control
+                                    //3 = Interrupt & reset timer3 on match
+                                    //1 = Interrupt only, no reset of timer3
+    LPC_TIM3->TC = 0;                   // clear timer counter
+    LPC_TIM3->PC = 0;                   // clear prescale counter
+    LPC_TIM3->PR = 0;                   // clear prescale register
+    LPC_TIM3->TCR = (1 << 1);               //reset Timer3
+    LPC_TIM3->IR |= 1 << 0;         // Clear MR0 interrupt flag
+    LPC_TIM3->EMR |= (3 << 4);        // enable MAT 3.0
+    
+    
+    NVIC_EnableIRQ(TIMER3_IRQn);    //enable timer3 interrupt
+   
 }
 
-extern "C" void TIMER0_IRQHandler (void)
+extern "C" void TIMER3_IRQHandler (void)
 {    
-    if((LPC_TIM0->IR & 0x01) == 0x01)   // if MR0 interrupt, proceed
-    {
-        LPC_TIM0->IR |= 1 << 0;         // Clear MR0 interrupt flag
+    char current = 0;
+    char previous = 0;
     
-        
-        if(trameReady == true)
-        {
-            if(trameCounter <= trameSize)
-            {
-                if(trameArray[trameCounter] == 0x30)
-                {
-                    M0 = 0;    
-                }    
+    if((LPC_TIM3->IR & 0x01) == 0x01)   // if MR0 interrupt, proceed
+     {
+        LPC_TIM3->IR |= 1 << 0;         // Clear MR0 interrupt flag
+         
+        myled =!myled;
+  
+        if(trameReady == true) 
+        {        
+                      
+                if(trameCounter <= trameSize)
+                {   
+                    current = trameArray[trameCounter];
+                    previous = trameArray[trameCounter-1];
+                    
+                    if(current == previous)
+                    {
+                        LPC_TIM3->MR0 = (TIME/2);
+                    } 
+                    else
+                    {
+                        LPC_TIM3->MR0 = (TIME);
+                    }
+    
+                    // next caracter
+                    trameCounter++;
+                    
+                    // Activity light
+                    myled =!myled;
+                }
                 else
                 {
-                    M0 = 1;    
+                    // Trame send, wait until a new trame is ready to send
+                    trameReady = false;
+                    LPC_TIM3->TCR = 0;
+                    trameCounter = 1;  
+                    myled= 0;   
                 }
-                myled =!myled;
-                trameCounter++;
-                
             }
-            else
-            {
-                trameReady = false;
-                trameCounter = 0;  
-                M0 =0;
-                myled= 0;   
-            }
-        }   
-    }
+        }
 }
 
 void Sender_thread(void const *args)
@@ -79,8 +102,9 @@
                 
                 pc.printf("\n\r%s", trameArray);
                 pc.printf("\n\r%d", trameSize);
-                
-                trameReady = true;      
+                    
+                trameReady = true;  
+                LPC_TIM3->TCR = 1; 
             } 
         }
     }