Dependencies:   mbed

Committer:
sun831011
Date:
Fri Dec 03 22:52:15 2010 +0000
Revision:
0:231665ad8139

        

Who changed what in which revision?

UserRevisionLine numberNew 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(&current_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 }