led example with 2 timers

Dependencies:   mbed mbed-rtos

Revision:
5:726d7857fd33
Parent:
4:af325c921e79
--- 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