;***********************************************************************************************

;  	PROGRAMA DE PRUEBA DEL CONV A/D DE UN PIC PARA LAS TARJETAS DE PUNTO FLOTANTE, S.A.
;					UTILIZANDO EL PIC16F88 COMO MICROCONTROLADOR	

;***********************************************************************************************

		LIST	P=16f88			;MICROCONTROLADOR A USAR
		INCLUDE	<P16F88.INC>	;LLAMADA A CABECERA

;***********************************************************************************************

		CBLOCK	0x20
		ENDC
	
;***********************************************************************************************

		ORG	0				;INICIO DEL PROGRAMA EN LA PRIMERA LOCACIÓN DE MEMORIA
		CLRF	PCLATH
		GOTO 	INICIO			;DIRECCIONAMOS AL "INICIO" DEL BLOQUE DE INSTRUCCIONES
		ORG 15
INICIO	
		BANKSEL	TRISA			;USAMOS LA DIRECTIVA "BANKSEL" SEGUIDA DEL REGISTRO AL QUE QUEREMOS ACCEDER Y EL COMPILADOR 
								;SELECCIONA AUTOMÁTICAMENTE EL BANCO DE MEMORIA EN EL QUE EL REGISTRO SE ENCUENTRA.
		MOVLW	0XFF
		MOVWF	TRISA			;PUERTO A COMO ENTRADAS
		CLRF	TRISB			;PUERTO B COMO SALIDAS

;*************************************************************************************************
;	REGISTROS IMPORTANTES QUE INTERVIENEN EN EL USO DEL CONV A/D
;	
;	ANSEL	=>	REGISTRO EN EL QUE SE SELECCIONA EL CANAL DEL CONV A/D CON EL QUE SE VA A TRABAJAR
;	BIT7 .- 	NO IMPLEMENTADO Y SE LEE COMO 0
;	BIT6-0.-	DEBEN ESTAR EN "0" PARA QUE LAS ENTRADAS DEL PUERTO SEAN DIGITALES Y EN "1" PARA ANALÓGICAS	
;
;	ADCON0	=>	REGISTRO DE CONFIGURACIÓN DEL CONV A/D
;	BIT7-6.-	ADCS<1:0>
;				00 = Fosc/2
;				01 = Fosc/8
;				10 = Fosc/32
;				11 = FRC (EL RELOJ DE CONVERSIÓN DEL CAD SE TOMA DEL RELOJ RC INTERNO)
;				NOTA: ESTE BIT VA LIGADO AL BIT6 (ADCS2) DEL REGISTRO ADCON1
;
;	BIT5-3.-	CHS<2:0>
;				EL VALOR EN BINARIO DE ESTOS BITS SELECCIONAN EL CANAL DEL CONV A/D A UTILIZAR
;				EN CASO DE USAR VARIOS CANALES DURANTE EL PROCESO SE DEBE ACCEDER A ESTOS BITS 
;				PARA CAMBIAR DE CANAL.
;
;	BIT2.-		GO_DONE
;				'1' .- PONIENDO ESTE BIT EN ESTADO ALTO INICIA LA CONVERSIÓN Y SE MANTIENE ASÍ HASTA QUE EL PROCESO TERMINA
;				'0' .- CONVERSIÓN TERMINADA
;				NOTA: PONIENDO ESTE BIT A '0' DURANTE LA CONVERSIÓN, EL PROCESO SE ABORTARÁ Y EL RESULTADO SERÁ EL MISMO DE LA
;					  ÚLTIMA CONVERSIÓN TERMINADA SATISFACTORIAMENTE.	
;
;	BIT1.-		NO IMPLEMENTADO. SE LEE COMO '0'
;
;	BIT0.- 		ADON
;				'1' .- CONVERTIDOR A/D ENCENDIDO
;				'0'	.- CONVERTIDOR A/D APAGADO Y SIN CONSUMIR ENERGÍA
;				NOTA: DEBE PONERSE EN '1' ESTE BIT ANTES DE INICIAR LA CONVERSIÓN
;
;	ADCON1	=>	REGISTRO DE CONFIGURACIÓN DEL CONV A/D
;	BIT7.-		ADFM
;				'1' .-	RESULTADO DE LA CONVERSIÓN JUSTIFICADO A LA DERECHA. LOS 4 MSB DE ADRESH SE LEEN COMO '0'
;				'0'	.-	RESULTADO DE LA CONVERSIÓN JUSTIFICADO A LA IZQUIERDA. LOS 4 LSB DE ADRESL SE LEEN COMO '0'		
;		
;	BIT6.-		ADCS2
;				'1' .- DIVIDE POR 2 LA FRECUENCIA DEL OSC (Fosc) 
;				'0'	.- DESHABILITADO 
;
;	BIT5-4.-	VCFG<1:0>	CONFIGURACIÓN DE LOS VOLTAJES DE REFERENCIA DEL CONV A/D SEGÚN LA TABLA:
;	
;				VALOR		VREF+		VREF-
;				  00		VDD			VSS
;				  01		VDD			VREF-
;				  10		VREF+		VSS
;				  11		VREF+		VREF-	
;				NOTAS: ° SE DEBE CONSULTAR LA HOJA DE DATOS DE MICROCHIP UBICADA EN EL LINK:
;						 http://ww1.microchip.com/downloads/en/DeviceDoc/30487c.pdf
;						 PARA CONOCER LOS VALORES MÁXIMOS DE VREF+ Y VREF-
;					   ° VREF- SE INTRODUCE AL PIC POR RA2
;				       ° VREF+ SE INTRODUCE AL PIC POR RA3
;				       ° PARA USAR LOS PUERTOS COMO ENTRADA PARA VOLTAJE DE REFERENCIA SE DEBEN CONFIGURAR COMO ENTRADAS ANALÓGICAS
;						 USANDO LOS REGISTROS TRISA Y ANSEL
;
;	BIT3-0.-	NO IMPLEMENTADOS. SE LEEN COMO '0'
;
;	ADRESH	=>	REGISTRO EN EL QUE SE ALMACENAN LOS 2 MSB PARA RESULTADOS JUSTIFICADOS A LA DERECHA Y 8 SI ES A LA IZQUIERDA
;	ADRESL	=>	REGISTRO EN EL QUE SE ALMACENAN LOS 8 LSB PARA RESULTADOS JUSTIFICADOS A LA DERECHA Y 2 SI ES A LA IZQUIERDA
;
;*************************************************************************************************
;EL SIGUIENTE ES EL PROCESO RECOMENDADO POR MICROCHIP PARA INICIALIZAR EL CONVERTIDOR A/D
;*************************************************************************************************

		MOVLW	B'00001000'			
		MOVWF	ANSEL			;RA3 COMO ENTRADA ANALÓGICA
		CLRF	ADCON1			;SIN DIVISOR DE FRECUENCIA, VREF+ = VDD Y VREF- = VSS
		BSF		ADCON1,ADFM		;JUSTIFICADO A LA DERECHA
		
		BANKSEL	ADCON0			;ACCEDE DIRECTAMENTE AL BANCO EN EL QUE SE ENCUENTRA ESTE REGISTRO
		BSF		ADCON0,CHS0		;SELECCIONAMOS EL CANAL ANALÓGICO 3
		BSF		ADCON0,CHS1
		BCF		ADCON0,CHS2
		BCF		ADCON0,ADCS0	;FRECUENCIA DE CONVERSIÓN A/D = Fosc/2 (MÁXIMA POSIBLE)
		BCF		ADCON0,ADCS1
		BSF		ADCON0,ADON		;ENCENDIDO DEL CONV. A/D
		CALL	Retardo_4micros	;TIEMPO DE ESPERA IMPLEMENTADO PARA QUE FUNCIONE ADECUADAMENTE EL CONV A/D
CICLO
		BANKSEL	ADCON0
		BSF		ADCON0,GO		;INICIAMOS LA CONVERSIÓN
ESPERA		
		BTFSC	ADCON0,GO_DONE	;YA TERMINO LA CONVERSIÓN?
		GOTO	ESPERA			;NO. ESPERA A QUE TERMINE.
		BANKSEL	ADRESL
		MOVF	ADRESL,W		;YA. TOMA LOS 8 LSB
		BANKSEL	PORTB
		MOVWF	PORTB			;MUESTRA EL RESULTADO DE LA CONVERSIÓN EN EL PUERTO B
		CALL	Retardo_2s		;ESPERAMOS 2 SEGUNDOS
		MOVF	ADRESH,W		;CARGAMOS LOS 2 MSB EN EL REGISTRO DE TRABAJO
		MOVWF	PORTB			;LOS MOSTRAMOS EN EL PUERTO B
		CALL	Retardo_2s		;ESPERAMOS 2 SEGUNDOS
		;NOP						;TIEMPO DE ESPERA IMPLEMENTADO PARA QUE FUNCIONE ADECUADAMENTE EL CONV A/D
		;CALL	Retardo_20ms
		GOTO	CICLO			;CICLO INFINITO		
		
		INCLUDE "RETARDOS.INC"
	END