	Title "entrada analogica salida puerto serie"
; Metiendo una señal analogical, sale una señal digital por el puerto serie

	
	__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
	; al programar LVP tiene que estar deshabilitado
	; Configuración para el  grabador.

	LIST p=16F876A ; processor type
	include <p16F876A.INC>

TEMP equ 0x20

;-------------
; RESET
;-------------

	ORG	00H	
	;ERRORLEVEL        -302,-301,-215
	goto INICIO 		; va a la primera instruccion del programa	

; -----------------------------------
; INICIO DE PROGRAMA
; -----------------------------------

INICIO	bcf		STATUS,RP0	; Banco 0.
		clrf 	PORTA			; Limpia todos los bits de PORTA
		clrf 	PORTB 		; Limpia todos los bits de PORTB
		clrf 	PORTC 		; Limpia todos los bits de PORTC
		
		bsf		STATUS,RP0	; Banco 1.
		movlw	b'00101110'		; Configuramos todos los pins como entradas analogicas	
		movwf	ADCON1

		bcf		STATUS,RP0	; Banco 0.
		movlw B'01000001'		; Selecciono RC osc (FOSC/8), AN0
		movwf ADCON0 		; A/D habilitado
		
		bsf		STATUS,RP0	; Banco 1.
		movlw b'00000001'
		movwf TRISA 			; Configuramos AN0 como entrada
		clrf		TRISB			; Las líneas del Puerto B se configuran como salidas.
		movlw b'11111111' 		; RC7/RX entrada
		movwf TRISC 			; RC6/TX salida
		movlw b'00000100' 		; Configuramos USART para high speed y
								; permitimos la transmisión y la
		movwf TXSTA 			; activacion de transmision (asincrono)
		movlw d'25' 	 		; Miramos la tablas del datasheet y
			 					; escribimos 25 en SPBRG
		movwf SPBRG 	 	; para configurar una velocidad de
			 					; transmisión de 9600 BAUDIOS a 4 MHz
		
		bcf		STATUS,RP0	; Banco 0.
		bsf 		RCSTA,SPEN 	; Activamos la USART (bit SPEN del
								; registro RCSTA) 7=habilito puerto serie
		
		bsf		STATUS,RP0	; Banco 1.
		bsf		PIE1,RCIE		; permito recibir interrupcion
	
		bcf		STATUS,RP0	; Banco 0.
		bcf		RCSTA,RX9		; recepcion 8 bits
		bsf		RCSTA,CREN	; permito recepcion continua
		bsf		INTCON,PEIE	; Permito todas las interrupciones desenmascaradas perifericas
		bsf		INTCON,GIE	; Permito todas las interrupciones desenmascaradas.


;VERIFICACION DE ERRORES EN LA RECEPCION SERIAL
  		btfsc   	RCSTA,FERR
		call   	SALIR_ERROR
		btfsc	RCSTA,OERR
		call   	SALIR_ERROR
		movf	RCREG,W
  
SALIR_ERROR
  		bcf      	RCSTA,CREN
		NOP
		NOP
		bsf      	RCSTA,CREN
                
		RETURN

START	sublw	'S'
		btfss	STATUS,Z
		goto 	CONVERSION
		goto	START

	
;------------------------------------------------------------------------------------------------------------------
; CONVERSION - convierte el valor analogico de la entrada an0 aun valor digital.
;-------------------------------------------------------------------------------------------------------------------

CONVERSION	bcf		STATUS,RP0	; Banco 0.
		bcf		RCSTA,CREN	;no permito la recepcion
		
		bsf		STATUS,RP0	; Banco 1.
		bsf 		TXSTA,TXEN 	; TXEN habilita la transmision
		
		bcf		STATUS,RP0	; Banco 0.
		bcf		PIR1,ADIF		; Cuando finaliza una conversion este bit se activa

		bsf		STATUS,RP0	; Banco 1.
		bsf		PIE1,ADIE		; Permito interrupcion de conversion A/D 

		call 	ESPERA

		bcf		STATUS,RP0	; Banco 0.
		bsf 		ADCON0,GO	; 2=GO , la conversion esta en proceso
LOOP	btfss 	PIR1,ADIF	 	; si ADIF=0 la conversion no es completa
		goto 	LOOP			; si ADIF=1 la conversion se ha completado
		movf	ADRESH,w		; Consigue valor a/d
		goto	ENVIAR

;-------------------------------------------------------------------------------
; ESPERA - necesitamos un tiempo de retraso
; para que se pueda asegurar la adquisicion de datos.
;-------------------------------------------------------------------------------

ESPERA nop
		nop
		movlw d'3'
		movwf 	TEMP
SD		decfsz 	TEMP, F
		goto	 SD
		return
;-------------------------------------------------------------------------
; ENVIAR - enviamos los datos por el puerto serie.
;-------------------------------------------------------------------------

ENVIAR	
		bcf		STATUS,RP0	; Banco 0.
		movwf TXREG  		; Movemos lo que queremos transmitir (debe estar en el 
								; registro W) al registro TXREG y empezamos a transmitir
		movlw b'10000000'
		movwf PORTB			; Pone a "1" la salida RB0.
	
		bsf	  	STATUS,RP0	; Banco 1.
FIN_TX 	btfss 	TXSTA,TRMT	; Compruebo si el bit TMRT del registro está a '1' o a '0'.
		goto 	FIN_TX 			; Si esta a '0' es que esta vacio TMRT y no ha
								; terminado de transmitir, para ello TRMT tiene que 
								; estar a 1, hasta entonces esperamos.
		
		bsf		STATUS,RP0	; Banco 1.
		bcf 		TXSTA,TXEN 	; TXEN NO habilita la transmision
		
		bcf		STATUS,RP0	; Banco 0.
		bsf		RCSTA,CREN	; permito recepcion continua

;VERIFICACION DE ERRORES EN LA RECEPCION SERIAL
  		btfsc   	RCSTA,FERR
		call   	SALIR_ERROR
		btfsc	RCSTA,OERR
		call   	SALIR_ERROR
		movf	RCREG,W

STOP	sublw	'E'
		btfss	STATUS,Z
		goto 	START
		goto	CONVERSION		

		END		
