//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
Diff: main.cpp
- Revision:
- 0:7c4f7de16626
- Child:
- 1:76a206e19490
diff -r 000000000000 -r 7c4f7de16626 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Mar 13 21:27:49 2014 +0000 @@ -0,0 +1,135 @@ +//this is a program built for the slave mbed(bed1) +#include "mbed.h" +#include "MKL46Z4.h" + +#define buffer_size 9 +DigitalOut LED(LED_RED); +Serial pc(USBTX,USBRX); + +Serial uart(PTE0, PTE1); +static int loop_num=0; +int state=0; +int buffered=0; +uint32_t T2=0; +uint32_t T3=0; +int delay=0; +uint32_t mod=0; +char buffer[buffer_size]; +int buff=0; +uint32_t TIME(){return loop_num*mod+TPM0->CNT;} + + +void sycronize(){ + switch(state){ + case 0:{buff=0; + pc.printf("state0\n"); + while(uart.readable()&& buff<4){ + buffer[buff]=uart.getc();buff++;} + + 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(); + 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; + state++;break;}//sending a 9 char command + case 1: { + T3=TIME(); + char* tmp=(char*)&T2; + pc.printf("state1\n"); + uart.putc((*tmp)); + uart.putc((*(tmp+1))); + uart.putc((*(tmp+2))); + uart.putc((*(tmp+3))); + state++;break; + }// send T2 value + case 2:{ + + char* tmp=(char*)&T3; + uart.putc((*tmp)); + uart.putc((*(tmp+1))); + uart.putc((*(tmp+2))); + uart.putc((*(tmp+3))); + state++;break; + }//send T3 + case 3:{ + pc.printf("wait for lanch state=%d\n",state); + buffer[0]=uart.getc(); + buffer[1]=uart.getc(); + buffer[2]=uart.getc(); + buffer[3]=uart.getc(); + + loop_num=0; + TPM0->CNT=0x0; + TPM0->SC=0x00000048; + NVIC_DisableIRQ(TPM0_IRQn); + state++; + break;//luanch + } + } + } + +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",loop_num); + //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 Syc(){ + state=0; + NVIC_DisableIRQ(TPM0_IRQn); + NVIC_ClearPendingIRQ(TPM0_IRQn); + pc.printf("set=%d\n",state); + while(state<4){sycronize();} + + } +void Initial(){ + LED=1; + SIM->SOPT2=0x07000000; + SIM->SCGC6=0x01000000;//enable TPM 0,1 + TPM0->SC=0x0; + //-------------------CnSC----------------------- + volatile uint32_t * ptrMyReg; + volatile uint32_t prev; + ptrMyReg = (volatile uint32_t *) 0x4003800C;//C0SC + prev = *ptrMyReg; + prev = prev | 0x00000040; + *ptrMyReg = prev; + //---------------------------------------------- + TPM0->CNT=0x0; + TPM0->SC=0x00000040; + TPM0->MOD=0x000000ff; + TPM0->SC=0x00000048;//0008 + + + } +int main() { + Initial(); + pc.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();} + } +} \ No newline at end of file