;***************************************************************
;ALUMNOS:
;ALEJANDRO HERNANDEZ HERNANDEZ
;ENRIQUE GONZALES HERNANDEZ
;************************************************************************************************
;PROGRAMA NODO RX, QUE RECIBE UN DATO POR BUS CAN PROVENIENTE DEL NODO A
;************************************************************************************************
;EEVISION: 0.0					MICRO: PIC18F458									
;VELOCIDAD DE RELOJ: 20 MHZ		RELOJ DE INSTRUCCION: 200 nseg.
;************************************************************************************************
	List		p=PIC18F458			;Tipo de procesador
	include		"P18F458.INC"		;Definiciones de registros internos

;*********************************PALABRAS DE CONFIGURACION**************************************

;Configuración del registro de configuración CONFIG1H:HS PLL,Oscillator Switch disabled
	__CONFIG    _CONFIG1H, _HS_OSC_1H & _OSCS_OFF_1H 

;Configuración del registro de configuración CONFIG2L: Power-Up Timer disabled, Brown-Out Reset enable, BOR Voltage - 4.2v	
	__CONFIG    _CONFIG2L, _PWRT_ON_2L &  _BOR_ON_2L &  _BORV_42_2L 

;Configuración del registro de configuración CONFIG2H: Watch Dog Timer enable,Watch Dog Timer PostScaler 1:2
	__CONFIG    _CONFIG2H, _WDT_OFF_2H & _WDTPS_2_2H	

;Configuración del registro de configuración CONFIG4L:Stack over/underflow Reset enable,Low-voltage ICSP disabled,Backgound Debugger disabled
	__CONFIG    _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L	


;*******************************************VARIABLES********************************************


PDel0	equ	0x004
PDel1	equ	0x005



	ORG		0x0000
	goto	CONFI

	ORG		0x0008					;Interrupcion alta prioridad
	goto	$						;Goto infinito para que resetee por watchdog	

	ORG		0x0018					;Interrupcion baja prioridad
	goto	$						;Goto infinito para que resetee por watchdog	
	

	ORG		0x0020					;Para no ocupar la zona de vectores.	

CONFI
	clrf 	PORTB 					;Borra los latch de salida del PORTB
	clrf	PORTD					;Borra los latch de salida del PORTD

	;movlw 	b'00000110'
	;movwf 	ADCON1 					;PORTA E/S digitales
	clrf	TRISD					;configura PORTD como salidas a LEDS
	clrf 	TRISB 					;Configura PORTB como salidas
	bsf		TRISB,3					;RB3= RXCAN como entrada

	

;	clrf	TRISA					;configura PORTA como salidas
;	movlw 	b'00011111'
;	movwf 	TRISA 					;Configura PORTA como entradas A/D 


CONFI_CAN
	bsf		CANCON,7				;entramos al modo config

	movlw	0x03					;datos de configuracion obtenidos del bit time calculator  
	movwf	BRGCON1					;para 125 Kbaudios con un cristal de 20 MHZ
	movlw	0xBA
	movwf	BRGCON2
	movlw	0x07
	movwf	BRGCON3					
	bcf		CANCON,4				;constatamos que no halla aborto de TX 
	movlw	0X30
	movwf	CIOCON					;bus con vdd en estado recesivo y activacion de TXCAN en vez de CCP1

	movlw	0x00					;desactivamos INTERRUPCIONES
	movwf	PIE3


CONFI_CAN_RX
	movlw	0x20					;buffer 0 abierto a recibir
	movlb	.15						;solo ID standar y validos
	movwf	RXB0CON,BANKED			;no usar buffer 1 en caso de overflow en buffer0
									;filhit para criterio sera 0
	movlb	.15
	bcf		RXB0SIDL, EXID,BANKED		;solo ID estandar
																;111 1111 0 XXX	FILTRO
																;111 1111 1 000	mascara	 			
																;111 1111 0 XXX

	movlb	.15
	bcf		RXF0SIDL, EXIDEN,BANKED		;solo ID estandar FILTROS

	movlw	0xFE 						;VALOR para FILTRAR Y recbir id = 0x7F0 a 0x7F7
	movlb	.15
	movwf	RXF0SIDH,BANKED				;solo accesible en modo banked

	movlw	0xFF 						;MASCARA
	movlb	.15
	movwf	RXM0SIDH,BANKED				;solo accesible en modo banked

	movlw	0x00 						;MASCARA
	movlb	.15
	movwf	RXM0SIDL,BANKED				;solo accesible en modo banked

	bcf		CANCON,7				;entramos al modo normal
	bcf		CANCON,6				;entramos al modo normal
	bcf		CANCON,5				;entramos al modo normal
	
	call	DEMORA
	call	DEMORA					;Consumimos 300 mseg. en lo q se estabiliza la alimentacion
	call	DEMORA


MAIN
	
;	movf	TXB0D0,0
;	movwf	PORTD					;Ver salida por los leds
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
TESTEAR
	bsf		PORTB,4
	btfss	RXB0CON,RXFUL		;Buffer 0 recibio dato?
	goto	TESTEAR				;NO,	RXFUL=0
	bcf		PORTB,4				;SI,	RXFUL=1
	
BUS_RECIBIENDO
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	btfss	RXB0CON,FILHIT0		;FILTRO ACEPTADO=1?
	goto	FILTRO_0			;NO
	bsf		PORTB,5				;SI
AKI	goto	AKI					;CICLO INFINITO

FILTRO_0
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	movff	RXB0D0,PORTD		;Deplegar Dato por puerto
	bcf		RXB0CON,RXFUL		;LIMPIAMOS RXFUL COMO LO INDICA EL FABRICANTE
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	goto	MAIN
	

;-------------------------------------------------------------
; Generado con PDEL ver SP  r 1.0  el 09/05/2006 Hs 02:38:28 p.m.
; Descripcion: Delay 500000 ciclos
;-------------------------------------------------------------
DEMORA  movlw     .239      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL4  goto PDelL5         ; 2 ciclos delay
PDelL5  goto PDelL6         ; 2 ciclos delay
PDelL6  goto PDelL7         ; 2 ciclos delay
PDelL7  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-------------------------------------------------------------

	END
