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

📄 ex6.c

📁 一个CAN学习程序
💻 C
字号:


#include <p18f458.h>			// p18cxxx.h must have current processor
#include "CAN18XX8.h"		// Purpose of using AN738 Subroutine !!
#include "WAP_LCD.H"	
#include <stdlib.h>

	
void 		Delay_100(void) ;
void		Delay_10(void) ;
void		Show_Word_Hex ( unsigned char , unsigned char  , int ) ;

char 	Temp_ASCII[10] ;
char	WaitOnBus ;

union
	{
		unsigned char	Bytes[2] ;
		unsigned int		Word ;	
	}     AD_ALL ;

union
	{
		unsigned char	Bytes[2] ;
		unsigned int		Word ;	
	}     Int2Byte ;

	unsigned char 	Var1,Var2 ;

	unsigned long	TX_ID1 ;
	BYTE			TX_Data_Buf1[8] ;

	unsigned long	RX_ID1 ;
	BYTE			RX_Data_Buf1[8] ;
	BYTE			RX_Data_Len1	;
	enum 			CAN_RX_MSG_FLAGS	RX1_Message_Flag ; 	

	unsigned long	RX_ID2 ;
	BYTE			RX_Data_Buf2[8] ;
	BYTE			RX_Data_Len2	;
	enum 			CAN_RX_MSG_FLAGS	RX2_Message_Flag ; 			

#define 			OUTGOING_ID		0X210 
#define			INCOMING_ID 		0X200

#define			MESSAGE_ID1			0x100
#define			RX_Filter0			0x81
#define			RX_Filter1			0x00
#define			RX_Filter2			0x100
#define			RX_Filter3			0x00
#define			RX_Filter4			0x00
#define			RX_Filter5			0x00
#define			RXB0_MASK		0x7ff
#define			RXB1_MASK		0x7ff

void main( void )
{

	PORTD = 	0x00 ;	
	TRISD =  	0x00 ;
	LATD = 	0x00 ;
	TRISBbits.TRISB2 = 0 ;			// CANTX
	TRISBbits.TRISB3 = 1 ;			// CANRX
	
	CMCON = 0b00000111 ;			//  Disable Comparator Module 
	ADCON0 = 0b10000001 ;			//  Initial ADCON0 for A/D Module 
	ADCON1bits.ADFM = 1 ;		//  Right Justified !!

	
		OpenLCD( ) ;
	
		Delay_100( ) ;
		
		putrsLCD("FL0=     IN=        ") ;
		LCD_Set_Cursor(0,1) ;
		putrsLCD("ID1=     AD=      ") ;

		Show_Word_Hex( 4,0,(int)RX_Filter0 ) ;
		Show_Word_Hex( 4,1,(int)MESSAGE_ID1) ;
		
	//
	// Initialize CAN Communication Module !!
	// The Sequence of Parameter is SJW,BRP,PHASEG1,PHASEG2,PROPSEG, Mode !!
	//
	
	CANInitialize(    2,8,3,3,1,		CAN_CONFIG_LINE_FILTER_OFF & 
									CAN_CONFIG_SAMPLE_ONCE & 
									CAN_CONFIG_VALID_STD_MSG &
									CAN_CONFIG_PHSEG2_PRG_ON ) ;

	CANSetOperationMode(CAN_OP_MODE_CONFIG) ;

	CANSetMask(CAN_MASK_B1, RXB0_MASK, CAN_CONFIG_STD_MSG ) ;	// Set Mask For Standard Data Frame 
	CANSetMask(CAN_MASK_B2, RXB1_MASK, CAN_CONFIG_STD_MSG ) ;
	
	CANSetFilter(CAN_FILTER_B1_F1, RX_Filter0  , CAN_CONFIG_STD_MSG) ;
	CANSetFilter(CAN_FILTER_B1_F2, RX_Filter1  , CAN_CONFIG_STD_MSG) ;
	CANSetFilter(CAN_FILTER_B2_F1, RX_Filter2 , CAN_CONFIG_STD_MSG) ;
	CANSetFilter(CAN_FILTER_B2_F2, RX_Filter3  , CAN_CONFIG_STD_MSG) ;
	CANSetFilter(CAN_FILTER_B2_F3, RX_Filter4  , CAN_CONFIG_STD_MSG) ;
	CANSetFilter(CAN_FILTER_B2_F4, RX_Filter5  , CAN_CONFIG_STD_MSG) ;


	CANSetOperationMode(CAN_OP_MODE_NORMAL) ;

	TX_Data_Buf1[0] = 0x01 ;
	TX_Data_Buf1[1] = 0x02 ;
	TX_Data_Buf1[2] = 0x03 ;
	TX_Data_Buf1[3] = 0x04 ;
	TX_Data_Buf1[4] = 0x05 ;

	while (1)
	{

		Delay_100( ) ;

				ADCON0bits.GO = 1 ;
		
				while ( ADCON0bits.GO) ;
		
				TX_Data_Buf1[3]  = 		ADRESL;
				TX_Data_Buf1[4]  =  	ADRESH ;
				AD_ALL.Bytes[0] = 		TX_Data_Buf1[3] ;
				AD_ALL.Bytes[1] = 		TX_Data_Buf1[4] ;

				Show_Word_Hex( 12, 1, AD_ALL.Word ) ;

				LATD = AD_ALL.Word >> 2 ;
	
		//	************************************************************
		// 	RX_Filter2 contain the filter condition for "Remote Transfer Request"
		//	************************************************************
		if ( CANIsRxReady( ) )
		{
			CANReceiveMessage(&RX_ID1,RX_Data_Buf1,&RX_Data_Len1,&RX1_Message_Flag ) ;
			if ( (RX_ID1 == RX_Filter2) &&  ( RX1_Message_Flag & CAN_RX_RTR_FRAME) )
			
			{


				CANSendMessage(	MESSAGE_ID1 ,TX_Data_Buf1,5,CAN_TX_PRIORITY_0 &
									CAN_TX_STD_FRAME &
									CAN_TX_NO_RTR_FRAME ) ;

				}		// 	End of if ( ( RX_ID1 .............................................
	
		}				// 	End of if ( CANIsRxReady( ) )
		
	}					// 	End of while(1) 
	
}

void		Show_Word_Hex ( unsigned char CurX , unsigned char CurY , int Word_Value)
{
			LCD_Set_Cursor(CurX,CurY) ;
				putrsLCD("    ") ;
					LCD_Set_Cursor(CurX,CurY) ;
					Int2Byte.Word = Word_Value ;
				puthexLCD( Int2Byte.Bytes[1]) ;
			puthexLCD( Int2Byte.Bytes[0]) ;
}

void Delay_100(void)
{
	int  X1 ;

	for (X1 = 0 ; X1 < 10000 ; X1 ++ ) ;

}

void Delay_10(void)
{
	int  X1 ;

	for (X1 = 0 ; X1 < 100 ; X1 ++ ) ;

}

//************************************************
//*       #pragma Interrupt Declarations         *
//************************************************
#pragma interrupt isr_high 		//	save = PRODL,PRODH,FSR0L,FSR0H
#pragma interruptlow isr_low 		//	save = WREG,STATUS,BSR,PRODL,PRODH,FSR0L,FSR0H

//************************************************
//* Function: isr_high_direct                    *
//*   - Direct execution to the actual           *
//*     high-priority interrupt code.            *
//************************************************
#pragma code isrhighcode = 0x0000008

void isr_high_direct(void)	
{  
   //***EXERCISE 2 CODE HERE***
                         										
     _asm 		//begin in-line assembly
     goto isr_high	//go to isr_high function
     _endasm 		//end in-line assembly
}

#pragma code


//************************************************
//* Function: isr_low_direct                     *
//*   - Direct execution to the actual           *
//*     low-priority interrupt code.             *
//************************************************
#pragma code isrlowcode = 0x0000018

void isr_low_direct(void)
{  
   //***EXERCISE 2 CODE HERE***
                        										
     _asm 		//begin in-line assembly
     goto isr_low	//go to isr_high function
     _endasm		//end in-line assembly
}
#pragma code


//************************************************
//* Function: isr_high(void)                     *     
//*   High priority interrupt will               *
//************************************************
void isr_high(void)
{
 
}									


//************************************************
//* Function: isr_low(void)                      *
//*   Low priority interrupt will                *
//*   - Check cause of interrupt and             *
//************************************************
void isr_low(void)
{
 
}				


⌨️ 快捷键说明

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