Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #include "mbed.h" 00002 00003 Serial pc(USBTX, USBRX); // tx, rx 00004 Serial ss(p9, p10); //tx rx 00005 Serial ss_sne(p13, p14); //tx rx 00006 00007 DigitalOut myled1(LED1); 00008 DigitalOut myled2(LED2); 00009 00010 DigitalOut masterOut(p23); 00011 InterruptIn masterIn(p22); 00012 InterruptIn slaveIn(p21); 00013 00014 unsigned long counter = 0; 00015 int divider = 1; 00016 int pro_flag = 0; 00017 int task_flag = 0; 00018 unsigned long long t1, t2, t3, t4; 00019 typedef struct timeval { 00020 unsigned long tv_sec; 00021 unsigned long tv_usec; 00022 } timeval; 00023 //struct timeval capture_t; 00024 00025 void Timer0_init(void); 00026 void Timer0_IRQHandler(void); 00027 void Sync_protocol(void); 00028 void getTime(struct timeval *tv); 00029 int runAtTime (void (*fptr)(void), struct timeval tv); 00030 void toggle(void); 00031 void runAtTrigger( ); 00032 void reportToggle(struct timeval *tv); 00033 long long sne(void); 00034 00035 int main( ) 00036 { 00037 struct timeval t_run; 00038 // t_run.tv_sec = 1000; 00039 // t_run.tv_usec = 0; 00040 long long t_run_m; 00041 long long i = 61; 00042 // wait(1); 00043 // masterIn.rise(&runAtTrigger); 00044 // masterIn.fall(&runAtTrigger); 00045 slaveIn.rise(&runAtTrigger); 00046 slaveIn.fall(&runAtTrigger); 00047 Timer0_init( ); 00048 t_run_m = i*1000000; 00049 ss_sne.printf("%llu", t_run_m); 00050 ss_sne.putc('E'); 00051 t_run.tv_sec = t_run_m/1000000; 00052 t_run.tv_usec = t_run_m%1000000; 00053 // pc.printf("s%lu ",t_run.tv_sec); 00054 // pc.printf("%lu\n",t_run.tv_usec); 00055 while (1) 00056 { 00057 if (!task_flag) 00058 task_flag = runAtTime (&toggle, t_run); 00059 else if (task_flag && i < 25000){ 00060 i++; 00061 t_run_m = i*1000000; 00062 ss_sne.printf("%llu", t_run_m); 00063 ss_sne.putc('E'); 00064 t_run.tv_sec = t_run_m/1000000; 00065 t_run.tv_usec = t_run_m%1000000; 00066 //pc.printf("s%lu ",t_run.tv_sec); 00067 //pc.printf("%lu\n",t_run.tv_usec); 00068 task_flag = 0; 00069 } 00070 if (pro_flag == 1){ 00071 Sync_protocol( ); 00072 pro_flag = 0; 00073 } 00074 } 00075 } 00076 00077 void Timer0_init(void) 00078 { 00079 LPC_SC->PCLKSEL0 = 0x0066; 00080 LPC_SC->PCONP |= 1<<1; // Timer0 Power On 00081 LPC_TIM0->MR0 = 2880000000; // Match count for 30S 00082 LPC_TIM0->MCR = 3; // Interrupt and Reset on Match 00083 LPC_TIM0->TCR = 1; // Enable Timer0 00084 NVIC_SetVector (TIMER0_IRQn, (uint32_t)&Timer0_IRQHandler); 00085 NVIC_EnableIRQ(TIMER0_IRQn); 00086 } 00087 00088 void Timer0_IRQHandler(void) 00089 { 00090 LPC_TIM0->IR = 1; 00091 LPC_TIM0->MR0 = 2880000000; // Match count for 30S 00092 LPC_TIM0->TCR = 1; // Enable Timer0 00093 counter = counter + 1; 00094 if ( counter % divider ==0 ) 00095 pro_flag = 1; 00096 } 00097 00098 void Sync_protocol(void) 00099 { 00100 char x; 00101 t1 = counter * 4294967296 + LPC_TIM0->TC; 00102 ss.putc('S'); 00103 // pc.printf("t1 = %llu\n", t1); 00104 ss.printf("%llu", t1); 00105 ss.putc('E'); 00106 while (1){ 00107 if (ss.readable( )){ 00108 x = ss.getc( ); 00109 t4 = counter * 4294967296 + LPC_TIM0->TC; 00110 ss.printf("%llu", t4); 00111 ss.putc('E'); 00112 // pc.printf("%c\n", x); 00113 // pc.printf("t4 = %llu\n", t4); 00114 break; 00115 } 00116 } 00117 } 00118 00119 void getTime(struct timeval *tv){ 00120 unsigned long ns, hs; 00121 ns = LPC_TIM0->TC; 00122 hs = counter; 00123 tv->tv_sec = hs*30 + ns/100000000; 00124 tv->tv_usec = (ns%100000000)/100; 00125 } 00126 00127 int runAtTime (void (*fptr)(void), struct timeval tv){ 00128 struct timeval current_t; 00129 getTime(¤t_t); 00130 if (tv.tv_sec <= current_t.tv_sec && tv.tv_usec <= current_t.tv_usec){ 00131 (*fptr) ( ); 00132 // capture_t=current_t; 00133 return 1; 00134 } 00135 else 00136 return 0; 00137 } 00138 00139 void toggle(void){ 00140 masterOut = !masterOut; 00141 } 00142 00143 void runAtTrigger(void){ 00144 struct timeval response_t; 00145 reportToggle(&response_t); 00146 } 00147 00148 void reportToggle(struct timeval *tv) 00149 { 00150 getTime(tv); 00151 // pc.printf("r %u ", capture_t.tv_sec); 00152 // pc.printf("%u\n", capture_t.tv_usec); 00153 pc.printf("r %u ", tv->tv_sec); 00154 pc.printf("%u\n", tv->tv_usec); 00155 myled2 = !myled2; 00156 } 00157 00158 long long sne( ){ 00159 char temp; 00160 char incode[100]; 00161 int i=0; 00162 int j=0; 00163 long long sum = 0; 00164 while ((temp = pc.getc())!= 'E') { //getchar 00165 incode[i] = temp; //put the original char in incode 00166 i++; 00167 } 00168 for (j=1;j<i;j++){ 00169 sum = (incode[j]-'0')+sum*10; 00170 } 00171 if (incode[0]=='S'){ 00172 ss_sne.printf("%llu", sum); 00173 ss_sne.putc('E'); 00174 return sum; 00175 } 00176 else 00177 return 0; 00178 }
Generated on Tue Jul 26 2022 09:54:47 by
1.7.2