//EE 202 hm2 //This is a program built for the mbed2 monitor mode //This code has been tested and should be function, if you has any problem, //please mail me.

Dependencies:   202hm2_slave mbed

Fork of 202hm2_slave by Yujing Qian

Revision:
3:019db60eb5a6
Parent:
2:4457eb1e9b83
diff -r 4457eb1e9b83 -r 019db60eb5a6 main.cpp
--- a/main.cpp	Fri Mar 14 02:04:33 2014 +0000
+++ b/main.cpp	Sun Mar 16 08:15:50 2014 +0000
@@ -1,135 +1,120 @@
-//this is a program built for the slave mbed(bed1)
+//EE 202 hm2
+//This is a program built for the mbed2(slave) in monitor mode
+//This code has been tested and should be function, if you has any problem,
+//please mail me.
+//Author: Yujing Qian
+//y.qian42@gmail.com
 #include "mbed.h"
 #include "MKL46Z4.h"
 
 #define buffer_size 9
 DigitalOut LED(LED_RED);
+InterruptIn dig_in(PTD4);
 Serial pc(USBTX,USBRX);
+Serial uart_bbb(PTE16,PTE17);
 
 Serial uart(PTE0, PTE1);
+
 int loop_num=0;
+int per_num=0;
+int Period=0;
 int state=0;
 int buffered=0;
 uint32_t T2=0;
 uint32_t T3=0;
 int delay=0;
-int mod=0;
+int per=0;
 char buffer[buffer_size];
 int buff=0;
-uint32_t TIME(){return loop_num*(TPM0->MOD)+(TPM0->CNT);}
+int drift_cnt=0;
+uint32_t second=0;
+bool flag=false;
+uint32_t TIME(){
+    return (per_num*Period*48000+loop_num*48000+(TPM0->CNT));
+    }
 
-
+void report(){
+    int us=(TPM0->CNT);
+    uint32_t ms=per_num*Period+loop_num;
+    uint32_t s=ms/1000;//second
+     ms=ms%1000;
+    uart_bbb.printf("n%u:%d\n",s*1000+ms,us);
+    pc.printf("n%u:%u:%d\n",s,ms,us);
+    drift_cnt++;
+    }
+void Syc(){// calculate delay using hand shake
+            uart.getc();
+            uart.putc(0);       
+            uart.getc();
+            LED=1;
+            TPM0->CNT=0;
+            TPM0->SC=0x00000048;//0008
+    }
 void synchronize(){
     //pc.printf("state=%d\n",state);
-    switch(state){
-    case 0:{
-            buffer[0]=uart.getc();
+
+            buffer[0]=uart.getc();//pc.printf("0=%d\n",buffer[0]);
             uart.putc(0);
-            buffer[1]=uart.getc();
-            uart.putc(0);
-            buffer[2]=uart.getc();
+            buffer[1]=uart.getc();//pc.printf("1=%d\n",buffer[0]);
             uart.putc(0);
-            buffer[3]=uart.getc();
+            buffer[2]=uart.getc();//pc.printf("2=%d\n",buffer[0]);
+            uart.putc(0);
+            buffer[3]=uart.getc();//pc.printf("3=%d\n",buffer[0]);
+            uart.putc(0);
+            per=((int)buffer[3]<<24)+((int)buffer[2]<<16)+((int)buffer[1]<<8)+((int)buffer[0]);
 
-            /*pc.printf("0=%d\n",buffer[0]);
-            pc.printf("1=%d\n",buffer[1]);
-            pc.printf("2=%d\n",buffer[2]);
-            pc.printf("3=%d\n",buffer[3]);*/
-
-            T2=TIME();
+            Syc();
             
-            mod=((int)buffer[3]<<24)+((int)buffer[2]<<16)+((int)buffer[1]<<8)+((int)buffer[0]);
-                //pc.printf("mod=%d",mod);
-                //pc.printf("\n");
-            TPM0->MOD=mod;//buff=0;
-            //pc.printf("MOD=%d\n",mod);           
-            state++;break;//sending a 9 char command
-            //else {break;}
-            }
-    case 1: {
-        T3=TIME();
-        pc.printf("T3_test=%d\n",T3);
-        char* tmp=(char*)&T2;
-        uart.putc((*tmp));
-        uart.getc();
-        uart.putc((*(tmp+1)));
-        uart.getc();
-        uart.putc((*(tmp+2)));
-        uart.getc();
-        uart.putc((*(tmp+3)));
-        
-        state++;break;
-        }// send T2 value
-    case 2:{
-        
-        char* tmp=(char*)&T3;
-        uart.putc((*tmp));
-        uart.getc();
-        uart.putc((*(tmp+1)));
-        uart.getc();
-        uart.putc((*(tmp+2)));
-        uart.getc();
-        uart.putc((*(tmp+3)));
-        state++;break;
-        }//send T3           
-    case 3:{
-        //pc.printf("wait for lanch state=%d\n",state);
-            uart.getc();
-            uart.putc(0);
-            uart.getc();
-            uart.putc(0);
-            uart.getc();
-            uart.putc(0);
-            uart.getc();
-            
-            
+            //pc.printf("Syc_over\n");
             loop_num=0;
-            TPM0->CNT=0x0;
-            TPM0->SC=0x00000048;
-            //NVIC_EnableIRQ(TPM0_IRQn);
-            pc.printf("T2=%d\n",T2);    
-            pc.printf("T3=%d\n",T3);   
-            state++;
-            break;//luanch   
-        }
-    }
+            per_num=0;
+            Period=per;
+            drift_cnt=0;
+            second=0;
+            flag=true;
+
     }
     
-void TPM0_IRQHandler(void){ 
-        //if((TPM0->SC & 0x0080)==0x0080){
-            if(LED){LED=0;}
-            else {LED=1;loop_num++;}
-            //pc.printf("MOD=%d",TPM0->MOD);
-            pc.printf("Global_time=%d\n",TIME());
-            //pc.printf(": %d\n",TPM0->CNT);
+void TPM0_IRQHandler(void){
+            loop_num++;
+            if(loop_num==Period){
+
+                LED=!LED;
+                per_num++;
+                loop_num=0;
+            }
             TPM0->SC|= 0x000000c8;
-            NVIC_ClearPendingIRQ(TPM0_IRQn);
-            //pc.printf("SC_after=%d\n",TPM0->SC);
-            //}//pc.printf("count=%d",TPM0->CNT);
             return;               
     }
 
 
+void cmd_handler(){
+        char tmp;
+        if(uart.readable()){
+        pc.printf("read\n");
+        tmp=uart.getc();
+        pc.printf(&tmp);
+        
+        if(tmp=='#')uart.putc(0);synchronize();}
     
-void Syc(){    
-    state=0;
-    //NVIC_DisableIRQ(TPM0_IRQn);
-    NVIC_ClearPendingIRQ(TPM0_IRQn);  
-    pc.printf("set=%d\n",state);     
-    while(state<4){synchronize();}
-      
     }
+
+    
+
 void Initial(){
     for(int i=0;i<4;i++)buffer[i]=255;
     loop_num=0;
+    per_num=0;
+    Period=5000;
+    //out=0;
     LED=1;
-    SIM->SOPT2=0x07000000;
-    SIM->SCGC6=0x01000000;//enable TPM 0,1
-    TPM0->SC=0x0;
+    SIM->SOPT2=0x05000000;
+    SIM->SCGC6=0x01000000;//enable TPM 0
+    //TPM0->SC=0x0;
     
     TPM0->CNT=0x0;
     TPM0->SC=0x00000040;
-    TPM0->MOD=0x00000fff;
+    TPM0->MOD=0x0000bb80;
     TPM0->SC=0x00000048;//0008
     
 
@@ -138,18 +123,13 @@
     Initial();
         
     pc.baud(9600);
+    uart.baud(9600);
+    uart_bbb.baud(9600);
     
     NVIC_SetVector(TPM0_IRQn, (uint32_t)&TPM0_IRQHandler);
     NVIC_SetPriority(TPM0_IRQn, 1);
     NVIC_EnableIRQ(TPM0_IRQn);
-     
-    char tmp;
-    //pc.printf("done");
     
-    
-    while(1){
-        if(uart.readable()){pc.printf("???\n");
-        tmp=uart.getc();pc.printf(&tmp);
-        if(tmp=='#')Syc();}
-    }
+    dig_in.rise(report); 
+    uart.attach(& cmd_handler);
 }
\ No newline at end of file