; 	El siguiente programa configura al PIC18F258 para operar
;	en comunicacion CAN Bus con ID=0x001 para captura de datos que 
;	posteriormente son enviados al nodo 2.

	list p=18f258
	#include <p18F258.inc>
; oscillator selection 
	CONFIG	OSC = HS

;	Secccion de Memoria Reservada	
#DEFINE	NODO1_SOURCE
	
	#include "CAN18.inc"
	

	
NODO1 UDATA	
W_temp		res	01
Status_temp	res	01
BSR_temp	res	01
PRO_temp	res	01


	
	org	0x0000
	goto	Init
	
	org	0x0008
	goto	HighPINT
	
	org	0x0018
	goto	LowPINT


NODO1_SOURCE CODE
	org	0x00100	
Init:

;	Configuracion de los Puertos del PIC

	initPORTA 	OUT & PIN_0 			;^ PIN_1 ^ OUT				
							; Puerto A SALIDA  RA0 
	movlw		0x07				
	iorwf		ADCON1,f		
	
	initPORTB	IN & PIN_0 ^ PIN_1 ^ PIN_3 ^ OUT
							; Puerto B con entradas RB0, RB1 y RB2
							; el resto salidas
							
	initPORTC	IN				; Puerto C completo como ENTRADAS

; 	Configurando Interrupciones	

	bsf	RCON, IPEN		; habilita prioridad de interrupcion
	;bsf	INTCON, GIEH		; habilita prioridad alta
	movlw	B'11010000'
	movwf	INTCON
	movlw	B'01100000'		; habilita interrupcion en flanco de bajada
	movwf	INTCON2			; habilita interrupcion en flanco de bajada
	movlw	B'00001000'		; habilita prioridad alta para int1 
	movwf	INTCON3			; tambien habilita interrupcion 1 y 2
	
	;movlw		0xD0				; Habilitando las interrupciones de 
	;movwf		INTCON				; GIEH, GIEL e INT0 (High Priority)				
	;movlw		0xE0				; Configurando interrupciones en Rising Edge
	;movwf		INTCON2				; para INT0 e INT1
	;movlw		0x08				; Habilitando interrupciones por INT1
	;movwf		INTCON3				; en Low Priority
	SETF	PIE3					; HABILITA TODAS LAS INTERRUPCIONES DEL CAN
	setf	IPR3				; Interrupciones CAN todas en High Priority
	CLRF	PIR3
	

;	Configuracion del Modulo CAN			

;	Inicializando el Modulo
	
	CANInitialize	1, 5, 7, 6, 2, CAN_CONFIG_LINE_FILTER_ON & CAN_CONFIG_VALID_STD_MSG

;	Configurando los Filtros y Mascaras, Modo de Operacion en Configuracion

	CANSetOperationMode	CAN_OP_MODE_CONFIG
	
;	Estableciendo la Mascara del Buffer 0

	CANSetReg	CAN_MASK_B0, 0x00000007, CAN_CONFIG_STD_MSG
	
;	Filtro RX0 Buffer 0

	CANSetReg	CAN_FILTER_B0_F1, 0x00000000, CAN_CONFIG_STD_MSG

;	Filtro RX1 Buffer 0

	CANSetReg	CAN_FILTER_B0_F2, 0x00000002, CAN_CONFIG_STD_MSG

;	Estableciendo el Modo de Operacion Normal

	CANSetOperationMode	CAN_OP_MODE_NORMAL

Main:	goto	Main


;************************************************************
;
;		ATENCION DE INTERRUPCIONES
;
;************************************************************

;**********INTERRUPCIONES CON ALTA PRIORIDAD*****************
HighPINT:

	DISABLE_GIE
	SAVE_STATUS_W_BSR

	btfss	INTCON3,INT1IF	; REVISA SI FUE ESTA LA INTERRUPCION QUE SE GENERO
	bra 	OTRO
	goto 	pinb2
OTRO:	btfss	INTCON,INT0IF	; revisa si fue generada int0
	BRA	OTRO2

pinb1:				;atencion a interrupcin int0

	bcf	INTCON,INT0IF	;limpia bandera de interrupcion
	RESTORE_STATUS_W_BSR	;reestablece registros
	ENABLE_GIE		;habilita interrupcion global
	retfie	

pinb2:				;atencion a interrupcion int1
	
	bcf	INTCON3,INT1IF	;limpia bandera de interrupcion
	RESTORE_STATUS_W_BSR	;reestablece registros
	ENABLE_GIE		;habilita interrupcion global
	retfie

OTRO2:
	

;	call    CANISR

	banksel	PIR3
	btfss	PIR3,IRXIF
	goto	IsWAKIF
	goto	AbortU
IsWAKIF:
	btfss	PIR3,WAKIF
	goto	IsERRIF
	goto	EndHigh
IsERRIF:
	btfss	PIR3,ERRIF
	goto	IsTXB2IF
	goto	AbortU
IsTXB2IF:
	btfss	PIR3,TXB2IF
	goto	IsTXB1IF
	goto	EndHigh
IsTXB1IF:
	btfss	PIR3,TXB1IF
	goto	IsTXB0IF
	goto	EndHigh
IsTXB0IF:
	btfss	PIR3,TXB0IF
	goto	IsRXB1IF
	goto	EndHigh
IsRXB1IF:
	btfss	PIR3,RXB1IF
	goto	IsRXB0IF
	call	RxRou
	call	PROCESSFun
	goto	EndHigh
IsRXB0IF:
	btfss	PIR3,RXB1IF
	goto	IsRXB0IF
	call	RxRou
	call	PROCESSFun
	goto	EndHigh
AbortU:
	CANAbortAll
EndHigh:
	clrf	PIR3
	RESTORE_STATUS_W_BSR
	ENABLE_GIE

	retfie

;************INTERRUPCIONES CON BAJA PRIORIDAD*****************
	
LowPINT:
	
	DISABLE_GIE
	SAVE_STATUS_W_BSR
		
	btfss		INTCON,INT0IF
	bra		isINT1
	movff		PORTC,PRO_temp
	;movlw		0x00
	;cpfseq		PRO_temp
	;bra		in1
;try1:	call		CANIsTxReady
	bnc		TxNotRdy
	banksel		MessageData
	movlw		0x00
	movwf		MessageData,1
	movlw		0x82
	movwf		MessageData+1,1	
	movlw		0x0F
	movwf		MessageData+2,1
	movlw		0x01
	movwf		MessageData+3,1
	CANSendMessage	0x001, MessageData, 4, CAN_TX_STD_FRAME & CAN_TX_NO_RTR_FRAME

	bcf		INTCON,INT0IF
	bra		EndLow
	
in1:	movlw		0x01
	cpfseq		PRO_temp
	bra		EndLow
	call		CANIsTxReady
	bnc		TxNotRdy
	banksel		MessageData
	movlw		0x03
	movwf		MessageData,1
	movlw		0x80
	movwf		MessageData+1,1	
	movlw		0x0F
	movwf		MessageData+2,1
	movlw		0x00
	movwf		MessageData+3,1
	CANSendMessage	0x001, MessageData, 4, CAN_TX_STD_FRAME & CAN_TX_NO_RTR_FRAME

	bcf		INTCON,INT0IF
	bra		EndLow

isINT1:
	btfss		INTCON3,INT1IF
	bra		EndLow
try1	call		CANIsTxReady
	bnc		TxNotRdy
	banksel		MessageData
	;movlw		0x02
	movff		PORTC,WREG
	movwf		MessageData,1
	;movlw		0x82
	;movlw		0x00
	;movwf		MessageData+1,1	
	;movlw		0x0F
	;movlw		0x00
	;movwf		MessageData+2,1
	;movlw		0x00
	;movlw		0x00
	;movwf		MessageData+3,1
	CANSendMessage	0x001, MessageData, 1, CAN_TX_STD_FRAME & CAN_TX_NO_RTR_FRAME

	bcf		INTCON3,INT1IF
	bra		EndLow

TxNotRdy:
	goto try1
	
EndLow:	
	
	RESTORE_STATUS_W_BSR
	ENABLE_GIE
	retfie

RxRou
	call		CANIsRxReady
	bnc		RxNotRdy

	banksel		NewMessage

	CANReadMessage	NewMessage, NewMessageData, NewMessageLen, NewMessageFlags
	bra		ExitRx

RxNotRdy:

ExitRx:

	return
	
	end	
