⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tangshants040611.c

📁 通过CAN总线,按内燃液传摆式动车组网络CAN总线通信协议与ECM通信 2. 通过RS485总线,按EKE机箱CPU的RS485协议议与EKE机箱CPU通信 3. 通过RS422总线,按ES
💻 C
📖 第 1 页 / 共 3 页
字号:
			{      
			       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 + -