Está en la página 1de 32

MICROCONTROLADORES

M.Sc. César Augusto Peña C.

Profesor de planta – Ingeniería mecatrónica


Universidad de Pamplona
CONVERSOR A/D
CONVERSOR A/D
El PIC16F877 posee un conversor A/D de 10 Bits de resolución y 8 canales.

Resolución = ( VREF+ - VREF- ) / 1024

La tensión de referencia se puede implementar como la tensión interna de alimentación


o la aplicada por las patillas RA3/AN3/ VREF+ y RA2/AN2/ VREF-

Ejemplo:

Usando la tensión interna

VREF+ = VDD
VREF- = VSS

Resolución = (5 - 0) / 1024 = 4.8828 mV


CONVERSOR A/D
VREF+ = 5v VREF- = 0v
DATO VALOR (V) VALOR(V) / 4,8828 (mV) Nº DIVISIONES
1 0,012 2,5 3
2 0,048 9,8 10
3 0,108 22,1 23
4 0,192 39,3 40
5 0,3 61,4 62
6 0,432 88,5 89
7 0,588 120,4 121
8 0,768 157,3 158
9 0,972 199,1 200
10 1,2 245,8 246
11 1,452 297,4 298
12 1,728 353,9 254
13 2,028 415,3 416
14 2,352 481,7 482
15 2,7 553,0 553
16 3,072 629,1 630
17 3,468 710,2 711
18 3,888 796,3 797
19 4,332 887,2 888
20 4,8 983,0 983
REGISTRO ADCON0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE# - ADON

ADCS1- ADCS1 : bits de selección del reloj de conversión


00 – FOSC / 2
01 – FOSC / 8
10 – FOSC / 32
11 – FRC (Oscilador interno)
REGISTRO ADCON0
SELECCIÓN TAD FRECUENCIA DE TRABAJO
TAD ADCS1- ADCS1 20 MHz 5 MHz 1.25 MHz 333.33 kHz
2*TOSC 00 100ns 400ns 1.6µs 6µs
8*TOSC 01 400ns 1.6ns 6.4µs 24µs
32*TOSC 10 1.6µs 6.4µs 2.6µs 96µs
RC 11 2-6µs 2-6µs 2-6µs 2-6µs

Tiempos NO válidos Tiempos Mínimos Tiempos validos

TAD = Tiempo que dura la conversión de cada bit

En la conversión de 10 bit el mínimo tiempo que requiere es de 12 * TAD

En los PIC 16F87X el tiempo NO puede ser inferior a 1.6µs


REGISTRO ADCON0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE# - ADON

CHS2:CHS0 : bits de selección de canal análogo

000 – Canal 0, ( RA0 / AN0 )


001 – Canal 1, ( RA1 / AN1 )
010 – Canal 2, ( RA2 / AN2 )
011 – Canal 3, ( RA3 / AN3 )
100 – Canal 4, ( RA5 / AN4 )
101 – Canal 5, ( RE0 / AN5 )
110 – Canal 6, ( RE1 / AN6 )
111 – Canal 7, ( RE2 / AN7 )
CHS2-CHS0 Y PCFG3- PCFG0
REGISTRO ADCON0

ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE# - ADON

GO/DONE#:
1 - Conversión en progreso (comienza la conversión A/D)
0 - Final de conversión
ADON
1 - Módulo de conversión activado
0 - Módulo de conversión desactivado
REGISTRO ADCON1
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0

ADFM: Formato modulo A/D

1 - Justificación a la derecha, 6 Bit más significativos de ADRESH

son leídos como “0”

0 - Justificación a la izquierda, 6 Bit menos significativos de

ADRESL son leídos como “0”


REGISTRO ADCON1
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
REGISTRO ADCON1
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0

PCFG3-PCFG0: Bits de configuración del puerto A/D


PASOS PARA LA CONVERSIÓN A/D

• Configurar las pines de captura de datos análogos como entrada, los


pines restantes como se quiera y la tensión de referencia con el
registro ADCON1.

• Seleccionar el reloj de conversión, el canal de entrada A/D y activar el


modulo de conversión A/D con ADCON0.

• Configurar interrupciones si se desea:


–Borrar bandera de interrupción A/D (ADIF del registro PIR1)
–Habilitar interrupción A/D poniendo a 1 el bit ADIE del registro PIE1
–Habilitar el bit de interrupciones globales (GIE) y el bit de interrupciones de
periféricos externos

• Tiempo de espera para la activación


PASOS PARA LA CONVERSIÓN A/D

• Inicio de la conversión ( Poner a 1 el bit GO/DONE# de


ADCON)

• Tiempo de esperar para conversión (verificar cuando el


bit ADCON0<GO> cambia a cero)

• Lectura del resultado de la conversión en


ADRESH:ADRESL
LIBRERÍA CONVERSION A/D
;------------------------------------------------------------------------
;LIBRERIAS DE RUTINAS CREADAS O MODIFICADAS POR CÉSAR PEÑA
;TEMA: CONVERSION ANALOGA DIGITAL
;NOTA: Crear los registros R_CONVER_H y R_CONVER_L
;------------------------------------------------------------------------

CONVER_INI bcf STATUS,RP1


bsf STATUS,RP0
clrf ADCON1 ;Configura todo el puerto B como AD
bsf ADCON1,7 ;**Pone la mayoría de # en ADRESL
bsf ADCON1,2 ;**Pone en 1 PCFG2 - Ra3,1,0 análogos
bcf STATUS,RP0 ;Banco 0
bcf STATUS,RP1
movlw b'11000001' ;Oscilador RC interno, canal 0, Módulo CAD activo
movwf ADCON0 ;activación del conversor
clrf R_CONVER_H ;inicializa variable donde se almacena conversión A/D
clrf R_CONVER_L ;inicializa variable donde se almacena conversión A/D

RETURN
LIBRERÍA CONVERSION A/D
;*********RUTINA PARA ADQUIRIR DATO ANALOGO POR RA0***********
CONVER_RA0 bsf STATUS,RP0 ;Pasa al banco 1
bcf STATUS,RP1 ;Pasa al banco 1
clrf ADCON1 ;Configura todo el puerto B como AD
bsf ADCON1,ADFM ;**Pone la mayoría de # en ADRESL
bcf STATUS,RP0 ;Pasa al banco 0
movlw b'11000001' ;Oscilador RC interno, canal 0
movwf ADCON0 ;activación del conversor
nop ;tiempo para activación
nop
nop
nop
nop
nop
nop
nop
nop
nop
LIBRERÍA CONVERSION A/D
bsf ADCON0,GO ;Inicio de conversión
FIN_RA0 btfsc ADCON0,GO
goto FIN_RA0
nop
movf ADRESH,w ;traslada los bit mas significativos a w
movwf R_CONVER_H ;muestra la captura en el registro
bsf STATUS,RP0 ;BANCO 1
movf ADRESL,w ;traslada los bit mas significativos a w
bcf STATUS,RP0 ;BANCO 0
movwf R_CONVER_L ;muestra la captura en el registro
RETURN
LIBRERÍA CONVERSION A/D
;*********RUTINA PARA ADQUIRIR DATO ANALOGO POR RA1***********

CONVER_RA1 bsf STATUS,RP0 ;Pasa al banco 1


bcf STATUS,RP1 ;Pasa al banco 1
clrf ADCON1 ;Configura todo el puerto B como AD
bsf ADCON1,ADFM ;**Pone la mayoria de # en ADRESL
bcf STATUS,RP0 ;Pasa al banco 0
movlw b'11001001' ;Oscilador RC interno, canal 0
movwf ADCON0 ;activación del conversor
nop ;tiempo para activación
nop
nop
nop
nop
nop
nop
nop
nop
nop
LIBRERÍA CONVERSION A/D
bsf ADCON0,GO ;Inicio de conversión
FIN_RA1 btfsc ADCON0,GO
goto FIN_RA1
nop
movf ADRESH,w ;traslada los bit mas significativos a w
movwf R_CONVER_H ;muestra la captura en el registro
bsf STATUS,RP0 ;BANCO 1
movf ADRESL,w ;traslada los bit mas significativos a w
bcf STATUS,RP0 ;BANCO 0
movwf R_CONVER_L ;muestra la captura en el registro

RETURN
BINARIO A BCD

0 0 0 0 0 0 1 0
Centenas = 2

1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1
Decenas = 5
REG1 = 255

0 0 0 0 0 1 0 1
Unidades = 5
SUBRUTINA BINARIO-BCD
;SUBRUTINA DE CONVERSION DE BINARIO A BCD
;EL VALOR A CONVERTIR SE CARGA A W Y EL RESULTADO SE OBTIENE EN LOS REGISTROS unidad, decena y
;centena

BIN_A_BCD movwf unidad ;aqui se deposita el binario a convertir


DECIMAL clrf decena
clrf centena
movlw d'100'
OTRA subwf unidad,1 ;restar 100 al valor inicial
btfss STATUS,C ;verifica el carry
goto SUM ;Si es cero deja de restar
incf centena ;si es uno incrementa centena
goto OTRA ;volver a restar
SUM addwf unidad ;sumarle 100
movlw d'10'
REPITE subwf unidad ;restar 10 al valor
btfss STATUS,C ;Verificar el carry
goto SUM1 ;si es cero deja de restar
incf decena ;si es 1 incrementa decena
goto REPITE
SUM1 addwf unidad ;sumarle 10 al valor
retlw 0
EJEMPLO DE PROGRAMACIÓN
;AUTOR: CÉSAR AUGUSTO PEÑA C
;PIC: 16F877A
;FUNCION: Visualiza un mesaje por un LCD conectado a RB<0:7> (datos) y RBD<5:7>
; donde RS, R/W y #E (LCD) se conectan respectivamente a RD5, RD6 y RD7
;ejemplo aplicado a un sensor de temperatura conectado a RA0 con su etapa de amplificación

;CARACTERISTICAS:
;OSCILLATOR: XT
;WATCHDOG TIMER: OFF
;POWER UP TIMER: ON
;BROWN OUT DETECT: OFF
;LOW VOLTAGE PROGRAM: DISABLE
;FLASH PROGRAM WRITE: WRITE PROTECTION OFF
;BACKGROUND DEBUG: DISABLED
;DATA EE READ PROTECT: OFF
;CODE PROTECT: OFF

list p=16f877a ;Tipo de procesador


INCLUDE "P16F877A.Inc" ;Librerias de registros del PIC
;**************************** DEFINICION DE REGISTROS ***********************************
CBLOCK .32
DATO_A, DATO_B ;VARIABLES CONTROL LCD
R_CONVER_H, R_CONVER_L ;VARIABLES CONVERSION ANALOGA DIGITAL
unidad, decena, centena,milcena ;VARIABLES CONVERSION BCD
RET1,RET2,RET3 ;VARIABLES RETARDO

endc
EJEMPLO DE PROGRAMACIÓN
INICIO bcf STATUS,RP1
bsf STATUS,RP0
bcf 1,7 ;Resistencias pull up ACTIVAS
bcf TRISE,PSPMODE ;Desactiva puerto paralelo esclavo
;Afecta puerta D también
movlw b'00000010'
movwf TRISD ;puerto D como salida y el RD1 para RF
movlw b'00000011' ;Configura puerto C para verificar sensores
movwf TRISC
clrf TRISE ;puerto E como salida
bcf STATUS,RP0 ;Banco 0
bcf STATUS,RP1

call MENSAJE_CESAR_UNIPAMPLONA
call RETARDO_1S
call LCD_INI ;Borra LCD

call CONVER_INI ;Configura el PIC para conversión A/D


CICLO ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

MUESTRA_1call CONVER_RA0 ;realiza conversión por RA0


EJEMPLO DE PROGRAMACIÓN
;CON CADA DIVISION DEL CONVERSOR (4.88mV) REPRESENTARA UNA DECIMA DE GRADO
movf R_CONVER_L,W
clrf milcena
call BIN_A_BCD

btfsc R_CONVER_H,0
call SUMA_256
btfsc R_CONVER_H,1
call SUMA_512

call MENSAJE_TEMPERATURA_ACTUAL

movf milcena,w
addlw 30
call LCD_DATOS
movf centena,w
addlw 30
call LCD_DATOS
movf decena,w
addlw 30
call LCD_DATOS
movlw '.'
call LCD_DATOS
movf unidad,w
addlw 30
call LCD_DATOS

goto CICLO
EJEMPLO DE PROGRAMACIÓN
;------------------------------------------------------------------------------
SUMA_256movf unidad,W
addlw d'6'
movwf unidad
movf decena,W
addlw d'5'
movwf decena
movf centena,W
addlw d'2'
movwf centena
goto VER_UNIDAD
;------------------------------------------------------------------------------

SUMA_512movf unidad,W
addlw d'2'
movwf unidad
movf decena,W
addlw d'1'
movwf decena
movf centena,W
addlw d'5'
movwf centena
goto VER_UNIDAD

;------------------------------------------------------------------------------
EJEMPLO DE PROGRAMACIÓN
VER_UNIDAD movf unidad,W ;Carga W con el ultimo dato leido
sublw d'10' ;Compara
btfss STATUS,2 ;Si es igual salta
goto VER_UNIDAD_2
clrf unidad ;unidad = 0
incf decena,1 ;incremente decenas
goto VER_DECENA
VER_UNIDAD_2 movlw d'10'
subwf unidad,0 ;restar 10
btfss STATUS,C ;verifica el carry
goto VER_DECENA ;Si es cero deja de restar
movwf unidad ;deje el sobrepaso de 10 en unidades
incf decena,1 ;incremente decenas
goto VER_DECENA

VER_DECENA movf decena,W ;Carga W con el ultimo dato leido


sublw d'10' ;Compara
btfss STATUS,2 ;Si es igual salta
goto VER_DECENA_2
clrf decena ;unidad = 0
incf centena,1 ;incremente decenas
goto VER_CENTENA
EJEMPLO DE PROGRAMACIÓN
VER_DECENA_2 movlw d'10'
subwf decena,0 ;restar 10
btfss STATUS,C ;verifica el carry
goto VER_CENTENA ;Si es cero deja de restar
movwf decena ;deje el sobrepaso de 10 en decenas
incf centena,1 ;incremente centenas

VER_CENTENA movf centena,W ;Carga W con el ultimo dato leido


sublw d'10' ;Compara
btfss STATUS,2 ;Si es igual salta
goto VER_CENTENA_2
clrf centena ;unidad = 0
incf milcena,1 ;incremente decenas
return
VER_CENTENA_2 movlw d'10'
subwf centena,0 ;restar 10
btfss STATUS,C ;verifica el carry
return ;Si es cero deja de restar
movwf centena ;deje el sobrepaso de 10 en unidades
incf milcena,1 ;incremente decenas
return
EJEMPLO DE PROGRAMACIÓN
;______________________________________________________________________________

;RUTINA DE CONVERSION DE DECIMAL A BCD

BIN_A_BCD movwf unidad ;aquí se deposita el binario a convertir


DECIMAL clrf decena
clrf centena
movlw d'100'
OTRA subwf unidad,1 ;restar 100 al valor inicial
btfss STATUS,C ;verifica el carry
goto SUM ;Si es cero deja de restar
incf centena ;si es uno incrementa centena
goto OTRA ;volver a restar
SUM addwf unidad ;sumarle 100
movlw d'10'
REPITE subwf unidad ;restar 10 al valor
btfss STATUS,C ;Verificar el carry
goto SUM1 ;si es cero deja de restar
incf decena ;si es 1 incrementa decena
goto REPITE
SUM1 addwf unidad ;sumarle 10 al valor
retlw 0
EJEMPLO DE PROGRAMACIÓN
MENSAJE_CESAR_UNIPAMPLONA
;__________________________________________________________
call UP_LCD ;RECONFIGURA DENUEVO EL DISPLAY PARA USARLO OTRA VEZ
call LCD_INI
;_____________PRIMERA LINEA DEL DISPLAY____________________
movlw 'C' ;1
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'E' ;2
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'S' ;3
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'A' ;4
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'R' ;5
call LCD_DATOS ;Visualiza Valor cargado en W
movlw '' ;6
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'P' ;7
call LCD_DATOS ;Visualiza Valor cargado en W
movlw '.' ;8
call LCD_DATOS ;Visualiza Valor cargado en W
movlw '' ;9
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'C' ;10
call LCD_DATOS ;Visualiza Valor cargado en W
movlw '.' ;11
call LCD_DATOS ;Visualiza Valor cargado en W
EJEMPLO DE PROGRAMACIÓN
movlw d'192' ;SEGUNDA LINEA DEL DISPLAY
call LCD_REG
movlw 'U' ;1
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'N' ;2
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'I' ;3
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'P' ;4
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'A' ;5
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'M' ;6
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'P' ;7
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'L' ;8
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'O' ;9
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'N' ;10
call LCD_DATOS ;Visualiza Valor cargado en W
movlw 'A' ;11
call LCD_DATOS ;Visualiza Valor cargado en W

RETURN
EJEMPLO DE PROGRAMACIÓN
MENSAJE_TEMPERATURA_ACTUAL

call UP_LCD ;RECONFIGURA DENUEVO EL DISPLAY PARA USARLO OTRA VEZ

;_____________PRIMERA LINEA DEL DISPLAY____________________

movlw d'128' ;SEGUNDA LINEA DEL DISPLAY


call LCD_REG ;

movlw 'T' ;1
call LCD_DATOS ;Visualiza letra a
movlw 'E' ;2
call LCD_DATOS ;Visualiza letra a
movlw 'M' ;3
call LCD_DATOS ;Visualiza letra a
movlw 'P' ;4
call LCD_DATOS ;Visualiza letra a
movlw ':' ;5
call LCD_DATOS ;Visualiza letra a

RETURN
EJEMPLO DE PROGRAMACIÓN
RETARDO_1S movlw .8
movwf RET1
movlw .195
movwf RET2
movlw .212
movwf RET3
decfsz RET3,1
goto $-1
decfsz RET2,1
goto $-5
decfsz RET1,1
goto $-9
retlw 0

include "CONV_AD.lib";libreria de conversion analoga-digital


include "LCD_LIB_CAPC_877_F.lib";libreria control LCD pagina 1

END

También podría gustarte