#include #include #include #include _FOSC(CSW_FSCM_OFF & XT_PLL8); _FWDT(WDT_OFF); _FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN); _FGS(CODE_PROT_OFF); unsigned int config1 = UART_EN & UART_IDLE_CON & UART_ALTRX_ALTTX & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT; unsigned int config2 = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR; unsigned int config3 = UART_EN & UART_IDLE_CON & UART_RX_TX & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT; unsigned int config4 = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR; unsigned long lat1,lat2,lat3,lat4; //緯度 unsigned long lon1,lon2,lon3,lon4; //経度 unsigned long alt; //高度 unsigned long sp; //速度 unsigned long dir; //方位 unsigned long sat; //衛星数 unsigned int i,t,u; //for文用 unsigned int n,m; //タイミング合わせるためのレジスタ用。データ読み込み時に使ってます unsigned long x[23]; //生データ用 unsigned long a,b,c; //生データから計算する過程で用いた unsigned char y[13]; //本データ int main(void) { init_I2C(); t=0; u=0; //何かしら初期設定してみた for(i=0;i<23;i++) { x[i]=1111; } while(1) { OpenUART1(config1,config2,129); OpenUART2(config3,config4,129); //とりあえず始める putsUART1("start\n\r"); while(BusyUART1()); while(1) { //1バイト受信 while(!DataRdyUART2()); x[0] = ReadUART2(); //もしヘッダなら if(x[0]==0xe0) { break; } //そうでない時の確認 // U1MODEbits.ALTIO=1; putsUART1("wait..."); while(BusyUART1()); } //23バイト目まで読み込む for(i=1;i<23;i++){ m=U2STAbits.URXDA; while(!DataRdyUART2()) n=U2STAbits.RIDLE; x[i] = ReadUART2(); } //データ計算 GPS_data(); //データの保存場所があれば if(t<65500){ for(i=0;i<13;i++) { u=t+i; EEPROM_write(u,y[i]); } t=t+13; } } //終了確認 putsUART1("\n\rEND\n\r"); while(BusyUART1()); } void GPS_data() { //緯度 //北緯(1)か南緯(1)か if(x[3]<0x40) { lat1 = 1; }else{ lat1 = 2; x[3] = (x[3]^0xff)+1; x[4] = (x[4]^0xff)+1; x[5] = (x[5]^0xff)+1; x[6] = (x[6]^0xff)+1; } //角度の計算 a = x[3]*2097152+x[4]*16384+x[5]*128+x[6]; lat2 = a/600000; lat3 = (a%600000)/10000; lat4 = (a%600000)%10000; //経度 //東経(1)か西経(2)か if(x[7]<0x40) { lon1 = 1; }else{ lon1 = 2; x[7] = (x[7]^0xff)+1; x[8] = (x[8]^0xff)+1; x[9] = (x[9]^0xff)+1; x[10] = (x[10]^0xff)+1; } //角度の計算 b = x[7]*2097152+x[8]*16384+x[9]*128+x[10]; lon2 = b/600000; lon3 = (b%600000)/10000; lon4 = (b%600000)%10000; //高度 //正(1)か負(2)か if(x[11]<0x40) { c = 1; }else{ c = 2; x[11] = (x[11]^0xff)+1; x[12] = (x[12]^0xff)+1; x[13] = (x[13]^0xff)+1; x[14] = (x[14]^0xff)+1; } //高さの計算 alt = x[11]*2097152+x[12]*16384+x[13]*128+x[14]; //速度 sp = x[15]*16384+x[16]*128+x[17]; //方位 dir = x[18]*128+x[19]; //衛星数 sat = x[20]; y[0] = (unsigned char)lat1; y[1] = (unsigned char)lat2; y[2] = (unsigned char)lat3; y[3] = (unsigned char)lat4; y[4] = (unsigned char)lon1; y[5] = (unsigned char)lon2; y[6] = (unsigned char)lon3; y[7] = (unsigned char)lon4; y[8] = (unsigned char)c; y[9] = (unsigned char)alt; y[10] = (unsigned char)sp; y[11] = (unsigned char)dir; y[12] = (unsigned char)sat; }