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

📄 canuser.c

📁 用PIC18F2580完成A/D采集,CAN总线数据读取
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "includes.h"

#define CAN_R_CONFIG       0                //读配置
#define CAN_W_CONFIG       1				//写配置
#define CAN_R_FIXED_VALUE  2				//读定值
#define CAN_W_FIXED_VALUE  3				//写定值
#define CAN_R_ANALOG       4				//读模拟量
#define CAN_R_DIGITAL      5				//读数字量
#define CAN_W_CONTROL      6				//写控制量

unsigned char ComRxBuffer[COM_RX_SIZE];
WORD ComTxBuffer[COM_TX_SIZE];
unsigned int Cell[15],
             Temp[8];
unsigned int MAX_VOL,
			 MIN_VOL,
			 C_K_VOL,
			 T_K_VO1,
			 T_K_VO2,
			 HI_TEMP,
			 LO_TEMP;
unsigned int Temperature0,
			 Temperature1,
			 Tempervoltage0,
			 Tempervoltage1,
			 EVTemperature;
/*********************************************************************
 * Function:        void CanSendAnalog(void)
 *
 * PreCondition:     
 *
 * Input:       	none
 *                  
 * Output:      	none
 *
 * Side Effects:  		
 *
 * Overview:        Send the collect data to the top computer.
 *					
 * Note:          	Data include voltage and temperature.
 ********************************************************************/
void CanSendAnalog(void)
{
	unsigned char i;
    for(i=0;i<5;i++)
	{
		while(CANIsTxRdy() == 0);
		//CANPutTxPRI(3);							//Send Priority highest
		//EXIDE is clr in TXB0SIDL.EXIDE			//帧格式 =0标准帧; =1扩展帧;
		//TXRTR is clr in CANPutTxCnt(8);			//帧类型 =0数据帧; =1远程帧;
		//CANPutTxCnt(8);							//数据长度 Data DLC
		CANPutTxCID(BoardAddress,CAN_R_ANALOG);		//CID 4
    	ComTxBuffer[0].bits.lbyte.L = i+1;			//数据包号
        ComTxBuffer[0].bits.hbyte.H = 7;			//总包数
		ComTxBuffer[1].W 			= Cell[i*3];
		ComTxBuffer[2].W 			= Cell[i*3+1];
		ComTxBuffer[3].W 			= Cell[i*3+2]; 
		CANPutTxDataTyp0(ComTxBuffer);  
		CANSend(1);    
	}	
	while(CANIsTxRdy() == 0);
	//CANPutTxPRI(3);								//Send Priority highest
	//EXIDE is clr in TXB0SIDL.EXIDE				//帧格式 =0标准帧; =1扩展帧;
	//TXRTR is clr in CANPutTxCnt(8);				//帧类型 =0数据帧; =1远程帧;
	//CANPutTxCnt(8);								//数据长度 Data DLC
	CANPutTxCID(BoardAddress,CAN_R_ANALOG);			//CID 4
    ComTxBuffer[0].bits.lbyte.L = 6;				//数据包号
    ComTxBuffer[0].bits.hbyte.H = 7;				//总包数
	ComTxBuffer[1].W 			= EVTemperature;  	//平均温度
	ComTxBuffer[2].W 			= Temperature0;     //温度0
	ComTxBuffer[3].W 			= Temperature1;     //温度1
	CANPutTxDataTyp0(ComTxBuffer);  
	CANSend(1);  
	while(CANIsTxRdy() == 0);
	//CANPutTxPRI(3);							    //Send Priority highest
	//EXIDE is clr in TXB0SIDL.EXIDE			    //帧格式 =0标准帧; =1扩展帧;
	//TXRTR is clr in CANPutTxCnt(8);			    //帧类型 =0数据帧; =1远程帧;
	//CANPutTxCnt(8);							    //数据长度 Data DLC
	CANPutTxCID(BoardAddress,CAN_R_ANALOG);         //CID
	ComTxBuffer[0].bits.lbyte.L = 7;			    //数据包号
    ComTxBuffer[0].bits.hbyte.H = 7;			    //总包数
	ComTxBuffer[1].W            = Tempervoltage0;	//1点温度对应电压值
	ComTxBuffer[2].W 			= Tempervoltage1;	//2点温度对应电压值
	ComTxBuffer[3].W 			= 0; 		        //无数据
	CANPutTxDataTyp0(ComTxBuffer);  
	CANSend(1); 
}
/*********************************************************************
 * Function:        void CanReciveConfig(void)
 *
 * PreCondition:   	Data should have been received prior to calling 
 *					this function; otherwise, it is likely the returned
 *					count is either not valid or associated to the 
 *					previous message. Use CANIsRxRdy() to determine if 
 *					data is available.  
 *
 * Input:       	none
 *                  
 * Output:      	none
 *
 * Side Effects:  		
 *
 * Overview:        Top computer configure the collect board address.
 *					
 * Note:          	
 ********************************************************************/
void CanReciveConfig(void)
{
    if(ComRxBuffer[0] != 0)			        	    //收到有校数据
	{		
        if((confaddress == 0))
        {                                           //55为默认地址
            BoardAddress = ComRxBuffer[2];          //address
            if(BoardAddress > 55 && BoardAddress < 61)
            {
				eeprom_write_byte(0x06,BoardAddress);
        		BoardAddress = eeprom_read_byte(0x06);
            }
		    else                                    //如果地址超出范围且不是默认地址配置则地址不变
			{
			 	BoardAddress = eeprom_read_byte(0x06);
			}
		}
	}
} 
/*********************************************************************
 * Function:        void CanSendConfig(void)
 *
 * PreCondition:    The configure message has received.  
 *
 * Input:       	none
 *                  
 * Output:      	none
 *
 * Side Effects:  		
 *
 * Overview:        Send the configure message to Top computer.
 *					
 * Note:          	
 ********************************************************************/
void CanSendConfig(void)
{
	while(CANIsTxRdy() == 0);
	//CANPutTxPRI(3);							//Send Priority highest
	//EXIDE is clr in TXB0SIDL.EXIDE			//帧格式 =0标准帧; =1扩展帧;
	//TXRTR is clr in CANPutTxCnt(8);			//帧类型 =0数据帧; =1远程帧;
	//CANPutTxCnt(8);							//数据长度 Data DLC
	CANPutTxCID(0x00,CAN_R_CONFIG);             //CID
    ComTxBuffer[0].bits.lbyte.L = 1;			//数据包号
    ComTxBuffer[0].bits.hbyte.H = 1;			//总包数
	ComTxBuffer[1].bits.lbyte.L = BoardAddress;	//巡检单元地址 55~60
	ComTxBuffer[1].bits.hbyte.H = 0;
	ComTxBuffer[2].W 			= 0;
	ComTxBuffer[3].W 			= 0; 
	CANPutTxDataTyp0(ComTxBuffer);  
	CANSend(1); 
}
///*********************************************************************
// * Function:        void CanReceiveFixedValue()	
// *
// * PreCondition:    The configure message has received.  
// *
// * Input:       	none
// *                  
// * Output:      	none
// *
// * Side Effects:  		
// *
// * Overview:        Configure the Cell protect message.
// *					
// * Note:          	
// ********************************************************************/
//void CanReceiveFixedValue(void)	
//{
//    if(ComRxBuffer[0] != 0)						 //收到有校数据
//	{
//		if(ComRxBuffer[0] == 1)
//		{
//			MAX_VOL = (ComRxBuffer[2]+((unsigned int)(ComRxBuffer[3])<<8));
//			MIN_VOL = (ComRxBuffer[4]+((unsigned int)(ComRxBuffer[5])<<8));
//			C_K_VOL = (ComRxBuffer[6]+((unsigned int)(ComRxBuffer[7])<<8));
//		}
//		if(ComRxBuffer[0] == 2)
//    	{
//			HI_TEMP = (ComRxBuffer[2]+((unsigned int)(ComRxBuffer[3])<<8));
//			LO_TEMP = (ComRxBuffer[4]+((unsigned int)(ComRxBuffer[5])<<8));
//		}
//	}
//}
/*********************************************************************
 * Function:        void CanReceiveFixedValue()	
 *
 * PreCondition:    The configure message has received.  
 *
 * Input:       	none
 *                  
 * Output:      	none
 *
 * Side Effects:  		
 *
 * Overview:        单体电池电压与两路温度系数
 *					
 * Note:          	
 ********************************************************************/
void CanReceiveFixedValue(void)	
{
    if(ComRxBuffer[0] != 0)						 //收到有校数据
	{
		T_K_VO1 = (ComRxBuffer[2]+((unsigned int)(ComRxBuffer[3])<<8));//1点温度系数
		if(T_K_VO1 > 6000 && T_K_VO1 <15000)
		{
			eeprom_write_word(8,T_K_VO1);
			T_K_VO1 = eeprom_read_word(8); 
		}
		else 
		{
			T_K_VO1 = eeprom_read_word(8);		
		}
		
		T_K_VO2 = (ComRxBuffer[4]+((unsigned int)(ComRxBuffer[5])<<8));//2点温度系数
		if(T_K_VO2 > 6000 && T_K_VO2 <15000)
		{		
			eeprom_write_word(10,T_K_VO2);	
			T_K_VO2 = eeprom_read_word(10);	
		}
		else
		{
			T_K_VO2 = eeprom_read_word(10);
		}
		C_K_VOL = (ComRxBuffer[6]+((unsigned int)(ComRxBuffer[7])<<8));//单只电压系数
		if(C_K_VOL > 6000 && C_K_VOL <15000)
		{
			eeprom_write_word(12,C_K_VOL);
			C_K_VOL = eeprom_read_word(12);	
		}
		else
		{
			C_K_VOL = eeprom_read_word(12);
		}			
	}
}
/*********************************************************************
 * Function:        CanSendFixedValue(void)
 *
 * PreCondition:    The configure message has received.  
 *
 * Input:       	none
 *                  
 * Output:      	none
 *
 * Side Effects:  		
 *
 * Overview:        Send the configure Cell protect message to the top
 *					computer.
 *					
 * Note:          	
 ********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -