Está en la página 1de 32

MICROCONTROLADORES

P.G.F.

CONVERSOR A/D

CONVERSOR A/D
El PIC16F877 posee un conversor A/D de 10 Bits de resolucin y 8 canales.

Resolucin = ( VREF+ - VREF- ) / 1024


La tensin de referencia se puede implementar como la tensin interna de alimentacin o la aplicada por las patillas RA3/AN3/ VREF+ y RA2/AN2/ VREFEjemplo: Usando la tensin interna VREF+ = VDD VREF- = VSS Resolucin = (5 - 0) / 1024 = 4.8828 mV

CONVERSOR A/D
VREF+ = 5v
DATO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 VALOR (V) 0,012 0,048 0,108 0,192 0,3 0,432 0,588 0,768 0,972 1,2 1,452 1,728 2,028 2,352 2,7 3,072 3,468 3,888 4,332 4,8

VREF- = 0v
VALOR(V) / 4,8828 (mV) N DIVISIONES 2,5 3 9,8 10 22,1 23 39,3 40 61,4 62 88,5 89 120,4 121 157,3 158 199,1 200 245,8 246 297,4 298 353,9 254 415,3 416 481,7 482 553,0 553 629,1 630 710,2 711 796,3 797 887,2 888 983,0 983

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

ADCS1- ADCS1 : bits de seleccin del reloj de conversin 00 FOSC / 2 01 FOSC / 8 10 FOSC / 32 11 FRC (Oscilador interno)

REGISTRO ADCON0
SELECCIN TAD TAD 2*TOSC 8*TOSC 32*TOSC RC ADCS1- ADCS1 00 01 10 11 20 MHz 100ns 400ns 1.6s 2-6s FRECUENCIA DE TRABAJO 5 MHz 400ns 1.6ns 6.4s 2-6s 1.25 MHz 1.6s 6.4s 2.6s 2-6s 333.33 kHz 6s 24s 96s 2-6s

Tiempos NO vlidos

Tiempos Mnimos

Tiempos validos

TAD = Tiempo que dura la conversin de cada bit En la conversin de 10 bit el mnimo tiempo que requiere es de 12 * TAD En los PIC 16F87X el tiempo NO puede ser inferior a 1.6s

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

CHS2:CHS0 : bits de seleccin de canal anlogo 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 - Conversin en progreso (comienza la conversin A/D) 0 - Final de conversin ADON 1 - Mdulo de conversin activado 0 - Mdulo de conversin desactivado

REGISTRO ADCON1
ADFM PCFG3 PCFG2 PCFG1 PCFG0

ADFM: Formato modulo A/D 1 - Justificacin a la derecha, 6 Bit ms significativos de ADRESH son ledos como 0 0 - Justificacin a la izquierda, 6 Bit menos significativos de ADRESL son ledos como 0

REGISTRO ADCON1
ADFM PCFG3 PCFG2 PCFG1 PCFG0

REGISTRO ADCON1
ADFM PCFG3 PCFG2 PCFG1 PCFG0
PCFG3-PCFG0: Bits de configuracin del puerto A/D

PASOS PARA LA CONVERSIN A/D


Configurar las pines de captura de datos anlogos como entrada, los pines restantes como se quiera y la tensin de referencia con el registro ADCON1. Seleccionar el reloj de conversin, el canal de entrada A/D y activar el modulo de conversin A/D con ADCON0. Configurar interrupciones si se desea:
Borrar bandera de interrupcin A/D (ADIF del registro PIR1) Habilitar interrupcin A/D poniendo a 1 el bit ADIE del registro PIE1 Habilitar el bit de interrupciones globales (GIE) y el bit de interrupciones de perifricos externos

Tiempo de espera para la activacin

PASOS PARA LA CONVERSIN A/D


Inicio de la conversin ( Poner a 1 el bit GO/DONE# de ADCON) Tiempo de esperar para conversin (verificar cuando el bit ADCON0<GO> cambia a cero) Lectura del resultado ADRESH:ADRESL de la conversin en

LIBRERA CONVERSION A/D


;-----------------------------------------------------------------------;LIBRERIAS DE RUTINAS CREADAS O MODIFICADAS POR P.G.F. ;TEMA: CONVERSION ANALOGA DIGITAL ;NOTA: Crear los registros R_CONVER_H y R_CONVER_L ;-----------------------------------------------------------------------CONVER_INI bcf bsf clrf bsf bsf bcf bcf movlw movwf clrf clrf RETURN STATUS,RP1 STATUS,RP0 ADCON1 ADCON1,7 ADCON1,2 STATUS,RP0 STATUS,RP1 b'11000001' ADCON0 R_CONVER_H R_CONVER_L ;Oscilador RC interno, canal 0, Mdulo CAD activo ;activacin del conversor ;inicializa variable donde se almacena conversin A/D ;inicializa variable donde se almacena conversin A/D ;Configura todo el puerto B como AD ;**Pone la mayora de # en ADRESL ;**Pone en 1 PCFG2 - Ra3,1,0 anlogos ;Banco 0

LIBRERA CONVERSION A/D


;*********RUTINA PARA ADQUIRIR DATO ANALOGO POR RA0*********** CONVER_RA0 bsf bcf clrf bsf bcf movlw movwf nop nop nop nop nop nop nop nop nop nop STATUS,RP0 STATUS,RP1 ADCON1 ADCON1,ADFM STATUS,RP0 b'11000001' ADCON0 ;Pasa al banco 1 ;Pasa al banco 1 ;Configura todo el puerto B como AD ;**Pone la mayora de # en ADRESL ;Pasa al banco 0 ;Oscilador RC interno, canal 0 ;activacin del conversor ;tiempo para activacin

LIBRERA CONVERSION A/D


bsf FIN_RA0 btfsc goto nop movf movwf bsf movf bcf movwf RETURN ADRESH,w R_CONVER_H STATUS,RP0 ADRESL,w STATUS,RP0 R_CONVER_L ;traslada los bit mas significativos a w ;muestra la captura en el registro ;BANCO 1 ;traslada los bit mas significativos a w ;BANCO 0 ;muestra la captura en el registro ADCON0,GO ADCON0,GO FIN_RA0 ;Inicio de conversin

LIBRERA CONVERSION A/D


;*********RUTINA PARA ADQUIRIR DATO ANALOGO POR RA1*********** CONVER_RA1 bsf bcf clrf bsf bcf movlw movwf nop nop nop nop nop nop nop nop nop nop STATUS,RP0 STATUS,RP1 ADCON1 ADCON1,ADFM STATUS,RP0 b'11001001' ADCON0 ;Pasa al banco 1 ;Pasa al banco 1 ;Configura todo el puerto B como AD ;**Pone la mayoria de # en ADRESL ;Pasa al banco 0 ;Oscilador RC interno, canal 0 ;activacin del conversor ;tiempo para activacin

LIBRERA CONVERSION A/D


bsf FIN_RA1 btfsc goto nop movf movwf bsf movf bcf movwf RETURN ADRESH,w R_CONVER_H STATUS,RP0 STATUS,RP0 R_CONVER_L ;traslada los bit mas significativos a w ;muestra la captura en el registro ;BANCO 1 ;BANCO 0 ;muestra la captura en el registro ADCON0,GO ADCON0,GO FIN_RA1 ;Inicio de conversin

ADRESL,w ;traslada los bit mas significativos a w

BINARIO A BCD

0 0 0 0 0 0 1 0
Centenas = 2

1 1 1 1 1 1 1 1
REG1 = 255

0 0 0 0 0 1 0 1
Decenas = 5

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 DECIMAL clrf clrf movlw OTRA subwf btfss goto incf goto SUM addwf movlw REPITE subwf btfss goto incf goto SUM1 addwf retlw unidad decena centena d'100' unidad,1 STATUS,C SUM centena OTRA unidad d'10' unidad STATUS,C SUM1 decena REPITE unidad 0 ;aqui se deposita el binario a convertir

;restar 100 al valor inicial ;verifica el carry ;Si es cero deja de restar ;si es uno incrementa centena ;volver a restar ;sumarle 100 ;restar 10 al valor ;Verificar el carry ;si es cero deja de restar ;si es 1 incrementa decena ;sumarle 10 al valor

EJEMPLO DE PROGRAMACIN
;AUTOR: P.G.F. ;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 amplificacin ;CARACTERISTICAS: ;OSCILLATOR: XT ;WATCHDOG TIMER: OFF ;POWER UP TIMER: ON ;BROWN OUT DETECT: OFF ;LOW VOLTAGE PROGRAM: ;FLASH PROGRAM WRITE: ;BACKGROUND DEBUG: DISABLED ;DATA EE READ PROTECT: ;CODE PROTECT: OFF

DISABLE WRITE PROTECTION OFF 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 PROGRAMACIN
INICIO bcf bsf bcf bcf movlw movwf movlw movwf clrf bcf bcf call call call STATUS,RP1 STATUS,RP0 1,7 TRISE,PSPMODE b'00000010' TRISD b'00000011' TRISC TRISE STATUS,RP0 STATUS,RP1 ;Resistencias pull up ACTIVAS ;Desactiva puerto paralelo esclavo ;Afecta puerta D tambin ;puerto D como salida y el RD1 para RF ;Configura puerto C para verificar sensores ;puerto E como salida ;Banco 0

MENSAJE_CESAR_UNIPAMPLONA RETARDO_1S LCD_INI ;Borra LCD

call CONVER_INI ;Configura el PIC para conversin A/D CICLO ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MUESTRA_1call CONVER_RA0 ;realiza conversin por RA0

EJEMPLO DE PROGRAMACIN
;CON CADA DIVISION DEL CONVERSOR (4.88mV) REPRESENTARA UNA DECIMA DE GRADO movf R_CONVER_L,W clrf milcena call BIN_A_BCD btfsc call btfsc call call movf addlw call movf addlw call movf addlw call movlw call movf addlw call goto R_CONVER_H,0 SUMA_256 R_CONVER_H,1 SUMA_512 MENSAJE_TEMPERATURA_ACTUAL milcena,w 30 LCD_DATOS centena,w 30 LCD_DATOS decena,w 30 LCD_DATOS '.' LCD_DATOS unidad,w 30 LCD_DATOS CICLO

EJEMPLO DE PROGRAMACIN
;-----------------------------------------------------------------------------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 addlw movwf movf addlw movwf movf addlw movwf goto unidad,W d'2' unidad decena,W d'1' decena centena,W d'5' centena VER_UNIDAD

;------------------------------------------------------------------------------

EJEMPLO DE PROGRAMACIN
VER_UNIDAD movf sublw btfss goto clrf incf goto VER_UNIDAD_2 movlw subwf btfss goto movwf incf goto VER_DECENA movf sublw btfss goto clrf incf goto unidad,W d'10' STATUS,2 VER_UNIDAD_2 unidad decena,1 VER_DECENA d'10' unidad,0 STATUS,C VER_DECENA unidad decena,1 VER_DECENA decena,W d'10' ;Compara STATUS,2 VER_DECENA_2 decena centena,1 VER_CENTENA ;Carga W con el ultimo dato leido ;Compara ;Si es igual salta ;unidad = 0 ;incremente decenas

;restar 10 ;verifica el carry ;Si es cero deja de restar ;deje el sobrepaso de 10 en unidades ;incremente decenas

;Carga W con el ultimo dato leido ;Si es igual salta ;unidad = 0 ;incremente decenas

EJEMPLO DE PROGRAMACIN
VER_DECENA_2 movlw subwf btfss goto movwf incf VER_CENTENA movf sublw btfss goto clrf incf return VER_CENTENA_2 movlw subwf btfss return movwf incf return d'10' decena,0 STATUS,C VER_CENTENA decena centena,1 ;restar 10 ;verifica el carry ;Si es cero deja de restar ;deje el sobrepaso de 10 en decenas ;incremente centenas

centena,W ;Carga W con el ultimo dato leido d'10' ;Compara STATUS,2 ;Si es igual salta VER_CENTENA_2 centena ;unidad = 0 milcena,1 ;incremente decenas d'10' centena,0 STATUS,C centena milcena,1

;restar 10 ;verifica el carry ;Si es cero deja de restar ;deje el sobrepaso de 10 en unidades ;incremente decenas

EJEMPLO DE PROGRAMACIN
;______________________________________________________________________________ ;RUTINA DE CONVERSION DE DECIMAL A BCD BIN_A_BCD movwf DECIMAL clrf clrf movlw OTRA subwf btfss goto incf goto SUM addwf movlw REPITE subwf btfss goto incf goto SUM1 addwf retlw unidad decena centena d'100' unidad,1 STATUS,C SUM centena OTRA unidad d'10' unidad STATUS,C SUM1 decena REPITE unidad 0 ;aqu se deposita el binario a convertir

;restar 100 al valor inicial ;verifica el carry ;Si es cero deja de restar ;si es uno incrementa centena ;volver a restar ;sumarle 100 ;restar 10 al valor ;Verificar el carry ;si es cero deja de restar ;si es 1 incrementa decena ;sumarle 10 al valor

EJEMPLO DE PROGRAMACIN
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 PROGRAMACIN
movlw d'192' call LCD_REG movlw 'U' call LCD_DATOS movlw 'N' call LCD_DATOS movlw 'I' call LCD_DATOS movlw 'P' call LCD_DATOS movlw 'A' call LCD_DATOS movlw 'M' call LCD_DATOS movlw 'P' call LCD_DATOS movlw 'L' call LCD_DATOS movlw 'O' call LCD_DATOS movlw 'N' call LCD_DATOS movlw 'A' call LCD_DATOS RETURN ;SEGUNDA LINEA DEL DISPLAY ;1 ;Visualiza Valor cargado en W ;2 ;Visualiza Valor cargado en W ;3 ;Visualiza Valor cargado en W ;4 ;Visualiza Valor cargado en W ;5 ;Visualiza Valor cargado en W ;6 ;Visualiza Valor cargado en W ;7 ;Visualiza Valor cargado en W ;8 ;Visualiza Valor cargado en W ;9 ;Visualiza Valor cargado en W ;10 ;Visualiza Valor cargado en W ;11 ;Visualiza Valor cargado en W

EJEMPLO DE PROGRAMACIN
MENSAJE_TEMPERATURA_ACTUAL call UP_LCD ;RECONFIGURA DENUEVO EL DISPLAY PARA USARLO OTRA VEZ ;_____________PRIMERA LINEA DEL DISPLAY____________________ movlw d'128' call LCD_REG movlw 'T' call LCD_DATOS movlw 'E' call LCD_DATOS movlw 'M' call LCD_DATOS movlw 'P' call LCD_DATOS movlw ':' call LCD_DATOS RETURN ;SEGUNDA LINEA DEL DISPLAY ; ;1 ;Visualiza letra a ;2 ;Visualiza letra a ;3 ;Visualiza letra a ;4 ;Visualiza letra a ;5 ;Visualiza letra a

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

include "CONV_AD.lib";libreria de conversion analoga-digital include "LCD_LIB_CAPC_877_F.lib";libreria control LCD pagina 1 END