yuwen sun
/
Hw3B_Final_PPS_Master
main.cpp@0:231665ad8139, 2010-12-03 (annotated)
- Committer:
- sun831011
- Date:
- Fri Dec 03 22:52:15 2010 +0000
- Revision:
- 0:231665ad8139
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sun831011 | 0:231665ad8139 | 1 | #include "mbed.h" |
sun831011 | 0:231665ad8139 | 2 | |
sun831011 | 0:231665ad8139 | 3 | Serial pc(USBTX, USBRX); // tx, rx |
sun831011 | 0:231665ad8139 | 4 | Serial ss(p9, p10); //tx rx |
sun831011 | 0:231665ad8139 | 5 | Serial ss_sne(p13, p14); //tx rx |
sun831011 | 0:231665ad8139 | 6 | |
sun831011 | 0:231665ad8139 | 7 | DigitalOut myled1(LED1); |
sun831011 | 0:231665ad8139 | 8 | DigitalOut myled2(LED2); |
sun831011 | 0:231665ad8139 | 9 | |
sun831011 | 0:231665ad8139 | 10 | DigitalOut masterOut(p23); |
sun831011 | 0:231665ad8139 | 11 | InterruptIn masterIn(p22); |
sun831011 | 0:231665ad8139 | 12 | InterruptIn slaveIn(p21); |
sun831011 | 0:231665ad8139 | 13 | |
sun831011 | 0:231665ad8139 | 14 | unsigned long counter = 0; |
sun831011 | 0:231665ad8139 | 15 | int divider = 1; |
sun831011 | 0:231665ad8139 | 16 | int pro_flag = 0; |
sun831011 | 0:231665ad8139 | 17 | int task_flag = 0; |
sun831011 | 0:231665ad8139 | 18 | unsigned long long t1, t2, t3, t4; |
sun831011 | 0:231665ad8139 | 19 | typedef struct timeval { |
sun831011 | 0:231665ad8139 | 20 | unsigned long tv_sec; |
sun831011 | 0:231665ad8139 | 21 | unsigned long tv_usec; |
sun831011 | 0:231665ad8139 | 22 | } timeval; |
sun831011 | 0:231665ad8139 | 23 | //struct timeval capture_t; |
sun831011 | 0:231665ad8139 | 24 | |
sun831011 | 0:231665ad8139 | 25 | void Timer0_init(void); |
sun831011 | 0:231665ad8139 | 26 | void Timer0_IRQHandler(void); |
sun831011 | 0:231665ad8139 | 27 | void Sync_protocol(void); |
sun831011 | 0:231665ad8139 | 28 | void getTime(struct timeval *tv); |
sun831011 | 0:231665ad8139 | 29 | int runAtTime (void (*fptr)(void), struct timeval tv); |
sun831011 | 0:231665ad8139 | 30 | void toggle(void); |
sun831011 | 0:231665ad8139 | 31 | void runAtTrigger( ); |
sun831011 | 0:231665ad8139 | 32 | void reportToggle(struct timeval *tv); |
sun831011 | 0:231665ad8139 | 33 | long long sne(void); |
sun831011 | 0:231665ad8139 | 34 | |
sun831011 | 0:231665ad8139 | 35 | int main( ) |
sun831011 | 0:231665ad8139 | 36 | { |
sun831011 | 0:231665ad8139 | 37 | struct timeval t_run; |
sun831011 | 0:231665ad8139 | 38 | // t_run.tv_sec = 1000; |
sun831011 | 0:231665ad8139 | 39 | // t_run.tv_usec = 0; |
sun831011 | 0:231665ad8139 | 40 | long long t_run_m; |
sun831011 | 0:231665ad8139 | 41 | long long i = 61; |
sun831011 | 0:231665ad8139 | 42 | // wait(1); |
sun831011 | 0:231665ad8139 | 43 | // masterIn.rise(&runAtTrigger); |
sun831011 | 0:231665ad8139 | 44 | // masterIn.fall(&runAtTrigger); |
sun831011 | 0:231665ad8139 | 45 | slaveIn.rise(&runAtTrigger); |
sun831011 | 0:231665ad8139 | 46 | slaveIn.fall(&runAtTrigger); |
sun831011 | 0:231665ad8139 | 47 | Timer0_init( ); |
sun831011 | 0:231665ad8139 | 48 | t_run_m = i*1000000; |
sun831011 | 0:231665ad8139 | 49 | ss_sne.printf("%llu", t_run_m); |
sun831011 | 0:231665ad8139 | 50 | ss_sne.putc('E'); |
sun831011 | 0:231665ad8139 | 51 | t_run.tv_sec = t_run_m/1000000; |
sun831011 | 0:231665ad8139 | 52 | t_run.tv_usec = t_run_m%1000000; |
sun831011 | 0:231665ad8139 | 53 | // pc.printf("s%lu ",t_run.tv_sec); |
sun831011 | 0:231665ad8139 | 54 | // pc.printf("%lu\n",t_run.tv_usec); |
sun831011 | 0:231665ad8139 | 55 | while (1) |
sun831011 | 0:231665ad8139 | 56 | { |
sun831011 | 0:231665ad8139 | 57 | if (!task_flag) |
sun831011 | 0:231665ad8139 | 58 | task_flag = runAtTime (&toggle, t_run); |
sun831011 | 0:231665ad8139 | 59 | else if (task_flag && i < 25000){ |
sun831011 | 0:231665ad8139 | 60 | i++; |
sun831011 | 0:231665ad8139 | 61 | t_run_m = i*1000000; |
sun831011 | 0:231665ad8139 | 62 | ss_sne.printf("%llu", t_run_m); |
sun831011 | 0:231665ad8139 | 63 | ss_sne.putc('E'); |
sun831011 | 0:231665ad8139 | 64 | t_run.tv_sec = t_run_m/1000000; |
sun831011 | 0:231665ad8139 | 65 | t_run.tv_usec = t_run_m%1000000; |
sun831011 | 0:231665ad8139 | 66 | //pc.printf("s%lu ",t_run.tv_sec); |
sun831011 | 0:231665ad8139 | 67 | //pc.printf("%lu\n",t_run.tv_usec); |
sun831011 | 0:231665ad8139 | 68 | task_flag = 0; |
sun831011 | 0:231665ad8139 | 69 | } |
sun831011 | 0:231665ad8139 | 70 | if (pro_flag == 1){ |
sun831011 | 0:231665ad8139 | 71 | Sync_protocol( ); |
sun831011 | 0:231665ad8139 | 72 | pro_flag = 0; |
sun831011 | 0:231665ad8139 | 73 | } |
sun831011 | 0:231665ad8139 | 74 | } |
sun831011 | 0:231665ad8139 | 75 | } |
sun831011 | 0:231665ad8139 | 76 | |
sun831011 | 0:231665ad8139 | 77 | void Timer0_init(void) |
sun831011 | 0:231665ad8139 | 78 | { |
sun831011 | 0:231665ad8139 | 79 | LPC_SC->PCLKSEL0 = 0x0066; |
sun831011 | 0:231665ad8139 | 80 | LPC_SC->PCONP |= 1<<1; // Timer0 Power On |
sun831011 | 0:231665ad8139 | 81 | LPC_TIM0->MR0 = 2880000000; // Match count for 30S |
sun831011 | 0:231665ad8139 | 82 | LPC_TIM0->MCR = 3; // Interrupt and Reset on Match |
sun831011 | 0:231665ad8139 | 83 | LPC_TIM0->TCR = 1; // Enable Timer0 |
sun831011 | 0:231665ad8139 | 84 | NVIC_SetVector (TIMER0_IRQn, (uint32_t)&Timer0_IRQHandler); |
sun831011 | 0:231665ad8139 | 85 | NVIC_EnableIRQ(TIMER0_IRQn); |
sun831011 | 0:231665ad8139 | 86 | } |
sun831011 | 0:231665ad8139 | 87 | |
sun831011 | 0:231665ad8139 | 88 | void Timer0_IRQHandler(void) |
sun831011 | 0:231665ad8139 | 89 | { |
sun831011 | 0:231665ad8139 | 90 | LPC_TIM0->IR = 1; |
sun831011 | 0:231665ad8139 | 91 | LPC_TIM0->MR0 = 2880000000; // Match count for 30S |
sun831011 | 0:231665ad8139 | 92 | LPC_TIM0->TCR = 1; // Enable Timer0 |
sun831011 | 0:231665ad8139 | 93 | counter = counter + 1; |
sun831011 | 0:231665ad8139 | 94 | if ( counter % divider ==0 ) |
sun831011 | 0:231665ad8139 | 95 | pro_flag = 1; |
sun831011 | 0:231665ad8139 | 96 | } |
sun831011 | 0:231665ad8139 | 97 | |
sun831011 | 0:231665ad8139 | 98 | void Sync_protocol(void) |
sun831011 | 0:231665ad8139 | 99 | { |
sun831011 | 0:231665ad8139 | 100 | char x; |
sun831011 | 0:231665ad8139 | 101 | t1 = counter * 4294967296 + LPC_TIM0->TC; |
sun831011 | 0:231665ad8139 | 102 | ss.putc('S'); |
sun831011 | 0:231665ad8139 | 103 | // pc.printf("t1 = %llu\n", t1); |
sun831011 | 0:231665ad8139 | 104 | ss.printf("%llu", t1); |
sun831011 | 0:231665ad8139 | 105 | ss.putc('E'); |
sun831011 | 0:231665ad8139 | 106 | while (1){ |
sun831011 | 0:231665ad8139 | 107 | if (ss.readable( )){ |
sun831011 | 0:231665ad8139 | 108 | x = ss.getc( ); |
sun831011 | 0:231665ad8139 | 109 | t4 = counter * 4294967296 + LPC_TIM0->TC; |
sun831011 | 0:231665ad8139 | 110 | ss.printf("%llu", t4); |
sun831011 | 0:231665ad8139 | 111 | ss.putc('E'); |
sun831011 | 0:231665ad8139 | 112 | // pc.printf("%c\n", x); |
sun831011 | 0:231665ad8139 | 113 | // pc.printf("t4 = %llu\n", t4); |
sun831011 | 0:231665ad8139 | 114 | break; |
sun831011 | 0:231665ad8139 | 115 | } |
sun831011 | 0:231665ad8139 | 116 | } |
sun831011 | 0:231665ad8139 | 117 | } |
sun831011 | 0:231665ad8139 | 118 | |
sun831011 | 0:231665ad8139 | 119 | void getTime(struct timeval *tv){ |
sun831011 | 0:231665ad8139 | 120 | unsigned long ns, hs; |
sun831011 | 0:231665ad8139 | 121 | ns = LPC_TIM0->TC; |
sun831011 | 0:231665ad8139 | 122 | hs = counter; |
sun831011 | 0:231665ad8139 | 123 | tv->tv_sec = hs*30 + ns/100000000; |
sun831011 | 0:231665ad8139 | 124 | tv->tv_usec = (ns%100000000)/100; |
sun831011 | 0:231665ad8139 | 125 | } |
sun831011 | 0:231665ad8139 | 126 | |
sun831011 | 0:231665ad8139 | 127 | int runAtTime (void (*fptr)(void), struct timeval tv){ |
sun831011 | 0:231665ad8139 | 128 | struct timeval current_t; |
sun831011 | 0:231665ad8139 | 129 | getTime(¤t_t); |
sun831011 | 0:231665ad8139 | 130 | if (tv.tv_sec <= current_t.tv_sec && tv.tv_usec <= current_t.tv_usec){ |
sun831011 | 0:231665ad8139 | 131 | (*fptr) ( ); |
sun831011 | 0:231665ad8139 | 132 | // capture_t=current_t; |
sun831011 | 0:231665ad8139 | 133 | return 1; |
sun831011 | 0:231665ad8139 | 134 | } |
sun831011 | 0:231665ad8139 | 135 | else |
sun831011 | 0:231665ad8139 | 136 | return 0; |
sun831011 | 0:231665ad8139 | 137 | } |
sun831011 | 0:231665ad8139 | 138 | |
sun831011 | 0:231665ad8139 | 139 | void toggle(void){ |
sun831011 | 0:231665ad8139 | 140 | masterOut = !masterOut; |
sun831011 | 0:231665ad8139 | 141 | } |
sun831011 | 0:231665ad8139 | 142 | |
sun831011 | 0:231665ad8139 | 143 | void runAtTrigger(void){ |
sun831011 | 0:231665ad8139 | 144 | struct timeval response_t; |
sun831011 | 0:231665ad8139 | 145 | reportToggle(&response_t); |
sun831011 | 0:231665ad8139 | 146 | } |
sun831011 | 0:231665ad8139 | 147 | |
sun831011 | 0:231665ad8139 | 148 | void reportToggle(struct timeval *tv) |
sun831011 | 0:231665ad8139 | 149 | { |
sun831011 | 0:231665ad8139 | 150 | getTime(tv); |
sun831011 | 0:231665ad8139 | 151 | // pc.printf("r %u ", capture_t.tv_sec); |
sun831011 | 0:231665ad8139 | 152 | // pc.printf("%u\n", capture_t.tv_usec); |
sun831011 | 0:231665ad8139 | 153 | pc.printf("r %u ", tv->tv_sec); |
sun831011 | 0:231665ad8139 | 154 | pc.printf("%u\n", tv->tv_usec); |
sun831011 | 0:231665ad8139 | 155 | myled2 = !myled2; |
sun831011 | 0:231665ad8139 | 156 | } |
sun831011 | 0:231665ad8139 | 157 | |
sun831011 | 0:231665ad8139 | 158 | long long sne( ){ |
sun831011 | 0:231665ad8139 | 159 | char temp; |
sun831011 | 0:231665ad8139 | 160 | char incode[100]; |
sun831011 | 0:231665ad8139 | 161 | int i=0; |
sun831011 | 0:231665ad8139 | 162 | int j=0; |
sun831011 | 0:231665ad8139 | 163 | long long sum = 0; |
sun831011 | 0:231665ad8139 | 164 | while ((temp = pc.getc())!= 'E') { //getchar |
sun831011 | 0:231665ad8139 | 165 | incode[i] = temp; //put the original char in incode |
sun831011 | 0:231665ad8139 | 166 | i++; |
sun831011 | 0:231665ad8139 | 167 | } |
sun831011 | 0:231665ad8139 | 168 | for (j=1;j<i;j++){ |
sun831011 | 0:231665ad8139 | 169 | sum = (incode[j]-'0')+sum*10; |
sun831011 | 0:231665ad8139 | 170 | } |
sun831011 | 0:231665ad8139 | 171 | if (incode[0]=='S'){ |
sun831011 | 0:231665ad8139 | 172 | ss_sne.printf("%llu", sum); |
sun831011 | 0:231665ad8139 | 173 | ss_sne.putc('E'); |
sun831011 | 0:231665ad8139 | 174 | return sum; |
sun831011 | 0:231665ad8139 | 175 | } |
sun831011 | 0:231665ad8139 | 176 | else |
sun831011 | 0:231665ad8139 | 177 | return 0; |
sun831011 | 0:231665ad8139 | 178 | } |