yuwen sun
/
Hw3B_Final_SNE_Slave
Revision 0:d3b34dbeb9bd, committed 2010-12-03
- 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(¤t_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