新會員
Joined
: 2006/4/21 14:09 最後登入時間
: 2006/4/22 18:06
Group:
註冊會員
Level : 1 HP : 0 / 0 MP : 0 / 36 EXP : 2
|
大家好: 我這邊有一個奇怪的問題想請問大家 我是使用APP001的版子, 上面有PIC18F458, 我現在有兩塊APP001, 我曾上過CAN202的課程, 我使用的code是課程裡面的範例程式 ex3.cpp, code大致如下:
#include <p18f458.h> #include "CAN18XX8.h" #include "WAP_LCD.H" #include <stdlib.h>
void Delay_100(void) ;
char Temp_ASCII[10] ;
union { unsigned char Bytes[2] ; unsigned int Word ; } AD_ALL ;
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 0x110 #define RX_Filter0 0x120 #define RX_Filter1 0x00 #define RX_Filter2 0x00 #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 ; 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("FL= IN= ") ; LCD_Set_Cursor(0,1) ; putrsLCD("ID= AD= ") ; itoa ( MESSAGE_ID1 ,Temp_ASCII ) ; LCD_Set_Cursor(3,1) ; putsLCD(Temp_ASCII ) ; itoa (RX_Filter0,Temp_ASCII ) ; LCD_Set_Cursor(3,0) ; putsLCD(Temp_ASCII ) ;
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, 0x7ff, CAN_CONFIG_STD_MSG ) ; // Set Mask For Standard Data Frame CANSetMask(CAN_MASK_B2, 0x7ff, CAN_CONFIG_STD_MSG ) ; CANSetFilter(CAN_FILTER_B1_F1, RX_Filter0 , CAN_CONFIG_STD_MSG) ; CANSetFilter(CAN_FILTER_B1_F2, 0x00000000 , CAN_CONFIG_STD_MSG) ; CANSetFilter(CAN_FILTER_B2_F1, 0x00000000 , CAN_CONFIG_STD_MSG) ; CANSetFilter(CAN_FILTER_B2_F2, 0x00000000 , CAN_CONFIG_STD_MSG) ; CANSetFilter(CAN_FILTER_B2_F3, 0x00000000 , CAN_CONFIG_STD_MSG) ; CANSetFilter(CAN_FILTER_B2_F4, 0x00000000 , 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() ; // if ( CANIsTxReady( ) ) // { CANSendMessage( MESSAGE_ID1 ,TX_Data_Buf1,5,CAN_TX_PRIORITY_0 & CAN_TX_STD_FRAME & CAN_TX_NO_RTR_FRAME ) ; // } ADCON0bits.GO = 1 ; while ( ADCON0bits.GO) ; TX_Data_Buf1[3] = ADRESH ; TX_Data_Buf1[4] = ADRESL ; LCD_Set_Cursor(12,1) ; putrsLCD(" ") ; LCD_Set_Cursor(12,1) ; AD_ALL.Bytes[0] = ADRESL ; AD_ALL.Bytes[1] = ADRESH ; itoa ( AD_ALL.Word , Temp_ASCII ) ; putsLCD( Temp_ASCII ) ;
if ( CANIsRxReady( ) )
{ CANReceiveMessage(&RX_ID1,RX_Data_Buf1,&RX_Data_Len1,&RX1_Message_Flag ) ;
AD_ALL.Bytes[1] = RX_Data_Buf1[3] ; // ADRESH AD_ALL.Bytes[0] = RX_Data_Buf1[4] ; // ADRESL LCD_Set_Cursor(12,0) ; puthexLCD(RX_Data_Buf1[3]) ; puthexLCD(RX_Data_Buf1[4]) ;
LATD = AD_ALL.Word >> 2 ; } } }
void Delay_100(void) { int X1 ;
for (X1 = 0 ; X1 < 10000 ; X1 ++ ) ;
}
#pragma interrupt isr_high // save = PRODL,PRODH,FSR0L,FSR0H #pragma interruptlow isr_low // save = WREG,STATUS,BSR,PRODL,PRODH,FSR0L,FSR0H
#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
#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
void isr_high(void) { } void isr_low(void) { }
====================== 我是使用program燒錄進去 我兩塊APP001都是使用這code, 差別只在於其中一塊 的MESSAGE_ID1 為0x110, RX_Filter0為0x120 另一塊MESSAGE_ID1為0x120 也就是我0x120是用來傳輸的, 0x110是來街收的, 但是結果是: 0x110收不到0x120傳來的訊息,
而如果我將mode由CAN_OP_MODE_NORMAL改為 CAN_OP_MODE_LOOP, 則能收到自己looback的訊息
請問是怎麼回事呢, 謝謝大家解答!
還是APP001上的Jump要設定什麼呢?
發表於: 2006/4/21 14:33
|