📄 tangshants040611.c
字号:
{
timeout++;
LastTeLifeSignal=TeLifeSignal;
TeLifeSignal=rxPrcs422[2];
txbuf485[5]=rxPrcs422[2];/*Te life signal*/
txbuf485[8]=rxPrcs422[3];/*TE status information*/
txbuf485[6]=rxPrcs422[5];
txbuf485[7]=rxPrcs422[4];/*TE tilting angle*/
txbuf485[9]=rxPrcs422[7];
txbuf485[10]=rxPrcs422[6];/*TE setpoint*/
txbuf485[11]&=0xff;/*TE error command invaluable*/
txbuf485[14]&=0xfd;/*TE 422通信ok*/
Watchdog();
}
if((rxPrcs422[1]&0x3f)==0x05/*frameID==0x05*/)/*TE error command*/
{
txbuf485[11]=rxPrcs422[3];/*error information,bit0-bit7*/
txbuf485[12]=rxPrcs422[2];/*error information,bit8-bit15*/
txbuf485[13]=rxPrcs422[4];/*error car number*/
fhchehao=rxPrcs422[4]; //test
txbuf485[11]|=0x80;/*TE error command valuable*/
bitflagb5=1;
}
if((rxPrcs422[1]&0x3f)==0x08)/*TE Status frame frameID*/
{
Watchdog();
ResponseCPU();/* send ERR 422 to CPU*/
bitflagb6=1;
}
}//end bitFrmCmpl422
if(bitflag100ms)
{
bitflag100ms=0;
if(bitFrmCmpl485)/*rs485 receive a whole frame*/
{
enable485Send();
bitFrmCmpl485=0;
Watchdog();
rs485send();//response the EKE request
LED1B=~LED1B;
}
if(bitflagb5)
{
Watchdog();
ResponseTeErr();/* send ERR RESPONSE to TE ID6*/
// LED1A=~LED1A; //test
bitflagb5=0;
}
Watchdog();
lifesign++;
txbuf485[3]=lifesign;/*网卡 life signal*/
if(!((rxPrcs485[11]&0x01)==0x01))//stop request
{
timeout_2++;
if(timeout_2>10)
{
timeout_2=0;
ResponseCPU();/* send ERR 422 to CPU*/
bit422ID2OK=0; //quit
}
Watchdog();
Sendstopcm();
// LED1A=~LED1A;
}
else//if(bitflagb4/*|bitflagb7*/)//gstein
{
timeout_2=0;
Watchdog();
tiltCmmnd();/*send TITTING COMMAND to TE*/
LED1A=~LED1A;
}
if(!((rxPrcs485[11]&0x01)==0x01)&bitflagb6)/*stop request and rs422 receive id8*/
{
bitflagb6=0;/*clear the flag*/
Watchdog();
bit422ID2OK=0; //quit
}
// if(timeout>10)
// {
// timeout=0;
// if(LastTeLifeSignal==TeLifeSignal)
// {
// Watchdog();
// ResponseCPU();/* send ERR 422 to CPU*/
// }
// }
}
}
}// end while(1.....
}
void Initialize(void)
{
// unsigned char i;
//WDCON=WDCON|0x03; //EWT=1;RWT=1;//inner_chip watchdog not beused.
//CKCON=0;//CKCON: (Clock Control)
CKCON &=0x3f;
// ┃ D7: WD1 ┐Watchdog定时脉冲数选择, 对fosc进行计数, 计 ┃
// ┃ D6: WD0 ┘数溢出时, WDIF置1, 申请中断. 再计512个脉冲 ┃
// ┃ WTRF置1, 产生硬件复位. ┃
// ┃ D7D6=00, 2^17个脉冲(复位脉冲数2^17+512) ┃
// ┃ D7D6=01, 2^20个脉冲(复位脉冲数2^20+512) ┃
// ┃ D7D6=02, 2^23个脉冲(复位脉冲数2^23+512) ┃
// ┃ D7D6=03, 2^26个脉冲(复位脉冲数2^26+512) ┃
// ┃ D4: T1M T1内部计数时钟频率选择: 0:fosc/12, 1:fosc/4 ┃
// ┃ D3: T0M T0内部计数时钟频率选择: 0:fosc/12, 1:fosc/4 ┃
// ┃ D2: MD2 ┐数据(外部)存贮器读写选通脉宽选择. ┃
// ┃ D1: MD1 │ ┃
// ┃ D0: MD0 ┘D2D1D0=000
// CKCON=CKCON|0x05; //w/r out delay 0x09 machine cycles//watchdog time about 300ms(not used)
EIE=0 ;
EIP=0 ;
// EIP=0x10;
// EIE=0x10;
// EWDI=1; //disEnable watchdog Interrupt;//(not inner but)outside watchdog used.
// PWDI=1;
if(WarmData==0x5a)
{;}
else
{
if(CheckInterRam(InRAMBegin,InRAMEnd))//test the inter ram
{bitflagRamOK=1;//内部RAM自检
}
else{
Watchdog();
LED1A=ON;Delay(10000);
Watchdog();
}
if(CheckExterRam(ExRAMBegin,ExRAMEnd))//test the exter ram
{bitflagRamOK=1;//外部RAM自检
}
else{
Watchdog();
LED1B=ON;Delay(10000);
Watchdog();
}
WarmData=0x5a;
}
Watchdog();
InitializeTimer0(); //initialize T0 as TimerInt
Watchdog();
InitializeTimer2(); //initialize T2 for 485_com0
Watchdog();
InitializeRXDTXDCom0(); //initialized com0
Watchdog();
InitializeRXDTXDCom1(); //initialized com1
Watchdog();
/*CAN initialize*/
initCan();
P1_0=1; //RXD-485 com0/com1 Permit receive
P1_1=1;
IT0=1; //Extern Interrupt 0 Mode
IT1=1; //Extern Interrupt 1 Mode
TR0=1; TR1=1; TR2=1; //
IP=0x01;//0x53;//10; //IP:- ,PS1,PT2,PS0 ; PT1,PX1,PT0,PX0;//How to place the priority?
// 0, 0, 0, 1 ; 0 , 0, 0, 0 ;
IE=0xd3; //EI:EA,ES1,ET2,ES0 ; ET1,EX1,ET0,EX0;//1101,0111;//T1andT2 used as buadrate generate
//暂时关掉CAN 通讯,打开则 IE=0xd3
}
_bit CheckInterRam(unsigned char cx,unsigned char cy)//inter_ram selftest
{
unsigned char data * pb;
unsigned char data * pd;
pb=(unsigned char data *)cx; //pb=cx;
pd=(unsigned char data *)cy;
for(;pb<=pd;pb++)
{
*pb=0xff;
_nop();
if(*pb!=0xff) return (0);
*pb=~(*pb);
_nop();
if(*pb!=0x00) return (0);
}
return(1);
}
_bit CheckExterRam(unsigned int cx,unsigned int cy)//exter_ram selftest
{
unsigned char xdat * pb;
unsigned char xdat * pd;
pb=(unsigned char xdat *)cx;
pd=(unsigned char xdat *)cy;
for(;pb<pd;pb++)
{
*pb=0xff;
_nop();
if(*pb!=0xff)
return (0);
*pb=~(*pb);
_nop();
if(*pb!=0x00)
return (0);
}
return(1);
}
void Delay(unsigned int tempint)
{
unsigned int data i;
unsigned char data c;
for(i=tempint;i>0;i--)
{
P3_4=!P3_4;
for(c=50;c>0;c--)
{_nop();//is this "nop" command 10us?
}
}
}
void Watchdog(void)
{
P3_4=0;
_nop();
_nop();
_nop();
_nop();
P3_4=1;
}
void InitializeTimer0(void) //初 始 化 定 时 器0提供不同的定时常数,
{ //timer0 for different timerconst needed.
TR0=0;
TMOD=0x21; //timer1 used mode 2 and timer0 used mode 1
TH0=0xf8; //1ms=(1/22.1184MHz * 12 * (65536-X)>>X=65536-22118.4/12=0xF8CC
TL0=0xcc; //10ms's timer const: >>X=65536-10*22118.4/12
}
_interrupt (1) _using (1) void TimerZero(void)//定时器0溢出中断函数 1毫秒中断1次
{
TL0=0xcc;//10ms's timer const:
TH0=0xf8;//1ms=(1/22.1184MHz * 12 * (65536-X)
timer080ms++; //used for 485-com too long judgement for a data-frame
timer0Wait100ms++;
timer010ms++;
timer0a150ms++;
timer0b15ms++; //used for 15ms time
//timer05s++;
if(timer010ms>=0x0a) //10毫秒定时到
{
timer010ms=0x00;
timer020ms++;
if(timer020ms==2){timer020ms=0;bitflag20ms=1;}
timer050ms++;
if(timer050ms>=0x05) //50毫秒定时到
{
timer050ms=0x00;
timer0100ms++;
bitflag50ms=1;
if(timer0100ms>=0x02) //100毫秒定时到
{
timer0100ms=0x00;
timer0300ms++;
bitflag100ms=1;
if(timer0300ms>=0x03)//200ms
{
timer0300ms=0x00;
bitflag300ms=1;
}
timer0500ms++;
if(timer0500ms>=0x05)//500毫秒定时到
{
timer0500ms=0x00;
bitflag500ms=1;
timer01s++;
if(timer01s>=0x02)//1秒定时到
{
timer01s=0x00;
bitflag1s=1;
timer05s++;
if(timer05s>=0x05)//5秒定时到
{timer05s=0x00;
bitflag5s=1;
timer50s++;
}
}
}
}
}
}
}
//void _interrupt (3) T1int(void)
//{;}
//void _interrupt (5) T2int(void)
//{;}
//_interrupt (6) void PowerFail(void)
//{;}
//_interrupt (8) void Ex2Interrupt(void)
//{;}
//_interrupt (9) void Ex3Interrupt(void)
//{;}
//_interrupt (10) void Ex4Interrupt(void)
//{;}
//_interrupt (11) void Ex5Interrupt(void)
//{;}
//_interrupt (12) void WatchDogInterrupt(void)
//{;}
/**********************************************************************
* RS485 PROGRAM *
* *
**********************************************************************/
void InitializeTimer2(void) //初 始 化 定 时 器 2 as buadrate for _485_com0
{ //T2CON(when RCLK,TCLK was set 1 means buadrate_timerConstReload mode)
TR2=0;
T2CON=0x30; //65536-x=11.0592*10^6/12/32/28800=>x=0xfffa(use timer1 12was divide)
TL2=0xe8;/*0xdc*///0xf4/*28800b/s*/; //t2 reload timerconst as 9600(28.8k)bit/s//when usetimer2 divideby 2
TH2=0xff; //
RCAP2L=0xe8;/*0xdc*///0xf4/*28800b/s*/; //x=65536-11.0592M/9600/32=0xffdc//timer2 is differentfromtimer1
RCAP2H=0xff; //x=65536-11.0592M/28800/32=0xfff4//timer2 is differentfromtimer1
//x=65536-22.1184M/28800/32=0xffe8 最后改为22.1184M
// TR2=1;
}
void InitializeRXDTXDCom0(void) //could use timer1 or timer2 as buadrateg//use timer2 as baudrate
{ //timer2为波特率发生器,初始化为通讯口0为485的接收状态(接收地址)
ES0=0;
T2CON=0x30; //in the 80c320,SerialPort0 could use Timer2 or Timer1 as Baudrate generator.
//when used timer2 as BD_rate, a control command should used.
PCON=PCON & 0x7f; //set SMOD=0//baudrate normal or baudrate double (0/1);
SCON=0xf0; //SCON=11110000B;//set Serial port0 in mode 3,SM2=1,REN=1;Judgement the address;(mode2/3 in 11 bit)
//SCON=0x70;/*debug*/
bitflagCom0AD=1; //recieve state should to know it is ad or not// set the data_ad flag.
//bitflagCom0ing=0; //set the s0by.//Com_state flag//was now recieving!!
P1_0=1;
TR2=1; //but the new com_port (com1)could only use Timer1 as Baudrate generator.
ES0=1;
//GLOBAL VARIABLE INITIALIZE
rx485count=0;
}
/**********************************************************************
*RXDTXD485()--485 port rx interrupt routine
*/
_interrupt (4) void RXDTXD485(void) //串行口0中断函数 //for EKE_CPU
{
unsigned char data rxchar=0;
uchar data i=0;
uchar data sum=0;
if(RI)
{
RI=0;
rxchar=SBUF;
if(bitflagCom0AD)/*Address information*/
{
if(rxchar==0x4d)
{
rxbuf485[0]=rxchar;
SCON=0xd0;
rx485count=1;
bitflagCom0AD=0;
}
}
else
{
if((rx485count<RXBUF485MAX))
{
// Watchdog();
rxbuf485[rx485count]=rxchar;
rx485count++;
}
if((rx485count>=RXBUF485MAX))
{
Watchdog();
InitializeRXDTXDCom0();
}
for(i=0;i<RXBUF485MAX;i++)
{
sum+=rxbuf485[i];//rxPrcs485[i];
}
if(sum==0)
{
bitFrmCmpl485=1;
}
}
}
/*if(TI)
{
TI=0;
}*/
}
///*************************************************************
// * rx485Manage()--manage the rx information from RS485
// */
//void rx485Manage(void)
// {
// uchar data i;
// for(i=0;i<RXBUF485MAX;i++)
// {
// rxPrcs485[i]=rxbuf485[i];
// }
//
//// if((rxPrcs485[11]&0x02)==0x02)//GSTEIN
//// {
//// if(bitflag5s)
//// {
//// bitflag5s=0;
//// if((rxPrcs485[11]&0x02)==0x02)//GSTEIN
//// {
//// GSTEIN=0x02;
//// }
//// }
//// }
//// else//if((rxPrcs485[11]&0x02)==0x00)// not GSTEIN
//// {
//// GSTEIN=0x00;
//// }
//// if((rxPrcs485[11]&0x01)==0x01)//start required TCS连接
//// { bitflagb1=1;
//// }
//// else//if((rxPrcs485[11]&0x01)==0x00)//start required TCS不连接
//// { bitflagb1=0;
//// }
//
// }
/*************************************************************
*enable485Send()--
*/
void enable485Send(void)
{
REN=0;/*Disable 485 receiver*/
P1_0=0;/*enable 485 send*/
}
/**************************************************************
* rs485send()--485 port send frame to EKE_CPU. The frame data
* get from 422 port rx.The byte number of data is
* TXBUF485MAX.
*/
void rs485send(void)
{
uchar data i;
uchar data sum=0x4d;
/*caculate the checksum*/
txbuf485[TXBUF485MAX-1]=0;
for(i=0;i<TXBUF485MAX;i++)
{
sum+=txbuf485[i];
}
txbuf485[TXBUF485MAX-1]=0-sum;
SCON|=0x08;
SBUF=0x4d;
while(!TI) _nop();
TI=0;
SCON&=0xF7;/*CLEAR TB8,ADDRESS BIT IS 0*/
for(i=0;i<TXBUF485MAX;i++)
{
SBUF=txbuf485[i];
while(!TI) _nop();
TI=0;
}
P1_0=1;//disable sending
REN=1;//enable receiver
Watchdog();
InitializeRXDTXDCom0();
}
/*************************************************************************
* RS422 PROGRAM *
* *
*************************************************************************/
void InitializeRXDTXDCom1(void)//set the communication_1 for TAX2/FHQ/GPS_com_perhaps or jktax2_485 or fhq
{ //the only timer1 could be used as a baudrate generator!!!
ES1=0;
TR1=0;
TMOD=0x21; //timer1 used mode 2 and timer0 used mode 1
TL1=0xfd;//ff //timer1 used mode 2 as reload mode used for baudrate for com1 Com with ? later
TH1=0xfd;//ff //buadrate is 38.4K //as timer2 for com0
TR1=1; //x=256-fosc/12/16/baud(smod=1)
SCON1=0x50; //the serial port 1 for?//1111.0000 mode 1 & SM2=1
WDCON=WDCON|0x80;//SMOD=1波特率加倍
ES1=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -