USANDO EL ADC
Para esta práctica se usará el PIC16F870 y un sensor de temperatura LM35. El resultado de la temperatura medida se mostrará en un LCD de 16x2.
Para el caso de los PICs, es necesario asignar ciertos valores a un par de registros.
ADCON0: controla la operación del módulo A/D.
ADCON1: configuración de las funciones de los pines de los puertos del A/D (analógicos o digitales, uso o no de voltaje de referencia externo). Por ejemplo:
ADCON0 = %11000001 significa: |
ADCON1 = %00001110 significa: |
Bit 7-6: clock del ADC es RC. Bit 5-3: canal analógico 0. (AN0.) Bit 2: bit de estado de conversión. 0 significa que la conversión no está en progreso. Bit 1: no se usa. Bit 0: 1 significa inicio de operación del módulo A/D. |
Bit 7: 1 es justificación a la izquierda. Bit 6-4: no se usan. Bit 3-0: solo un canal analógico, V de referencia + es VDD y V de referencia – es VSS. |
La función del compilador que lee el dato del pin de ADC es ADCIN, cuya sintaxis es:
ADCIN canal, variable |
Antes de usar esta función, es necesario asignar la dirección de los pines de entrada analógica con la función TRIS.
Varios DEFINEs pueden también ser utilizados. Los valores por defecto se muestran abajo:
DEFINE ADC_BITS 8 ' Fije el número de BITS en el resultado (8, 10 o 12) DEFINE ADC_CLOCK 3 'Fije EL CLOCK (RC = 3) DEFINE ADC_SAMPLEUS 50 ' Fije el tiempo de muestreo en microsegundos |
Para el caso de la resolución del ADC, se usa la siguiente fórmula:
Para el caso de trabajar con 8 bits y un voltaje de 5 voltios como referencia se tendrá:
Es decir, el ADC irá de 0 V a 5 V con pasos de 19.53 mV.
El valor leído por ADCIN (para el caso de 8 bits irá de 0 a 255 y para el caso de 10 bits irá de 0 a 1024) debe ser multiplicado por la resolución para obtener el valor analógico que se está leyendo. Por ejemplo:
Valor = ADCIN x ADC_resolución
Veamos un ejemplo usando 8 bits y un voltaje de referencia de 5 V:
' DEFINICIÓN DE REGISTROS PARA EL LCD DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS DEFINE LCD_DBIT 4 'DESDE EL BIT B.4 AL BIT B.7 DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO DE CONTROL/DATOS EN EL PUERTO D DEFINE LCD_RSBIT 1 'EN EL BIT B.1 DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B DEFINE LCD_EBIT 2 'EN EL BIT B.2 DEFINE OSC 4 ; PARÁMETROS DEL ADC DEFINE ADC_BITS 8 ; NÚMERO DE BITS DEFINE ADC_CLOCK 3 ; USAR CLOCK INTERNO DEL AD DEFINE ADC_SAMPLEUS 50 ; TIEMPO DE MUESTREO EN 50US ; VARIABLES RES VAR WORD ; RESULTADO DE LA CONVERSIÓN TEMP1 VAR BYTE ; TEMPERATURA C TRISA = 1 ; RA0 (AN0) COMO ENTRADA TRISB = 0 ; PORTB SALIDA (ADC) PAUSE 500 ; PAUSA DE INICIALIZACIÓN DEL LCD ; INICIAR CONVERSIÓN A/D ADCON1 = %00001110 ; ESTABLECER SOLO UN CANAL COMO ANALÓGICO ; VOLTAJE DE REFERENCIA ES VDD ADCON0 = %11000001 ; RELOJ DEL A/D, SELECCIONA CANAL AN0 ; INICIAR EL A/D LCDOUT $FE, 1 ; BORRAR LCD INICIO: ; INICIAR CONVERSIÓN ADCIN 0, RES ; LEER EL CANAL A0 TEMP1 = 2 * RES ;2 VIENE DE->19.53 LCDOUT $FE,2,"TEMP = ",DEC TEMP1,$DF,"C" ; MOSTRAR RESULTADO PAUSE 500 ; PAUSA 0.5 SEGUNDOS GOTO INICIO END |
![]() |
Figura 1. ADC de 8 bits. |
Nótese en el código que TEMP1 = 2 * RES significa que se redondea el valor de 19.53 a 2.
Trabajando con el ADC de 10 bits tenemos la siguiente resolución:
Es decir, irá de 0 V a 5 V con pasos de 4.88 mV. ADCIN irá en este caso de 0 (0 voltios leídos) a 1024 (5 voltios leídos).
Usando 10 bits de resolución se puede usar una lectura decimal de la temperatura:
' DEFINICIÓN DE REGISTROS PARA EL LCD DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS DEFINE LCD_DBIT 4 'DESDE EL BIT B.4 AL BIT B.7 DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO DE CONTROL/DATOS EN EL PUERTO D DEFINE LCD_RSBIT 1 'EN EL BIT B.1 DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B DEFINE LCD_EBIT 2 'EN EL BIT B.2 DEFINE OSC 4 ; PARÁMETROS DEL ADC DEFINE ADC_BITS 10 ; NÚMERO DE BITS DEFINE ADC_CLOCK 3 ; USAR CLOCK RC DEL AD DEFINE ADC_SAMPLEUS 50 ; TIEMPO DE MUESTREO EN 50US ; VARIABLES RES VAR WORD ; RESULTADO DE LA CONVERSIÓN VAL VAR WORD TEMP1 VAR byte ; TEMPERATURA C TRISA = 1 ; RA0 (AN0) COMO ENTRADA TRISB = 0 ; PORTB SALIDA (ADC) PAUSE 500 ; PAUSA DE INICIALIZACIÓN DEL LCD ; INICIAR CONVERSIÓN A/D ADCON1 = %10001110 ; ESTABLECER SOLO UN CANAL COMO ANALÓGICO ; VOLTAJE DE REFERENCIA ES VDD ADCON0 = %11000001 ; RELOJ DEL A/D, SELECCIONA AN0 ; INICIAR EL A/D LCDOUT $FE, 1 ; BORRAR LCD INICIO: ; INICIAR CONVERSIÓN ADCIN 0, RES ; LEER EL CANAL A TEMP1 = 488 * RES ; 1024*488=499712; VAL = DIV32 10 LCDOUT $FE,1,"TEMP = ",DEC VAL DIG 3,DEC VAL DIG 2,".",DEC VAL DIG 1, DEC VAL DIG 0,$DF,"C" ; PAUSE 500 ; PAUSA 0.5 SEGUNDOS GOTO INICIO END |
La siguiente figura muestra el código en funcionamiento:
![]() |
Figura 2. ADC con 10 bits de resolución. |
Con un voltaje de referencia externo usando un diodo zener de 2.5 V se tendrá:
Sabiendo que el LM35 da 10 mV por grado centígrado, usando un voltaje de referencia externo nos da una lectura más precisa del valor de la temperatura.
Es necesario definir el registro ADCON1 de esta manera:
ADCON1 = %00001010 |
De este modo, se establece al pin RA3 (AN3) como el voltaje de referencia positivo a Vss como el voltaje de referencia negativo.
' DEFINICIÓN DE REGISTROS PARA EL LCD DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS DEFINE LCD_DBIT 4 'DESDE EL BIT B.4 AL BIT B.7 DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO DE CONTROL/DATOS EN EL PUERTO D DEFINE LCD_RSBIT 1 'EN EL BIT B.1 DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B DEFINE LCD_EBIT 2 'EN EL BIT B.2 DEFINE OSC 4 ; PARÁMETROS DEL ADC DEFINE ADC_BITS 8 ; NÚMERO DE BITS DEFINE ADC_CLOCK 3 ; USAR CLOCK INTERNO DEL AD DEFINE ADC_SAMPLEUS 50 ; TIEMPO DE MUESTREO EN 50US ; VARIABLES RES VAR WORD ; RESULTADO DE LA CONVERSIÓN TEMP1 VAR BYTE ; TEMPERATURA C TRISA = 1 ; RA0 (AN0) COMO ENTRADA TRISB = 0 ; PORTB SALIDA (ADC) PAUSE 500 ; PAUSA DE INICIALIZACIÓN DEL LCD ; INICIAR CONVERSIÓN A/D ADCON1 = %00001010 ; ESTABLECER SOLO UN CANAL COMO ANALÓGICO ; VOLTAJE DE REFERENCIA ES RA3 ADCON0 = %11000001 ; RELOJ DEL A/D, SELECCIONA AN0 ; INICIAR EL A/D LCDOUT $FE, 1 ; BORRAR LCD INICIO: ; INICIAR CONVERSIÓN ADCIN 0, RES ; LEER EL CANAL A TEMP1 = RES ;2 VIENE DE->19.53 LCDOUT $FE,2,"TEMP = ",DEC TEMP1,$DF,"C" ; MOSTRAR RESULTADO PAUSE 500 ; PAUSA 0.5 SEGUNDOS GOTO INICIO END |
El resultado se muestra en la siguiente figura:
![]() |
Figura 3. ADC con 8 bits de resolución y Vref externo. |
Descarga el código de esta simulación:





