📄 gpscx.c
字号:
TWSR=0;
TWCR=(1<<TWEN)|(0<<TWIE)|(0<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);
}
void delay (unsigned int byte)
{
unsigned int i;
while(byte--)
for(i=0;i<1000;i++);
}
void SpiWrite(unsigned char byte)
{
SPDR=byte;
SPI_STATUS ();
}
unsigned char SpiRead(void)
{
SPDR=45;
SPI_STATUS ();
return SPDR; // Return function parameter
}
void mb_proc(void)
{
unsigned char m,temp,flag_ptr_rxerror=0;
do {
while (1)
{
m=PINE & ptr_dr;
temp=1;
temp=1;
if (m) break;
}
//PORTF &=led_cloader;
PORTE &=ptr_ctxce;
PORTB &=ptr_ccsn;
delay (1);
SpiWrite(ptr_rrp);
for(m=0;m<len_ptr_data;m++)
{
delay (1);
mb_jdtarg[m]=SpiRead();
}
for(m=0;m<23;m++)
{
delay (1);
temp=SpiRead();
}
PORTB |=ptr_scsn;
temp=PINE;
while (((temp & ptr_dr) == ptr_dr)
|| ((temp & ptr_am) == ptr_am)); //数据已收到
temp =mb_jdtarg[0]*100+mb_jdtarg[1];
if ((temp>179) || (mb_jdtarg[4]>99))
{
flag_ptr_rxerror=1;
delay (10);
PORTB &=ptr_ctxen;
PORTB |=ptr_stxce; //to rx
delay (10);
}
else
{
LBH_Targ[0]=temp+mb_jdtarg[2]/60.0+(mb_jdtarg[3]+mb_jdtarg[4]/100.0)/3600.0;
LBH_Targ[1]=mb_jdtarg[5]+mb_jdtarg[6]/60.0+(mb_jdtarg[7]+mb_jdtarg[8]/100.0)/3600.0;
LBH_Targ[2]=atof(mb_hdtarg);
}
// mb_proc();
}
while (flag_ptr_rxerror);
Targ_load=TRUE; //置目标已装定标志
PORTF &=led_cloader;
lcd_targ(); //LCD上显示目标数据
lcd_mbcircle(); //LCD上画目标点
}
void spiport_ini(void) //spi初始化
{
unsigned char temp;
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);
SPSR=0x00;
temp=SPSR;
temp=SPDR;
}
void spi_ini(void) //use TO ptr8000 无线模块初始化
{
unsigned char temp;
PORTB &=ptr_ccsn;
delay (1);
SpiWrite(ptr_wc);
for(temp=0;temp<len_ptr_config;temp++) //CONFIG
{
SpiWrite(flash_ptr8000_config[temp]);
}
PORTB |=ptr_scsn;
delay (2);
PORTB &=ptr_ctxen;
PORTB |=ptr_stxce; //to rx
}
void usart_ini(void)
{
UCSR0B=0x98; //RX-INT EN,RXEN,
UCSR0C=0x06; //,ASYNC ,NO-PARITY,1-STOP,8bit data bit
UBRR0H=0x00;
UBRR0L=gpsubrrL;
UCSR1B=0x98; //RX-INT EN,TX-INT EN,RXEN,TXEN
UCSR1C=0x06; //,ASYNC ,NO-PARITY,1-STOP,8bit data bit
UBRR1H=0x00;
UBRR1L=lbubrrL;
}
void e16c550_ini(void) //use TO uSb
{
unsigned char temp;
MUB_LCTRREG=d_inidlb550;
MUB_HDLBREG=d_hband550;
MUB_LDLBREG=d_lband550;
temp=MUB_LCTRREG;
MUB_LCTRREG=d_lctr550;
MUB_MODEMCREG=d_modemc550;
// MUB_IENREG=d_ienable550;
MUB_IENREG=0;
MUB_IIDREG=0x00; // 16C550 初始化
temp=MUB_IIDREG;
// pusb_open_file(); //打开USB上的"HTCPROC"文件 用于存储数据
/* MUB_LCTRREG=d_inidlb550;
MUB_HDLBREG=d_hband550;
MUB_LDLBREG=d_lband550;
temp=MUB_LCTRREG;
MUB_LCTRREG=d_lctr550;
MUB_MODEMCREG=d_modemc550;
*/ MUB_IENREG=d_ienable550;
MUB_IIDREG=0x00;
temp=MUB_IIDREG; // 16C550 重新初始化,开中断
}
void adc_ini(void) // A/D初始化
{
ADCSRA=0x00;
ADMUX=0x40; //AREF
ACSR=(1<<ACD); //CLOSE M
ADCSRA=(1<<ADSC)|(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //fclk/128
AD_num=0;
// ADCSRA=(1<<ADSC); //START AD
}
void time_ini(void) //检测流速的定时器1和3初始化
{
TIMSK=(1<<TOIE2);
ETIMSK=(1<<TOIE3);
TCCR2=0;
TCCR3B=0; //1024/14.7456 //SPEED
}
void time_start(void) //检测流速的定时器1启动
{
TCNT3=0;
speed_intctount=0;
buf_speerfirst=0;
speed_buf=0;
last_time=0;
buf_zspeed_cttime=0;
buf_zspeed_ctint=0;
TCNT2=0x0ff;
TCCR2=0x07;
speed_ctgap=d_speedgap;
}
void time_stop(void) //检测流速
{
double temp=0;
move_pulse=speed_buf;///2;
if (move_pulse==1)
{
move_time=speed_intctount*4;
if (TCNT3>0x1F00) temp=(TCNT3-0x1F00);
else temp=0;
}
else
{
if(move_pulse>1) move_pulse=move_pulse-1;
move_time=buf_zspeed_ctint*4;
if (buf_zspeed_cttime>0x1F00) temp=(buf_zspeed_cttime-0x1F00);
else temp=0;
}
temp=(temp/14400.0);//*4/57600.0; //65536-0x1f00
move_time+=temp;//*5;
// temp=move_time;
new_move_vel=TRUE;
//lcd_bit4dis(120,60,move_time);
// lcd_bit3dis(18,48,move_pulse);
//move_velocity();
//lcd_bit3dis(18,68,move_vel);
//lcd_pressure (move_time);
// lcd_compass(move_pulse);
}
void ini_rob(void)
{
unsigned char m;
PORTB=(1<<PB0)|(1<<PB3)|(1<<PB4); //PB3=MISO
DDRB=(1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB4)|(1<<DDB5)|(1<<DDB6); //PB0=csn,PB1=SCK,PB2=MOSI,PB3=MISO,PB4=PTRT_PWR,PB5=PTRT_CE,PB6=PTRT_EN
// PORTC=0;
DDRC=0xff; //
PORTD=(1<<PD6)|(1<<PD7); // PD6=SPEED,PD7=SPEED
DDRD=(1<<DDD0)|(1<<DDD3); //
PORTE=(1<<PE0)|(1<<PE4)|(1<<PE5); //(1<<PE4)|(1<<PE5);
DDRE=(1<<DDE1); //PE2=IUB,IPTRCD,/INTCLK,/IUBPTR,IPTRAM,IPTRDR
PORTF=(1<<PF1)|(1<<PF2); //PF1=UPWATER-LED,PF2=LOAD-LED,
DDRF=(1<<PF1)|(1<<PF2); //
PORTG=(1<<PG0)|(1<<PG1);
DDRG=(1<<DDG0)|(1<<DDG1);
lcd_clr_ping(); //LCD清屏
lcd_ini_zf(); //LCD初始化
time_ini(); //检测流速初始化
usart_ini(); //用于GPS和电子罗盘的串口初始化
adc_ini(); //水深A/D初始化
twi_master_initialise(); //用于板上时钟的I2C初始化
// m=clk_ini(); //i2c
I2CStop();
// while ((TWCR&(1<<TWSTO))!=0);
TWCR=0;
speed_ctgap=d_speedgap; //检测流速的时间间隔
flag_second_int=flag_adcrxed=0;
stste_pwr=d_strongpwr;
flag_gps_have=0; //GPS卫星存在标志
flag_gpsrhead=flag_gpshead1=0; //GPS的"$ G"标志和"$"标志
flag_gps_perrxdata=flag_mproc_gps=0; //有GPS有效数据,正在处理GPS数据标志
is_new_gps=0; //GPS有效数据可以使用标志
flag_lbhead=0; //电子罗盘的"$"标志
Current_i=0; //电子罗盘数据使用指针
//is_new_depth=0; //水深A/D的数据可以使用标志
Targ_load=0; //目标装定标志
//pressure_comput=move_comput=0; //计算出水深和流速存储单元初始值为0
TCNT3=0;
flag_first_zd=TRUE; //第一次定位标志
spiport_ini();
spi_ini(); //无线模块初始化
mb_proc();
PORTF &=led_cloader;
// e16c550_ini(); //用于USB的16C550 和USB初始化
EIMSK=0x00; //EINT7----------EINT0 MARK
EICRB=/*(1<<ISC71)|(1<<ISC70)|*/(1<<ISC61)|(1<<ISC60)|(1<<ISC41)|(1<<ISC51); //7,6 EINT7 5,4EINT6,3,2EINT5,1,0EINT4,;00=LOW-LEVEL,01=YAN
//10=SAN YAN 11=XIA YAN TARET
//EINT 3--0 TARET MODE
TIMSK=(1<<TOIE2);
ETIMSK=(1<<TOIE3);
EIMSK=(1<<INT4)|(1<<INT5);//|(1<<INT6)|(1<<INT7); //EINT7----------EINT0 MARK
//////EIFR=0;
EIFR|=(1<<INTF4)|(1<<INTF5);//|(1<<INTF6)|(1<<INTF7);
}
unsigned char clk_ini(void) //板上时钟初始化
{
unsigned char temp=2;
DDRD &=~((1<<PD0)|(1<<PD1));
I2CStart();
I2CWaitAck();
if (I2CChkAck()!=I2C_START ) return 0;
I2CSendByte(d_clk_w);
I2CWaitAck();
if (I2CChkAck()!=I2C_MT_SLA_ACK ) return 0;
I2CSendByte(d_clk_reg1add);
I2CWaitAck();
if (I2CChkAck()!=I2C_MT_DATA_ACK ) return 0;
I2CSendByte(d_clk_regcmd) //second level int
I2CWaitAck();
if (I2CChkAck()!=I2C_MT_DATA_ACK ) return 0;
I2CSendByte(d_clk_reg2cmd) //24hour no 32k
I2CWaitAck();
if (I2CChkAck()!=I2C_MT_DATA_ACK ) return 0;
// I2CStop();
return temp;
}
void gps_rxproc(void)
{
unsigned char k,m,n,t;
unsigned int s;
flag_gps_have=0;
flag_mproc_gps=TRUE;
k=(gps_mtimedata[0]&0x0f)*10;
k+=gps_mtimedata[1]&0x0f;
k=(k+8)%24;
m=(gps_mtimedata[2]&0xf)*10;
m+=gps_mtimedata[3]&0xf;
n=(gps_mtimedata[4]&0xf)*10;
n+=gps_mtimedata[5]&0xf;
LBH_Current[3]=k*3600.0+m*60.0+n; //GPS 时间
if (k&&(n==0)) //每分对时
{
sd2300_clk[0]=n;
sd2300_clk[1]=m;
sd2300_clk[2]=k;
m=clk_verify_proc();
I2CStop();
// while ((TWCR&(1<<TWSTO))!=0);
TWCR=0;
}
m=gps_mwdudata[0]&0x0f;
n=gps_mwdudata[1]&0x0f;
LBH_Current[1]=m*10+n;
m=gps_mwdudata[2]&0x0f;
n=gps_mwdudata[3]&0x0f;
k=m*10+n;
m=gps_mwdudata[5]&0x0f;
n=gps_mwdudata[6]&0x0f;
t=gps_mwdudata[7]&0x0f;
s=m*1000+n*100+t*10+(gps_mwdudata[8]&0x0f);
LBH_Current[1]+=k/60.0+s/600000.0; //GPS 纬度
s=gps_mjdudata[0]&0x0f;
m=gps_mjdudata[1]&0x0f;
n=gps_mjdudata[2]&0x0f;
LBH_Current[0]=s*100+m*10+n;
m=gps_mjdudata[3]&0x0f;
n=gps_mjdudata[4]&0x0f;
m=m*10+n;
n=gps_mjdudata[6]&0x0f;
t=gps_mjdudata[7]&0x0f;
k=gps_mjdudata[8]&0x0f;
s=n*1000+t*100+k*10+(gps_mjdudata[9]&0x0f);
LBH_Current[0]+=m/60.0+s/600000.0; //GPS 经度
// LBH_Current[2]=atof(gps_mgdu);
flag_mproc_gps=0;
if (flag_first_zd)
{ k_gps++;
if(k_gps>5)
{LBH_jin[k_gps-6]=LBH_Current[0];
LBH_wei[k_gps-6]=LBH_Current[1];}
if (k_gps>13)
{
LBH_Current[0]=GPSprocess(LBH_jin,9);
LBH_Current[1]=GPSprocess(LBH_wei,9);
lcd_zdcircle();
lcd_drawline (0,0,0,250,d_greencolor_lcd);
lcd_drawline (1,0,1,250,d_greencolor_lcd);
lcd_drawline (-1,0,-1,250,d_greencolor_lcd);
is_new_gps=TRUE;
lcd_newloc(LBH_Current[0],LBH_Current[1]); //LCD的GPS 的定位信息
lcd_upwbright();
flag_first_zd=0;
k_gps=0;
//time_temp=LBH_Current[3];
}
}
else
{
is_new_gps=TRUE;
lcd_newloc(LBH_Current[0],LBH_Current[1]); //LCD的GPS 的定位信息
// lcd_upwbright();
}
PORTF &=led_cupwater;
}
/*void chk_power(void)
{
unsigned int ipwr;
unsigned char pwrstate_temp=0;
flag_adcrxed=0;
ipwr=ADC;
if (ipwr<mix_pwr) pwrstate_temp=d_lostpwr;
else if (ipwr<middle_pwr) pwrstate_temp=d_midpwr;
else if (ipwr<max_pwr) pwrstate_temp=d_maxpwr;
else pwrstate_temp=d_strongpwr;
pwrstate_temp=d_midpwr;
if (stste_pwr>pwrstate_temp)
{
stste_pwr=pwrstate_temp;
lcd_pwrbright();
}
}
*/
void lcd_clr_ping(void) //LCD清屏
{
unsigned char y;
unsigned int x;
lcd_stateadd=d_lcdini_state_word;
lcd_xadd=0;
lcd_yadd=0;
for (y=0;y<234;y++)
for (x=0;x<320;x++)
{lcd_dataadd=d_darkc;}
}
void lcd_ini_zf(void) //LCD初始化界面
{
unsigned char x,y,z,t;
unsigned int ct_ounter;
/////////////////////////////////////////
lcd_xadd=loc_lcdxmbz_head;
lcd_yadd=z=loc_lcdyleft1_head;
for (t=0;t<len_4zct;t++)
for (y=0;y<len_zi;y++)
{
for (x=0;x<len_zi;x++) lcd_dataadd=flash_mbzlcd[t][y][x];
lcd_yadd=z=z-1;
lcd_xadd=loc_lcdxmbz_head;
} //ini mbjdz
mao_hao(loc_xmbzmaohao,loc_lcdy4zmao_head); //目标位置
/////////////////////////////////////
//////////////////////mb-//////////////////
lcd_xadd=loc_lcdxmbjdz_head;
lcd_yadd=z=loc_lcdyq_head;
for (y=0;y<7;y++)
{
for (x=0;x<7;x++) lcd_dataadd=flash_qzlcd[y][x];
lcd_yadd=z=z-1;
lcd_xadd=loc_lcdxmbjdz_head;
} //0
// lcd_xadd=loc_lcdxmbjdz_head;
lcd_yadd=z=loc_lcdyp_head;
for (y=0;y<2;y++)
{
for (x=0;x<5;x++) lcd_dataadd=flash_pzlcd[y][x];
lcd_yadd=z=z-1;
lcd_xadd=loc_lcdxmbjdz_head;
} // "/"
// lcd_xadd=loc_lcdxmbjdz_head;
lcd_yadd=z=loc_lcdysp_head;
for (y=0;y<6;y++)
{
for (x=0;x<5;x++) lcd_dataadd=flash_dpzlcd[y][x];
lcd_yadd=z=z-1;
lcd_xadd=loc_lcdxmbjdz_head;
} // "//" //目标经度的 0, ',"
lcd_xadd=loc_lcdxmbwdz_head;
lcd_yadd=z=loc_lcdyq_head;
for (y=0;y<7;y++)
{
for (x=0;x<7;x++) lcd_dataadd=flash_qzlcd[y][x];
lcd_yadd=z=z-1;
lcd_xadd=loc_lcdxmb
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -