yuwen sun / Mbed 2 deprecated Hw3B_Final_Syn_Slave

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 Serial pc(USBTX, USBRX); // tx, rx
00004 Serial ss(p9, p10); //tx rx
00005 DigitalOut myled(LED3);
00006 DigitalOut rst1(p11);
00007 DigitalOut slaveOut(p23);
00008 
00009 
00010 void Timer0_init(void);
00011 void Timer0_IRQHandler(void);
00012 void slavesyn(void);
00013 void backtime(void);
00014 long long assembletime(long long t);
00015 
00016 long counter = 0;
00017 int divider = 4;  
00018 long long t1;
00019 long long  t2, t3, t4, t5, t6;
00020 long long delay;
00021 long long offdri;
00022 char test;
00023 long long receive(void);
00024 
00025 long long sne(void);
00026 
00027 int main( )
00028 {   
00029     pc.printf("\nbegin\n");
00030     Timer0_init( );
00031      
00032     while (1)
00033     {
00034         myled = 0;
00035            
00036         if (ss.readable( )){
00037             myled = 1;
00038             test = ss.getc();
00039             pc.printf("%d\n", test-'S');
00040 
00041             if (test == 'S' ){
00042                 slavesyn();
00043             }
00044             else{
00045                 if (test == 'T'){
00046                     backtime();
00047                 }
00048                 else{
00049                     pc.printf("\nSystem Error--1!!\n");
00050                 }            
00051             }  
00052         }
00053     }
00054 }
00055 
00056 void Timer0_init(void)
00057 {
00058     LPC_SC->PCLKSEL0 = 0x0066;
00059     LPC_TIM0->MR0 = 2880000000;  // Match count for 100uS
00060     LPC_TIM0->MCR = 3;     // Interrupt and Reset on Match
00061     LPC_TIM0->TCR = 1;     // Enable Timer0  
00062     NVIC_SetVector (TIMER0_IRQn, (uint32_t)&Timer0_IRQHandler);
00063     NVIC_EnableIRQ(TIMER0_IRQn);
00064 }
00065 
00066 
00067 
00068 void Timer0_IRQHandler(void)
00069 {
00070     LPC_TIM0->IR = 1;
00071     LPC_TIM0->MR0 = 2880000000;  // Match count for 100uS
00072     LPC_TIM0->TCR = 1;     // Enable Timer0
00073     counter = counter + 1;
00074 }
00075 
00076 void slavesyn(void)
00077 {
00078     pc.printf("in to fuc\n");
00079         t2 = counter * 4294967296 + LPC_TIM0->TC;
00080         pc.printf("t2 = %llu\n",t2);
00081        
00082         t1 = receive();
00083         pc.printf("t1 = %llu\n",t1);
00084         
00085         wait(2);
00086         t3 = counter * 4294967296 + LPC_TIM0->TC;
00087         ss.putc('S');        
00088         pc.printf("t3 = %llu\n", t3);
00089 
00090         t4 = receive();
00091         pc.printf("t4 = %llu\n",t4);
00092         
00093         
00094         t1 = assembletime(t1);
00095         t2 = assembletime(t2);
00096         t3 = assembletime(t3);
00097         t4 = assembletime(t4);
00098         
00099       //  pc.printf("t2-t1 = %ll\n t1-t2 = %ll \n", (lld)t2-t1,(lld)t1-t2);
00100         
00101         /*
00102         offdri = (t2/4294967296 - t1/4294967296) *30*1000000000 +  (t2%4294967296 - t1%4294967296);
00103         pc.printf("offderi = %llu\n",offdri);
00104         
00105         delay = (t4/4294967296 - t3/4294967296) *4294967296 +  (t4%4294967296 - t3%4294967296);
00106         pc.printf("delay = %llu\n",delay);
00107 */
00108         //assume t2>t1 since slave reset first
00109         if(t3>t4){
00110             if ((t2-t1)>(t3-t4)){
00111                 delay = ((t2-t1)-(t3-t4))/2;
00112                 offdri = ((t2-t1)+(t3-t4))/2;   
00113             }
00114             else{
00115                 delay = ((t3-t4)-(t2-t1))/2;
00116                 offdri = ((t2-t1)+(t3-t4))/2;
00117             }
00118         }
00119         else{ //t4>t3
00120             if ((t2-t1)<(t4-t3)){
00121                 delay = ((t2-t1)+(t4-t3))/2;
00122                 offdri = ((t4-t3)-(t2-t1))/2;
00123             }
00124             else{
00125                 delay = ((t2-t1)+(t4-t3))/2;
00126                 offdri = ((t2-t1)-(t4-t3))/2;
00127             }
00128         } 
00129         
00130         pc.printf("Delay = %llu\n",delay);
00131         pc.printf("offderi = %llu\n",offdri);
00132 
00133         
00134 }
00135 
00136 long long receive(void){
00137     char x;
00138     long long y;
00139     
00140     y=0;
00141     while(1){
00142             if(ss.readable()){
00143                 x = ss.getc();
00144                 if(x == 'E'){
00145                     return y;
00146                 }
00147                 else{
00148                     y = y*10 + (int)(x-48);
00149                 }
00150             }
00151     }
00152 }
00153 
00154 long long assembletime(long long t){
00155     long long temp;
00156 
00157     temp = (t/4294967296)*30*1000000000 + t%4294967296*10;
00158     return temp;
00159 }
00160 
00161 void backtime(){
00162     long long t;
00163     long long temp;
00164     t = counter * 4294967296 + LPC_TIM0->TC;
00165     t = assembletime(t);
00166     t = t - offdri + delay;
00167     /*
00168     temp = t/30/1000000000;
00169     t = (t%30000000000)/10 + temp*4294967296;
00170     */
00171     ss.printf("%llu",t);
00172     ss.putc('E');
00173 }
00174 
00175 void toggle(){
00176     slaveOut = !slaveOut;
00177 }
00178 
00179 long long sne(){
00180     char temp;
00181     char incode[100];
00182     int i=0;
00183     int j=0;
00184     long long sum = 0;
00185     while ((temp = pc.getc())!= 'E') {    //getchar
00186         pc.printf("%c", temp);
00187         incode[i] = temp;    //put the original char in incode      
00188         i++;
00189     } 
00190     pc.printf("E");
00191     for (j=1;j<i;j++){
00192         sum = (incode[j]-'0')+sum*10;
00193     }
00194     pc.printf("\n The time is %llu\n",sum);
00195     if (incode[0]=='S')
00196         return sum;
00197     else
00198         return 0;
00199 }
00200 
00201