Dependencies:   mbed

Committer:
sun831011
Date:
Fri Dec 03 22:22:06 2010 +0000
Revision:
0:02918d5d9986

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sun831011 0:02918d5d9986 1 #include "mbed.h"
sun831011 0:02918d5d9986 2
sun831011 0:02918d5d9986 3 Serial pc(USBTX, USBRX); // tx, rx
sun831011 0:02918d5d9986 4 Serial ss(p9, p10); //tx rx
sun831011 0:02918d5d9986 5 DigitalOut myled(LED3);
sun831011 0:02918d5d9986 6 DigitalOut rst1(p11);
sun831011 0:02918d5d9986 7 DigitalOut slaveOut(p23);
sun831011 0:02918d5d9986 8
sun831011 0:02918d5d9986 9
sun831011 0:02918d5d9986 10 void Timer0_init(void);
sun831011 0:02918d5d9986 11 void Timer0_IRQHandler(void);
sun831011 0:02918d5d9986 12 void slavesyn(void);
sun831011 0:02918d5d9986 13 void backtime(void);
sun831011 0:02918d5d9986 14 long long assembletime(long long t);
sun831011 0:02918d5d9986 15
sun831011 0:02918d5d9986 16 long counter = 0;
sun831011 0:02918d5d9986 17 int divider = 4;
sun831011 0:02918d5d9986 18 long long t1;
sun831011 0:02918d5d9986 19 long long t2, t3, t4, t5, t6;
sun831011 0:02918d5d9986 20 long long delay;
sun831011 0:02918d5d9986 21 long long offdri;
sun831011 0:02918d5d9986 22 char test;
sun831011 0:02918d5d9986 23 long long receive(void);
sun831011 0:02918d5d9986 24
sun831011 0:02918d5d9986 25 long long sne(void);
sun831011 0:02918d5d9986 26
sun831011 0:02918d5d9986 27 int main( )
sun831011 0:02918d5d9986 28 {
sun831011 0:02918d5d9986 29 pc.printf("\nbegin\n");
sun831011 0:02918d5d9986 30 Timer0_init( );
sun831011 0:02918d5d9986 31
sun831011 0:02918d5d9986 32 while (1)
sun831011 0:02918d5d9986 33 {
sun831011 0:02918d5d9986 34 myled = 0;
sun831011 0:02918d5d9986 35
sun831011 0:02918d5d9986 36 if (ss.readable( )){
sun831011 0:02918d5d9986 37 myled = 1;
sun831011 0:02918d5d9986 38 test = ss.getc();
sun831011 0:02918d5d9986 39 pc.printf("%d\n", test-'S');
sun831011 0:02918d5d9986 40
sun831011 0:02918d5d9986 41 if (test == 'S' ){
sun831011 0:02918d5d9986 42 slavesyn();
sun831011 0:02918d5d9986 43 }
sun831011 0:02918d5d9986 44 else{
sun831011 0:02918d5d9986 45 if (test == 'T'){
sun831011 0:02918d5d9986 46 backtime();
sun831011 0:02918d5d9986 47 }
sun831011 0:02918d5d9986 48 else{
sun831011 0:02918d5d9986 49 pc.printf("\nSystem Error--1!!\n");
sun831011 0:02918d5d9986 50 }
sun831011 0:02918d5d9986 51 }
sun831011 0:02918d5d9986 52 }
sun831011 0:02918d5d9986 53 }
sun831011 0:02918d5d9986 54 }
sun831011 0:02918d5d9986 55
sun831011 0:02918d5d9986 56 void Timer0_init(void)
sun831011 0:02918d5d9986 57 {
sun831011 0:02918d5d9986 58 LPC_SC->PCLKSEL0 = 0x0066;
sun831011 0:02918d5d9986 59 LPC_TIM0->MR0 = 2880000000; // Match count for 100uS
sun831011 0:02918d5d9986 60 LPC_TIM0->MCR = 3; // Interrupt and Reset on Match
sun831011 0:02918d5d9986 61 LPC_TIM0->TCR = 1; // Enable Timer0
sun831011 0:02918d5d9986 62 NVIC_SetVector (TIMER0_IRQn, (uint32_t)&Timer0_IRQHandler);
sun831011 0:02918d5d9986 63 NVIC_EnableIRQ(TIMER0_IRQn);
sun831011 0:02918d5d9986 64 }
sun831011 0:02918d5d9986 65
sun831011 0:02918d5d9986 66
sun831011 0:02918d5d9986 67
sun831011 0:02918d5d9986 68 void Timer0_IRQHandler(void)
sun831011 0:02918d5d9986 69 {
sun831011 0:02918d5d9986 70 LPC_TIM0->IR = 1;
sun831011 0:02918d5d9986 71 LPC_TIM0->MR0 = 2880000000; // Match count for 100uS
sun831011 0:02918d5d9986 72 LPC_TIM0->TCR = 1; // Enable Timer0
sun831011 0:02918d5d9986 73 counter = counter + 1;
sun831011 0:02918d5d9986 74 }
sun831011 0:02918d5d9986 75
sun831011 0:02918d5d9986 76 void slavesyn(void)
sun831011 0:02918d5d9986 77 {
sun831011 0:02918d5d9986 78 pc.printf("in to fuc\n");
sun831011 0:02918d5d9986 79 t2 = counter * 4294967296 + LPC_TIM0->TC;
sun831011 0:02918d5d9986 80 pc.printf("t2 = %llu\n",t2);
sun831011 0:02918d5d9986 81
sun831011 0:02918d5d9986 82 t1 = receive();
sun831011 0:02918d5d9986 83 pc.printf("t1 = %llu\n",t1);
sun831011 0:02918d5d9986 84
sun831011 0:02918d5d9986 85 wait(2);
sun831011 0:02918d5d9986 86 t3 = counter * 4294967296 + LPC_TIM0->TC;
sun831011 0:02918d5d9986 87 ss.putc('S');
sun831011 0:02918d5d9986 88 pc.printf("t3 = %llu\n", t3);
sun831011 0:02918d5d9986 89
sun831011 0:02918d5d9986 90 t4 = receive();
sun831011 0:02918d5d9986 91 pc.printf("t4 = %llu\n",t4);
sun831011 0:02918d5d9986 92
sun831011 0:02918d5d9986 93
sun831011 0:02918d5d9986 94 t1 = assembletime(t1);
sun831011 0:02918d5d9986 95 t2 = assembletime(t2);
sun831011 0:02918d5d9986 96 t3 = assembletime(t3);
sun831011 0:02918d5d9986 97 t4 = assembletime(t4);
sun831011 0:02918d5d9986 98
sun831011 0:02918d5d9986 99 // pc.printf("t2-t1 = %ll\n t1-t2 = %ll \n", (lld)t2-t1,(lld)t1-t2);
sun831011 0:02918d5d9986 100
sun831011 0:02918d5d9986 101 /*
sun831011 0:02918d5d9986 102 offdri = (t2/4294967296 - t1/4294967296) *30*1000000000 + (t2%4294967296 - t1%4294967296);
sun831011 0:02918d5d9986 103 pc.printf("offderi = %llu\n",offdri);
sun831011 0:02918d5d9986 104
sun831011 0:02918d5d9986 105 delay = (t4/4294967296 - t3/4294967296) *4294967296 + (t4%4294967296 - t3%4294967296);
sun831011 0:02918d5d9986 106 pc.printf("delay = %llu\n",delay);
sun831011 0:02918d5d9986 107 */
sun831011 0:02918d5d9986 108 //assume t2>t1 since slave reset first
sun831011 0:02918d5d9986 109 if(t3>t4){
sun831011 0:02918d5d9986 110 if ((t2-t1)>(t3-t4)){
sun831011 0:02918d5d9986 111 delay = ((t2-t1)-(t3-t4))/2;
sun831011 0:02918d5d9986 112 offdri = ((t2-t1)+(t3-t4))/2;
sun831011 0:02918d5d9986 113 }
sun831011 0:02918d5d9986 114 else{
sun831011 0:02918d5d9986 115 delay = ((t3-t4)-(t2-t1))/2;
sun831011 0:02918d5d9986 116 offdri = ((t2-t1)+(t3-t4))/2;
sun831011 0:02918d5d9986 117 }
sun831011 0:02918d5d9986 118 }
sun831011 0:02918d5d9986 119 else{ //t4>t3
sun831011 0:02918d5d9986 120 if ((t2-t1)<(t4-t3)){
sun831011 0:02918d5d9986 121 delay = ((t2-t1)+(t4-t3))/2;
sun831011 0:02918d5d9986 122 offdri = ((t4-t3)-(t2-t1))/2;
sun831011 0:02918d5d9986 123 }
sun831011 0:02918d5d9986 124 else{
sun831011 0:02918d5d9986 125 delay = ((t2-t1)+(t4-t3))/2;
sun831011 0:02918d5d9986 126 offdri = ((t2-t1)-(t4-t3))/2;
sun831011 0:02918d5d9986 127 }
sun831011 0:02918d5d9986 128 }
sun831011 0:02918d5d9986 129
sun831011 0:02918d5d9986 130 pc.printf("Delay = %llu\n",delay);
sun831011 0:02918d5d9986 131 pc.printf("offderi = %llu\n",offdri);
sun831011 0:02918d5d9986 132
sun831011 0:02918d5d9986 133
sun831011 0:02918d5d9986 134 }
sun831011 0:02918d5d9986 135
sun831011 0:02918d5d9986 136 long long receive(void){
sun831011 0:02918d5d9986 137 char x;
sun831011 0:02918d5d9986 138 long long y;
sun831011 0:02918d5d9986 139
sun831011 0:02918d5d9986 140 y=0;
sun831011 0:02918d5d9986 141 while(1){
sun831011 0:02918d5d9986 142 if(ss.readable()){
sun831011 0:02918d5d9986 143 x = ss.getc();
sun831011 0:02918d5d9986 144 if(x == 'E'){
sun831011 0:02918d5d9986 145 return y;
sun831011 0:02918d5d9986 146 }
sun831011 0:02918d5d9986 147 else{
sun831011 0:02918d5d9986 148 y = y*10 + (int)(x-48);
sun831011 0:02918d5d9986 149 }
sun831011 0:02918d5d9986 150 }
sun831011 0:02918d5d9986 151 }
sun831011 0:02918d5d9986 152 }
sun831011 0:02918d5d9986 153
sun831011 0:02918d5d9986 154 long long assembletime(long long t){
sun831011 0:02918d5d9986 155 long long temp;
sun831011 0:02918d5d9986 156
sun831011 0:02918d5d9986 157 temp = (t/4294967296)*30*1000000000 + t%4294967296*10;
sun831011 0:02918d5d9986 158 return temp;
sun831011 0:02918d5d9986 159 }
sun831011 0:02918d5d9986 160
sun831011 0:02918d5d9986 161 void backtime(){
sun831011 0:02918d5d9986 162 long long t;
sun831011 0:02918d5d9986 163 long long temp;
sun831011 0:02918d5d9986 164 t = counter * 4294967296 + LPC_TIM0->TC;
sun831011 0:02918d5d9986 165 t = assembletime(t);
sun831011 0:02918d5d9986 166 t = t - offdri + delay;
sun831011 0:02918d5d9986 167 /*
sun831011 0:02918d5d9986 168 temp = t/30/1000000000;
sun831011 0:02918d5d9986 169 t = (t%30000000000)/10 + temp*4294967296;
sun831011 0:02918d5d9986 170 */
sun831011 0:02918d5d9986 171 ss.printf("%llu",t);
sun831011 0:02918d5d9986 172 ss.putc('E');
sun831011 0:02918d5d9986 173 }
sun831011 0:02918d5d9986 174
sun831011 0:02918d5d9986 175 void toggle(){
sun831011 0:02918d5d9986 176 slaveOut = !slaveOut;
sun831011 0:02918d5d9986 177 }
sun831011 0:02918d5d9986 178
sun831011 0:02918d5d9986 179 long long sne(){
sun831011 0:02918d5d9986 180 char temp;
sun831011 0:02918d5d9986 181 char incode[100];
sun831011 0:02918d5d9986 182 int i=0;
sun831011 0:02918d5d9986 183 int j=0;
sun831011 0:02918d5d9986 184 long long sum = 0;
sun831011 0:02918d5d9986 185 while ((temp = pc.getc())!= 'E') { //getchar
sun831011 0:02918d5d9986 186 pc.printf("%c", temp);
sun831011 0:02918d5d9986 187 incode[i] = temp; //put the original char in incode
sun831011 0:02918d5d9986 188 i++;
sun831011 0:02918d5d9986 189 }
sun831011 0:02918d5d9986 190 pc.printf("E");
sun831011 0:02918d5d9986 191 for (j=1;j<i;j++){
sun831011 0:02918d5d9986 192 sum = (incode[j]-'0')+sum*10;
sun831011 0:02918d5d9986 193 }
sun831011 0:02918d5d9986 194 pc.printf("\n The time is %llu\n",sum);
sun831011 0:02918d5d9986 195 if (incode[0]=='S')
sun831011 0:02918d5d9986 196 return sum;
sun831011 0:02918d5d9986 197 else
sun831011 0:02918d5d9986 198 return 0;
sun831011 0:02918d5d9986 199 }
sun831011 0:02918d5d9986 200
sun831011 0:02918d5d9986 201