#include "p18f258.inc"
#include "CAN18xx8.inc"
; oscillator selection
CONFIG OSC = HS
#define TX_TEST
#define RX_TEST
UDATA
CANDt1 RES 02
Tmp equ 0xff
#ifdef RX_TEST
RxMsgID RES 04
RxData RES 08
RxDtLngth RES 01
RxFlag RES 01
RxFilterMatch RES 01
#endif
;***********************************************
; DEFINICION DE BLOQUE
;***********************************************
cblock 0x000
salto
endc
Sta CODE 0x00
bra Main
;************INTERRUPCIONES DE ALTA PRIORIDAD************
IHP CODE 0x08
GOTO INTER0
;#ifndef CANIntLowPrior
; call CANISR ;Call CAN Interrupt Service routine
;#endif
; btfss INTCON,INT0IF ;revisa int0
; goto EXITIH ;SI NO ES INT0 SALIR
; goto INTER0 ;ATENCION INT0
;EXITIH
; BCF PIR3,0
; retfie FAST
;************INTERRUPCIONES DE BAJA PRIORIDAD*************
IHL CODE 0x018
#ifdef CANIntLowPrior
movwf W_IL ;Save W
movff STATUS,STAT_IL ;Save STATUS
movff BSR,BSR_IL ;Save BSR
call CANISR ;Call CAN Interrupt Service routine
movff BSR_IL,BSR ;Restore BSR
movff STAT_IL,STATUS ;Restore Status
movf W_IL,W ;Restore W reg
;return
#endif
btfss INTCON3,0 ;REVISA INT1
goto EXITIL ;SI NO ES INT1 SALIR
goto INTER1 ;ATENCION INT1
EXITIL:
BCF INTCON3,0
retfie FAST
Test1 CODE
Main:
;Define TRIS bits to define CANRx pin as i/p and CANTx pin as o/p
;Configuracion de los Puertos del PIC
;**********************PUERTO A*******************************
CLRF PORTA ;CONFIGURA PORT A COMO SALIDA DIGITAL
; Puerto A SALIDA RA0
movlw 0x07
iorwf ADCON1,f
CLRF TRISA ;
BSF PORTA,0 ; apaga salidas
;**********************PUERTO B*******************************
CLRF PORTB
MOVLW B'00001011' ; Puerto B con entradas RB0, RB1
MOVWF TRISB ; configura R2 y R3 para TX y RX del CAN
; el resto salidas
;**********************PUERTO C*******************************
CLRF PORTC ; Puerto C completo como SALIDAS
MOVLW 0x00
MOVWF TRISC
;************** Configurando Interrupciones **************
bsf RCON, IPEN ; habilita prioridad de interrupcion
;bsf INTCON, GIEH ; habilita prioridad alta
movlw B'11010000' ;
movwf INTCON
movlw B'00000000' ; habilita interrupcion en flanco de bajada
movwf INTCON2 ; habilita interrupcion en flanco de bajada
movlw B'00001000' ; habilita prioridad BAJA para int1
movwf INTCON3 ; tambien habilita interrupcion 1
;SETF PIE3 ; HABILITA TODAS LAS INTERRUPCIONES DEL CAN
;setf IPR3 ; Interrupciones CAN todas en High Priority
;CLRF PIR3
;***************** CONFIGURACION DEL PROTOCOLO CAN****************
;configuracion inicial 125kbps@20MHz all valid messages
CANInitialize 1, 0A, 3, 3, 1,CAN_CONFIG_ALL_VALID_MSG
;goto RcvMsg
;Set Loop-back mode for testing in Stand alone mode
; CANSetOperationMode CAN_OP_MODE_LOOP ;Loop back mode
#ifdef RX_TEST
;Set configuration mode
CANSetOperationMode CAN_OP_MODE_CONFIG ;
;Following settings will ensure only following messages in Buf 0
; 0x25 and 0x125 (Filter Hit 0)
; 0x36 and 0x136 (Filter Hit 1)
;Set Mask B0 to 0xfffffeff
CANSetReg CAN_MASK_B0, 0xfffffeff, CAN_CONFIG_XTD_MSG
;Set Filer 0 with 0x25
CANSetReg CAN_FILTER_B0_F1, 0x025, CAN_CONFIG_XTD_MSG
;Set Filer 1 with 0x36
CANSetReg CAN_FILTER_B0_F2, 0x036, CAN_CONFIG_XTD_MSG
;Following settings will ensure only following messages in Buf 1
; 0x08,0x88, 0x1000008, 0x1000088 (Filter Hit 2)
; 0x06,0x86, 0x1000006, 0x1000086 (Filter Hit 3)
; 0x02,0x82, 0x1000002, 0x1000082 (Filter Hit 4)
; 0x01,0x81, 0x1000001, 0x1000081 (Filter Hit 5)
;Set Mask B1 to 0xfeffff7f
CANSetReg CAN_MASK_B1,0xfeffff7f, CAN_CONFIG_XTD_MSG
;Set Filer 2 with 0x08
CANSetReg CAN_FILTER_B1_F1,0x08, CAN_CONFIG_XTD_MSG
;Set Filer 3 with 0x05
CANSetReg CAN_FILTER_B1_F2,0x06, CAN_CONFIG_XTD_MSG
;Set Filer 4 with 0x02
CANSetReg CAN_FILTER_B1_F3,0x02, CAN_CONFIG_XTD_MSG
;Set Filer 5 with 0x01
CANSetReg CAN_FILTER_B1_F4,0x01, CAN_CONFIG_XTD_MSG
; Restore to Normal mode.
CANSetOperationMode CAN_OP_MODE_NORMAL ;
#endif
GOTO RcvMsg
;LAZO:
#ifdef TX_TEST
;-------------------------------
;Message 1, Data 01,02, ID 20
Msg1Agn:
movlw low(CANDt1)
movwf FSR0L
movlw high(CANDt1)
movwf FSR0H
movlw 0x01
movwf POSTINC0
movlw 0x02
movwf POSTINC0
CANSendMessage 0x20,CANDt1,2,CAN_TX_XTD_FRAME
addlw 0x00 ;Check for return value of 0 in W
bz Msg1Agn ;Buffer Full, Try again
;-------------------------------
;-------------------------------
;Message 2, Data 03,04, ID 30
Msg2Agn:
movlw low(CANDt1)
movwf FSR0L
movlw high(CANDt1)
movwf FSR0H
movlw 0x03
movwf POSTINC0
movlw 0x04
movwf POSTINC0
movlw 0xaa
movwf POSTINC0
movlw 0xbb
movwf POSTINC0
CANSendMessage 0x31,CANDt1,4,CAN_TX_XTD_FRAME
addlw 0x00 ;Check for return value of 0 in W
bz Msg2Agn ;Buffer Full, Try again
;-------------------------------
;-------------------------------
;Message 3, Data 05,06, ID 15
Msg3Agn:
movlw low(CANDt1)
movwf FSR0L
movlw high(CANDt1)
movwf FSR0H
movlw 0x05
movwf POSTINC0
movlw 0x06
movwf POSTINC0
CANSendMessage 0x1,CANDt1,2,CAN_TX_XTD_FRAME
addlw 0x00 ;Check for return value of 0 in W
bz Msg3Agn ;Buffer Full, Try again
;-------------------------------
;-------------------------------
;Message 4, Data 07,08, ID 05
Msg4Agn:
movlw low(CANDt1)
movwf FSR0L
movlw high(CANDt1)
movwf FSR0H
movlw 0x07
movwf POSTINC0
movlw 0x08
movwf POSTINC0
CANSendMessage 0x02,CANDt1,2,CAN_TX_XTD_FRAME
addlw 0x00 ;Check for return value of 0 in W
bz Msg4Agn ;Buffer Full, Try again
;-------------------------------
;-------------------------------
;Message 5, Data 09,0A, ID 10
Msg5Agn:
movlw low(CANDt1)
movwf FSR0L
movlw high(CANDt1)
movwf FSR0H
movlw 0x09
movwf POSTINC0
movlw 0x0A
movwf POSTINC0
CANSendMessage 0x3,CANDt1,2,CAN_TX_XTD_FRAME
addlw 0x00 ;Check for return value of 0 in W
bz Msg5Agn ;Buffer Full, Try again
;------------------------------
;-------------------------------
;Message 6, Data 0B,0C, ID 15
Msg6Agn:
movlw low(CANDt1)
movwf FSR0L
movlw high(CANDt1)
movwf FSR0H
movlw 0x0B
movwf POSTINC0
movlw 0x0C
movwf POSTINC0
CANSendMessage 0x4,CANDt1,2,CAN_TX_XTD_FRAME
addlw 0x00 ;Check for return value of 0 in W
bz Msg6Agn ;Buffer Full, Try again
;-------------------------------
;-------------------------------
;Message 7, Data 0D,0E, ID 20
Msg7Agn:
movlw low(CANDt1)
movwf FSR0L
movlw high(CANDt1)
movwf FSR0H
movlw 0x0D
movwf POSTINC0
movlw 0x0E
movwf POSTINC0
CANSendMessage 0x20,CANDt1,2,CAN_TX_XTD_FRAME
addlw 0x00 ;Check for return value of 0 in W
bz Msg7Agn ;Buffer Full, Try again
;-------------------------------
;-------------------------------
;Message 8, Data 0F,10, ID 05
Msg8Agn:
movlw low(CANDt1)
movwf FSR0L
movlw high(CANDt1)
movwf FSR0H
movlw 0x0F
movwf POSTINC0
movlw 0x10
movwf POSTINC0
CANSendMessage 0x05,CANDt1,2,CAN_TX_XTD_FRAME
addlw 0x00 ;Check for return value of 0 in W
bz Msg8Agn ;Buffer Full, Try again
;-------------------------------
#endif
;GOTO LAZO
; CANAbortAll ;Use to abort transmission of all messages.
; CANGetTxErrorCount ;Get Tx Error count
; CANGetRxErrorCount ;Get Rx Error count
RcvMsg:
Loop:
;call CANIsRxReady ;verifica si hay un mensaje
;bnc Loop
;nop
;#ifdef RX_TEST
CANReadMessage RxMsgID, RxData, RxDtLngth, RxFlag
;movlw 0x01
xorlw 0x01
bnz Loop
incf PORTC
bcf TRISA,RA0 ;enciende el pin0 puerto A para mostrar que
;se recibio un mensaje
BRA Loop
; revisa que tipo de mensaje recibio
banksel RxFlag
btfsc RxFlag,CAN_RX_OVERFLOW_BIT_NO
bra RxOvrFlow ;Branch to Logic for Rx
;overflow occurred.
btfsc RxFlag,CAN_RX_INVALID_MSG_BIT_NO
bra RxInvldMsg ;Branch to Logic for Invalid
;Message received
btfsc RxFlag,CAN_RX_XTD_FRAME_BIT_NO
bra RxExtMsg ;Logic for Extended frame
;received
bra RxStdMsg ;Else logic for standard
;frame received
btfsc RxFlag,CAN_RX_RTR_FRAME_BIT_NO
bra RxRTRFrame ;Branch to Logic for RTR
;frame received
nop ;Regular frame received
movlw CAN_RX_FILTER_BITS
andwf RxFlag,W
movwf RxFilterMatch ;Save matched Filter ;number
;aqui trato a mensajes con un filtro determinado
CLRF PORTC
BSF PORTC,5
goto Loop
RxOvrFlow: ;trato de sobre flujo
clrf PORTC
bsf PORTC,0
goto Loop
RxInvldMsg: ;trato a mensajes invalidos
CLRF PORTC
BSF PORTC,1
goto Loop
RxExtMsg: ;trato a mensajes ID EXTENDIDO
CLRF PORTC
BSF PORTC,2
movlw low(RxData) ;Direcciona el inicio de los datos a chequear
movwf FSR0L
movlw high(RxData)
movwf FSR0H
banksel RxDtLngth
movf RxDtLngth,w ;longitud de datos que se recibieron
lazo2:
movff POSTINC0,PORTC
infinito:
btfsc Tmp,1 ;variable de control
goto infinito
BCF PORTA,0
decfsz WREG
bra lazo2
bra Loop
RxStdMsg: ;trato a mensajes ID STANDAR
CLRF PORTC
BSF PORTC,3
movlw 0xff
goto Loop
RxRTRFrame: ;trato a mensajes RTR
CLRF PORTC
BSF PORTC,4
GOTO Loop
;*******************************************************
;
; This procedure copy the coming information
; recived in NewMessData
;
;*******************************************************
;COPYvalFun
; movlw low(NewMessageData)
; movwf FSR0L
; movlw high(NewMessageData)
; movwf FSR0H
; banksel TempCommand
; movff POSTINC0,TempCommand
; banksel TempAdd
; movff POSTINC0,TempAdd
; banksel TempComp
; movff POSTINC0,TempComp
; banksel TempData
; movff POSTINC0,TempData
; movff POSTINC0,TempData+1
; movff POSTINC0,TempData+2
; movff POSTINC0,TempData+3
; return
;Message Recd. Successfully
; RxMsgID = 32 bit ID
; RxData = Received Data Buffer
; RxDtLngth = Length f Received data
; RxFlag = Flag of CAN_RX_MSG_FLAGS type, Use it for Message
; information
final:
nop
;#endif
bra Loop
;********************************************************
; atencion a interrupcion ALTA PRIORIDAD
;********************************************************
INTER0: ;ATENCION INT0 ALTA PRIORIDAD
#ifndef CANIntLowPrior
call CANISR ;Call CAN Interrupt Service routine
#endif
btfss INTCON,INT0IF ;revisa int0
goto EXITIH ;SI NO ES INT0 SALIR
goto INTERA ;ATENCION INT0
EXITIH
BCF PIR3,0
GOTO SALIR
INTERA:
bcf INTCON,INT0IF ;LIMPIA BANDERA DE INTERRUPCION 0
BSF PORTA,0 ;ENCIENDE LED INTERRUPCION OCURRIO
;setf PORTC
CLRF PORTC ;limpia puerto c
BCF Tmp,1 ;limpia bandera de control
SALIR:
RETFIE FAST
INTER1: ;ATENCION INT1 BAJA PRIORIDAD
BCF INTCON3,0 ;LIMPIA BANDERA DE INTERRUPCION
BSF PORTA,0
MOVLW 0xf0
movwf PORTC
retfie FAST
END