//EE 202 hm2 //This is a program built for the mbed1(master mbed) in generation mode //This code has been tested and should be function, if you has any problem, //please mail me.

Dependencies:   mbed

Fork of 202hm2_master by Yujing Qian

main.cpp

Committer:
allonq
Date:
2014-03-14
Revision:
1:55f3661a2050
Parent:
0:fac0542384d7
Child:
2:1c7e1110ac61

File content as of revision 1:55f3661a2050:

//this is a program built for the master mbed(bed1)
#include "mbed.h"
//#include "MKL46Z4.h"

#define mod 0x0000bb80 
#define duty_cycle 0.5
#define high_cycle mod*duty_cycle
#define low_cycle mod-high_cycle
#define buffer_size 9
#define BBBbuff_size 30

DigitalOut LED(LED_RED);
Serial pc(USBTX,USBRX);
Serial uart(PTE0, PTE1);

int loop_num=0;
int state=0;
uint32_t T1=0;
uint32_t T2=0;
uint32_t T3=0;
uint32_t T4=0;
int delay=0;
uint32_t Mod=mod;
char BBBbuffer[BBBbuff_size];
bool cmd_received=false;
int BBBbuff=0;
char buffer[4];
int buff=0;
uint32_t TIME(){return loop_num*(TPM0->MOD)+(TPM0->CNT);}

void receive_handler(){
    while( pc.readable() && BBBbuff<BBBbuff_size){
        BBBbuffer[BBBbuff] =pc.getc();
        pc.putc(BBBbuffer[BBBbuff]);
        //pc.printf(& rx_buffer[buff]);
        if (BBBbuffer[BBBbuff] == '#'){
            BBBbuffer[BBBbuff] = '\0';
            cmd_received=true;
            BBBbuff++;
            pc.printf("cmd received\n");
            break;            
            }
        BBBbuff++;    
        }
        return;
    }
void TPM1_IRQHandler(void);

void synchronize(uint32_t Cmd_mod){
    switch(state){
    case 0: {

        
        char* tmp=(char*)&Cmd_mod;
        T1=TIME();
        pc.printf("T1=%d\n",T1);
        uart.putc((*tmp));pc.printf("0=%d\n",*tmp);
        uart.getc();
        uart.putc((*(tmp+1)));pc.printf("1=%d\n",(*(tmp+1)));
        uart.getc();   
        uart.putc((*(tmp+2)));pc.printf("2=%d\n",(*(tmp+2)));
        uart.getc();  
        uart.putc((*(tmp+3)));pc.printf("3=%d\n",(*(tmp+3)));
         pc.printf("T1.5=%d",TIME()); 
        //pc.printf("T1 done%d\n");
        state++;
        break;}//sending a 5 char command
    case 1:{
            
            buffer[0]=uart.getc();
            uart.putc(0);
            buffer[1]=uart.getc();
            uart.putc(0);
            buffer[2]=uart.getc();
            uart.putc(0);
            buffer[3]=uart.getc();
            T4=TIME();
            T2=((int)buffer[3]<<24)+((int)buffer[2]<<16)+((int)buffer[1]<<8)+((int)buffer[0]);         
            //pc.printf("T2=%d",T2);
            state++;break;
        }//receiving t2 from slave
                   
    case 2:{
            buffer[0]=uart.getc();
            uart.putc(0);
            buffer[1]=uart.getc();
            uart.putc(0);
            buffer[2]=uart.getc();
            uart.putc(0);
            buffer[3]=uart.getc();
            //receiveing t3            
            T3=((int)buffer[3]<<24)+((int)buffer[2]<<16)+((int)buffer[1]<<8)+((int)buffer[0]);
            
            delay= (T4-T3+T2-T1)/2;
            pc.printf("delay=%d\n",delay);
            pc.printf("T1=%d\n",T1);
            pc.printf("T2=%d\n",T2);
            pc.printf("T3=%d\n",T3);
            pc.printf("T4=%d\n",T4);
            //delay=0x0000ffff;
            TPM1->MOD=delay;
            
            TPM1->CNT=0x0;
            TPM1->SC=0x00000048;
            
            //NVIC_SetVector(TPM1_IRQn, (uint32_t)&TPM1_IRQHandler);
            //NVIC_SetPriority(TPM0_IRQn, 0);
            NVIC_EnableIRQ(TPM1_IRQn);
            // open tpm1
            
            uart.putc(0);
            uart.getc();
            uart.putc(0xff);
            uart.getc();
            uart.putc(0);
            uart.getc();
            uart.putc(0xff);     
            state++;
            break;//}
        }//receiving t3 from slave, calculate and send transmit command to slave    
    
    }
    }
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("SC=%d",TPM0->SC);
            pc.printf("Global_time=%d\n",TIME());
            //pc.printf(": %d\n",TPM0->CNT);
            TPM0->SC|= 0x000000c8;
            NVIC_ClearPendingIRQ(TPM0_IRQn); 
            //pc.printf("SC_after=%d\n",TPM0->SC);
            //}//pc.printf("count=%d",TPM0->CNT);
            return;               
    }

void TPM1_IRQHandler(void){// time to restart the system
            TPM0->SC=0x00000040;
            
            TPM0->MOD=mod;
            loop_num=0;//clear clock            
            //TPM0->SC= 0x000000c8;        
            TPM0->CNT=0x0;
            TPM0->SC=0x00000048;
            //NVIC_EnableIRQ(TPM0_IRQn);
            pc.printf("AfterMOD=%d\n",TPM0->MOD);
            //LED=1;
            
            TPM1->CNT=0x0;
            pc.printf("SC=%d",TPM1->SC);
            TPM1->SC= 0x00000080;  
            TPM1->SC= 0x00000000;
            pc.printf("SC_after=%d\n",TPM1->SC);
            pc.printf("Tic-Toc\n");
            NVIC_DisableIRQ(TPM1_IRQn);
            NVIC_ClearPendingIRQ(TPM1_IRQn);

            return;               
    }
    
void Syc(uint32_t Cmd_mod){
    //NVIC_DisableIRQ(TPM0_IRQn);
    //NVIC_ClearPendingIRQ(TPM0_IRQn);    
    state=0; 
    pc.printf("set=%d\n",state);
    uart.putc('#');     
    while(state<3){synchronize(Cmd_mod);}
      
    }
    
void Initial(){
    LED=1;
    SIM->SOPT2=0x07000000;
    SIM->SCGC6=0x03000000;//enable TPM 0,1
    TPM0->SC=0x0;

    TPM0->CNT=0x0;
    TPM0->SC=0x00000040;
    TPM0->MOD=0x0000bb80;
    TPM0->SC=0x00000048;//0008
    
    TPM1->CNT=0x0;
    TPM1->SC=0x00000040;
    TPM1->MOD=0x0000ffff;
    TPM1->SC=0x00000008;//0008
    }
int main() {
    loop_num=0;
    cmd_received=false;
    pc.attach(&receive_handler);    
    int CMD_MOD=0;
    Initial();
    
    pc.baud(9600);
    pc.attach(&receive_handler);
    uart.baud(9600);
      
    NVIC_SetVector(TPM0_IRQn, (uint32_t)&TPM0_IRQHandler);
    NVIC_SetPriority(TPM0_IRQn, 1);
    NVIC_EnableIRQ(TPM0_IRQn); 

    NVIC_SetVector(TPM1_IRQn, (uint32_t)&TPM1_IRQHandler);
    NVIC_SetPriority(TPM1_IRQn, 0);
    NVIC_EnableIRQ(TPM1_IRQn);
    wait(5);
    pc.printf("Initial done\n");

    
    //Syc(48000);
    
    while(1){
        if(cmd_received){
            pc.printf(BBBbuffer);
            for(int i=0;i<BBBbuff-1;i++){
                CMD_MOD*=10;                
                CMD_MOD+=(BBBbuffer[i]-'0');
                }
            cmd_received=false;
            BBBbuff=0;
            TPM0->MOD=CMD_MOD;
            pc.printf("before_syc");
            Syc(CMD_MOD);    
            }
            
        }
    
    
}