yuwen sun / Mbed 2 deprecated Hw3B_Final_PPS_Master

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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