yuwen sun
/
Hw3B_Final_Syn_Slave
main.cpp
- Committer:
- sun831011
- Date:
- 2010-12-03
- Revision:
- 0:02918d5d9986
File content as of revision 0:02918d5d9986:
#include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx Serial ss(p9, p10); //tx rx 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); 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 sne(void); int main( ) { pc.printf("\nbegin\n"); Timer0_init( ); while (1) { myled = 0; 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); 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 sne(){ char temp; char incode[100]; int i=0; int j=0; long long sum = 0; while ((temp = pc.getc())!= 'E') { //getchar pc.printf("%c", temp); incode[i] = temp; //put the original char in incode i++; } pc.printf("E"); for (j=1;j<i;j++){ sum = (incode[j]-'0')+sum*10; } pc.printf("\n The time is %llu\n",sum); if (incode[0]=='S') return sum; else return 0; }