;***************************************************************
;ALUMNOS:
;ALEJANDRO HERNANDEZ HERNANDEZ
;ENRIQUE GONZALES HERNANDEZ
;************************************************************************************************
;PROGRAMA NODO TX, QUE ENVIA UN DATO POR BUS CAN HACIA OTRO NODO
;************************************************************************************************
;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_PORT

	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_PORT
	clrf 	PORTB 					;Borra los latch de salida del PORTB
	clrf	PORTA					;Borra los latch de salida del PORTA
	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
	setf 	TRISB 					;Configura PORTB como entradas
	bcf		TRISB,2					;RB2= TXCAN como salida
	bcf		TRISB,7					;RB7=salida 
	bcf		TRISB,6					;RB6=salida
	bcf		TRISB,5					;RB5=salida
	bcf		TRISB,4					;RB4=salida 

;	clrf	TRISA					;configura PORTA como salidas
	movlw 	b'11111111'
	movwf 	TRISA 					;Configura PORTA como entradas A/D

CONFI_ADC
	movlw	0x81	
	movwf	ADCON0					;frecuencia de conv=Fosc/32, canal 0, desactivacion A/D
	movlw	0x0E
	movwf	ADCON1					;justificacion hacia la izq. y seleccion de alimentacion como umbral A/D, AN0=analogico


CONFI_CAN
	bsf		CANCON,7				;entramos al modo config

	movlw	0x03					;datos de configuracion obtenidos del bit time calculator
	movwf	BRGCON1					
	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
	movwf	PIE3

CONFI_CAN_TX
	movlb	.15
	bcf		TXB0SIDL, EXIDE,BANKED		;solo ID estandar
																					; ACEPTADOS 7F8 A 7FF 
	movlw	0xFE 						;ID para enviar el dato en W = 0x7F8		; 1111 1110 000 = 7F0
	movlb	.15
	movwf	TXB0SIDH,BANKED				;solo accesible en modo banked

	movlw	B'0001111'
	movlb	.15					
	andwf	TXB0SIDL,F,BANKED			;enmascarando con AND meter 000 en los 3 bits mas altos
										;y asi terminar de meter el ID

	movlw	0x01
	movlb	.15
	movwf	TXB0DLC,BANKED				;campo de frame remoto=0 y dato = 1 byte 

	movlb	.15
	bcf		TXB0DLC, TXRTR,BANKED		;solo ID estandar

	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 500 mseg. en lo q se estabiliza la alimentacion
	call	DEMORA
	call	DEMORA
	call	DEMORA

MAIN
	bsf		TXB0CON,TXPRI0			;PRIORIDAD
	bsf		TXB0CON,TXPRI1			;ALTA
	call	DEMORA
	;bcf	PORTB,6					;RB6=0
	bsf		ADCON0,2					;(GO) se habilita la conversion

testeo
	btfsc	ADCON0,2				;conversion lista o terminada?	
	goto	testeo					;NO: entonces seguir testeando
	movff	ADRESH,TXB0D0			;SI: el restultado de la conversion ya esta listo
	movff	TXB0D0,PORTD			;visualizarlo
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	bsf		TXB0CON,TXREQ			;INICIANDO TRANSMISION FRAME STANDAR 55 bits= 440 uSeg.
	nop								;440 uSeg*256= 112 milisegundos y 640 microsegundos aprox. 
	nop								;para desbordar contador TEC en caso de error en bus
	nop
	nop
	nop

BUS_TRANSMITIENDO
	btfsc	TXB0CON,TXERR			;hay un cero en TXERR
	goto	ERROR_CAN				;NO entonces TXERR=1
									;SI	entonces TXERR=0 y proseguir chekando TXREQ ya que debe regresar a 0
	btfsc	TXB0CON,TXREQ			;hay un cero en TXREQ?
	goto	BUS_TRANSMITIENDO		;NO, entonces TXREQ=1

MSJCORRECTO							;SI, entonces regreso TXREQ a 0
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	bcf		PORTB,7
	bsf		PORTB,6					;RB6=1	
	goto 	MAIN					;reenviar el msj cada 100 mseg.
	
									
ERROR_CAN
	bcf		PORTB,6
	bsf		PORTB,7					;RB7= 1
	btfsc	TXB0CON,TXLARB			;se perdio el arbitraje?? seria ilogico por que solo hay 2 nodos	
	goto	LOST_ARB				;SI, TXLARB=1, ESPERAR QUE EL BUS SE DESOCUPE
									;NO, TXLARB=0, entonces intetarlo de nuevo 
	btfss	COMSTAT,TXBO			;siempre y cuando TEC<=255??		
	goto	MAIN					;SI, TEC<=255 INTENTAR TRANSMITIR DE NUEVO
	bsf		PORTB,4					;NO, TEC>255 SALIR Y ENCENDER LED DE BUS INHABILIDATO
AQUI
	goto	AQUI					;GOTO INFINITO, ESPERANDO RESET

LOST_ARB
	bsf		PORTB,5					;enmcender led de perdida de arbitraje
	goto	MAIN					;volver a transmitir una vez que el bus este desocupado	
	



;-------------------------------------------------------------
; 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
