;
;					EJEMPLO 21
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC I/O
;
;El módulo conversor ADC. 
;
;Los dispositivos PIC16F87X disponen de un convertidor A/D de 10 bits de resolución y 5 u 8 
;canales de entrada analógica. La tensión de referencia determina la resolución por bit:
;(Res. = Vref/1024). Con 5 Vref=4.8 mV/Bit; con 2.5 Vref=2.4 mV/Bit
;
;El ejemplo propone realizar la conversión de la tensión presente en el canal RA3/AN3. Esta
;se puede variar con el potenciómetro AN3 alojado en la tarjeta Micro'PIC Trainer. El resul-
;tado de la conversión se visualiza, en binario, sobre la pantalla LCD.

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Lcd_var		equ	0x20		;Variables de las rutinas LCD
Temporal_1	equ	0x22		;Variable temporal

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción
		include	"LCD_CXX.INC"	;Incluye rutinas de manejo del LCD

;Visualiza: Esta rutina coge los 10 bits resultantes de la conversión, presentes en ADRESH
;y ADRESL, los convierte a caracteres ACII (0 o 1) y los visualiza sobre el LCD.

Visualiza:	movlw	0x80
		call	LCD_REG		;Sitúa el cursor del LCD
		movlw	.9
		movwf	Temporal_1	;Nº de caracteres a visualizar
Visual_loop	bsf	STATUS,RP0
		rlf	ADRESL,F
		bcf	STATUS,RP0
		rlf	ADRESH,F	;Rotación del siguiente bit
		btfsc	STATUS,C	;Testea el bit a visualizar
		goto	Bit_1		;Está a 1
		movlw	'0'
		goto	Visu_1
Bit_1		movlw	'1'
Visu_1		call	LCD_DATO	;Visualiza el "0" o el "1" sobre el LCD
		decfsz	Temporal_1,F	;Siguiente caracter
		goto	Visual_loop
		return


;Programa principal

Inicio	        clrf	PORTA
		clrf	PORTB
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'00000110'
		movwf	ADCON1		;Puerta A E/S digitales
		clrf	TRISB		;Puerta B se configura como salida
		clrf	TRISA		;RA4-RA0 salidas
		movlw	b'11001111'
		movwf	OPTION_REG	;Preescaler de 128 asociado al WDT
		bcf	STATUS,RP0	;Selecciona banco 0

		call	UP_LCD		;Configura E/S para el LCD
		call	LCD_INI		;Secuencia de inicio del LCD
		movlw	b'00001100'
		call	LCD_REG		;LCD On, cursor y blink Off

;Se activa el ADC y se selecciona el canal RA3/AN3. Frecuencia de trabajo Fosc/32
	
		movlw	b'10011001'
		movwf	ADCON0		;ADC en On, seleciona canal AN3

Loop		clrwdt
		bsf	STATUS,RP0	;Selecciona página 1
		movlw	b'00011111'
		movwf	TRISA		;Puerta A entradas
		clrf	ADCON1		;Puerta A entradas analógicas
		bcf	STATUS,RP0	;Selecciona página 0
		bcf	PIR1,ADIF	;Restaura el flag del conversor AD
		nop
		bsf	ADCON0,GO	;Inicia la conversión

ADC_Wait	btfss	PIR1,ADIF	;Fin de conversión ??
		goto	ADC_Wait	;Todavía no
		
;Las líneas de la Puerta A se reconfiguran como salidas digitales para la visualización

		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'00000110'
		movwf	ADCON1		;Puerta A digital
		bcf	STATUS,RP0	;Selecciona banco 0
		call	UP_LCD		;Reconfigura E/S para el LCD
		call	Visualiza	;Visualiza el resultado de la conversión
		goto	Loop

		end			;Fin del programa fuente
