Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
sun831011
Date:
Fri Dec 03 22:48:04 2010 +0000
Commit message:

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r d3b34dbeb9bd main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Dec 03 22:48:04 2010 +0000
@@ -0,0 +1,245 @@
+#include "mbed.h"
+
+Serial pc(USBTX, USBRX); // tx, rx
+Serial ss(p9, p10); //tx rx
+Serial ss_sne(p13, p14);
+DigitalOut myled(LED3);
+DigitalOut rst1(p11);
+DigitalOut slaveOut(p23);
+
+
+void Timer0_init(void);
+void Timer0_IRQHandler(void);
+void slavesyn(void);
+void backtime(void);
+long long assembletime(long long t);
+int runAtTime (void (*fptr)(void), struct timeval tv);
+void getTime(struct timeval *tv);
+void toggle(void);
+
+long counter = 0;
+int divider = 4;  
+long long t1;
+long long  t2, t3, t4, t5, t6;
+long long delay;
+long long offdri;
+char test;
+long long receive(void);
+long long receive_sne(void);
+long long snesig;
+long long sne(void);
+int task_flag = 0;
+
+typedef struct timeval {
+    unsigned long tv_sec;
+    unsigned long tv_usec;
+} timeval;
+
+struct timeval t_run;
+
+int main( )
+{   
+    pc.printf("\nbegin\n");
+    Timer0_init( );
+    t_run.tv_sec = 1000;
+    t_run.tv_usec = 0;
+     
+    while (1)
+    {
+        myled = 0;
+        
+        if (!task_flag){
+            task_flag = runAtTime (&toggle, t_run);
+        }
+        
+        if (ss_sne.readable()){
+            snesig = receive_sne();
+            t_run.tv_sec = snesig/1000000;
+            t_run.tv_usec = snesig%1000000;
+            pc.printf("\nSNE is %llu\n",snesig);
+        }
+           
+        if (ss.readable( )){
+            myled = 1;
+            test = ss.getc();
+            pc.printf("%d\n", test-'S');
+
+            if (test == 'S' ){
+                slavesyn();
+                
+            }
+            else{
+                if (test == 'T'){
+                    backtime();
+                }
+                else{
+                    pc.printf("\nSystem Error--1!!\n");
+                }            
+            }  
+        }
+    }
+}
+
+void Timer0_init(void)
+{
+    LPC_SC->PCLKSEL0 = 0x0066;
+    LPC_TIM0->MR0 = 2880000000;  // Match count for 100uS
+    LPC_TIM0->MCR = 3;     // Interrupt and Reset on Match
+    LPC_TIM0->TCR = 1;     // Enable Timer0  
+    NVIC_SetVector (TIMER0_IRQn, (uint32_t)&Timer0_IRQHandler);
+    NVIC_EnableIRQ(TIMER0_IRQn);
+}
+
+
+
+void Timer0_IRQHandler(void)
+{
+    LPC_TIM0->IR = 1;
+    LPC_TIM0->MR0 = 2880000000;  // Match count for 100uS
+    LPC_TIM0->TCR = 1;     // Enable Timer0
+    counter = counter + 1;
+}
+
+void slavesyn(void)
+{
+    pc.printf("in to fuc\n");
+        t2 = counter * 4294967296 + LPC_TIM0->TC;
+        pc.printf("t2 = %llu\n",t2);
+       
+        t1 = receive();
+        pc.printf("t1 = %llu\n",t1);
+        
+        wait(2);
+        t3 = counter * 4294967296 + LPC_TIM0->TC;
+        ss.putc('S');        
+        pc.printf("t3 = %llu\n", t3);
+
+        t4 = receive();
+        pc.printf("t4 = %llu\n",t4);
+        
+        
+        t1 = assembletime(t1);
+        t2 = assembletime(t2);
+        t3 = assembletime(t3);
+        t4 = assembletime(t4);
+        
+      //  pc.printf("t2-t1 = %ll\n t1-t2 = %ll \n", (lld)t2-t1,(lld)t1-t2);
+        
+        
+        offdri = (t2/4294967296 - t1/4294967296) *30*1000000000 +  (t2%4294967296 - t1%4294967296);
+        pc.printf("offderi = %llu\n",offdri);
+        
+        t_run.tv_sec = t_run.tv_sec + (t2 - t1)/1000000000;
+        t_run.tv_usec = t_run.tv_usec + ((t2-t1)/1000)%1000000; 
+        
+        delay = (t4/4294967296 - t3/4294967296) *4294967296 +  (t4%4294967296 - t3%4294967296);
+        pc.printf("delay = %llu\n",delay);
+
+        //assume t2>t1 since slave reset first
+        if(t3>t4){
+            if ((t2-t1)>(t3-t4)){
+                delay = ((t2-t1)-(t3-t4))/2;
+                offdri = ((t2-t1)+(t3-t4))/2;   
+            }
+            else{
+                delay = ((t3-t4)-(t2-t1))/2;
+                offdri = ((t2-t1)+(t3-t4))/2;
+            }
+        }
+        else{ //t4>t3
+            if ((t2-t1)<(t4-t3)){
+                delay = ((t2-t1)+(t4-t3))/2;
+                offdri = ((t4-t3)-(t2-t1))/2;
+            }
+            else{
+                delay = ((t2-t1)+(t4-t3))/2;
+                offdri = ((t2-t1)-(t4-t3))/2;
+            }
+        } 
+        
+        pc.printf("Delay = %llu\n",delay);
+        pc.printf("offderi = %llu\n",offdri);
+
+        
+}
+
+long long receive(void){
+    char x;
+    long long y;
+    
+    y=0;
+    while(1){
+            if(ss.readable()){
+                x = ss.getc();
+                if(x == 'E'){
+                    return y;
+                }
+                else{
+                    y = y*10 + (int)(x-48);
+                }
+            }
+    }
+}
+
+long long assembletime(long long t){
+    long long temp;
+
+    temp = (t/4294967296)*30*1000000000 + (t%4294967296)*10;
+    return temp;
+}
+
+void backtime(){
+    long long t;
+    long long temp;
+    t = counter * 4294967296 + LPC_TIM0->TC;
+    t = assembletime(t);
+    t = t - offdri + delay;
+    /*
+    temp = t/30/1000000000;
+    t = (t%30000000000)/10 + temp*4294967296;
+    */
+    ss.printf("%llu",t);
+    ss.putc('E');
+}
+
+void toggle(){
+    slaveOut = !slaveOut;
+}
+
+long long receive_sne(void){
+    char x;
+    long long y;
+    
+    y=0;
+    while(1){
+            if(ss_sne.readable()){
+                x = ss_sne.getc();
+                if(x == 'E'){
+                    return y;
+                }
+                else{
+                    y = y*10 + (int)(x-48);
+                }
+            }
+    }
+}
+
+void getTime(struct timeval *tv){
+    unsigned long ns, hs;
+    ns = LPC_TIM0->TC;
+    hs = counter;
+    tv->tv_sec = hs*30 + ns/100000000;
+    tv->tv_usec = (ns%100000000)/100;
+}
+
+int runAtTime (void (*fptr)(void), struct timeval tv){
+      struct timeval current_t;
+      getTime(&current_t);
+      if (tv.tv_sec <= current_t.tv_sec && tv.tv_usec <= current_t.tv_usec){
+          (*fptr) ( );
+          return 1;
+      }
+      else 
+          return 0;  
+}
+
diff -r 000000000000 -r d3b34dbeb9bd mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Dec 03 22:48:04 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e