yuwen sun
/
Hw3B_Final_Syn_Slave
main.cpp@0:02918d5d9986, 2010-12-03 (annotated)
- Committer:
- sun831011
- Date:
- Fri Dec 03 22:22:06 2010 +0000
- Revision:
- 0:02918d5d9986
Who changed what in which revision?
User | Revision | Line number | New 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 |