0% encontró este documento útil (0 votos)
2 vistas10 páginas

Módulo ADC en Microcontroladores PIC

La práctica 4 se centra en la utilización del módulo ADC en microcontroladores PIC para diseñar sistemas que interactúan con componentes analógicos. Se detallan los objetivos de inicialización del ADC, la lectura de datos y la representación en displays de 7 segmentos. Además, se proporciona un procedimiento paso a paso para construir el circuito, programar el microcontrolador y realizar pruebas con diferentes tensiones.

Cargado por

odelacruz1817
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
2 vistas10 páginas

Módulo ADC en Microcontroladores PIC

La práctica 4 se centra en la utilización del módulo ADC en microcontroladores PIC para diseñar sistemas que interactúan con componentes analógicos. Se detallan los objetivos de inicialización del ADC, la lectura de datos y la representación en displays de 7 segmentos. Además, se proporciona un procedimiento paso a paso para construir el circuito, programar el microcontrolador y realizar pruebas con diferentes tensiones.

Cargado por

odelacruz1817
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Practica 4

Practica 4: Utilización del módulo ADC en los


microcontroladores PIC.

Objetivo general
• Utilizar el módulo ADC de los microcontroladores PIC para diseñar sistemas que interactúen con
componentes analógicos.

Objetivos específicos
• Conocer la forma de inicialización del módulo ADC así como la forma en que se inician las
conversiones y se verifica su finalización.
• Utilizar la técnica de alineación a la izquierda para realizar lecturas de 8 bits.
• Utilizar display de 7 segmentos para representar cantidades en hexadecimal.

Introducción
Analizaremos la forma de configuración de los puertos de conversión analógica – digital para
obtener el valor de una señal de entrada que esta de forma análoga y poder obtener su valor digital
para desplegar esa información en un dispositivo de visualización como puede ser un display de 7
segmentos.

Los puntos a abordar son:

• Puertos de entrada/salida digitales


• Interrupciones
• Convertidor analógico/digital

Materiales y equipo
• Computadora personal, sistema operativo Windows 7 ò superior, software MPLAB IDE v8.88 y
PICkit 2.
• Tarjeta entrenadora TEC-PIC877 V1.0 R1
• Protoboard.
• Programador MiniPROG +.
• Fuente de poder de 12Vcd a 1A o un cable de USB A macho / B macho
• 4 display de 7 segmentos de ánodo común.
• 7 resistencias de 330 Ω
• 4 transistores MPS2222 (NPN).
• 4 resistencias de 330 Ω
• Potenciómetro de 10 KΩ
• Multímetro digital.
pág. 35
Practica 4

• Cable UTP categoría 5.

Procedimiento
1. Construya el circuito que se le presenta en la figura 10.

pág. 36
Practica 4

Figura 10: Esquemático Practica 4


pág. 37
Practica 4

2. A continuación ejecute el programa MPLAB. Cree un nuevo proyecto con el PIC16F873A.


3. Copie el siguiente programa en el proyecto.

List p=16f877A ; list directive to define processor


#include <[Link]> ; processor specific variable definitions

;***** VARIABLE DEFINITIONS********


CBLOCK 0x20
w_temp ; variable used for context saving
status_temp ; variable used for context saving
VALUE_ADC
CONTEO_RETARDO
VAR
Var_Aux
HEXADECIMAL
ASCII_H
ASCII_M
ASCII_L
ENDC

;**************************************************************************
;* Macros to select the register bank Many bank changes can be optimised *
;* when only one STATUS bit changes *
;**************************************************************************
Bank0 MACRO ;macro to select data RAM bank 0
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank1 MACRO ;macro to select data RAM bank 1
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
Bank2 MACRO ;macro to select data RAM bank 2
bcf STATUS,RP0
bsf STATUS,RP1
ENDM
Bank3 MACRO ;macro to select data RAM bank 3
bsf STATUS,RP0
bsf STATUS,RP1
ENDM

;*************************************************************************
ORG 0x000 ; processor reset vector
Clrf PCLATH ; ensure page bits are cleared
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
bcf STATUS,RP0 ; ensure file register bank set to 0
movwf status_temp ; save off contents of STATUS register

pág. 38
Practica 4

; isr code can go here or be located as a call subroutine elsewhere

bcf STATUS,RP0 ; ensure file register bank set to 0


movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt

;***********************************************************************
; Código principal *
;***********************************************************************
main ; remaining code goes here
call INIT_PORTS
call LEER_CANAL_0
call DISPLAY
goto $-2

;***********************************************************************
;* Rutina para leer el chennel 0 del A/D *
;***********************************************************************
;* Se inicializa ahora el registro ADCON0 del ADC. Nótese que se usa *
;* el reloj interno del ADC debido a que la velocidad no es critica y *
;* la aplicación no requiere exactitud en la velocidad de conversión. *
;* Nota: en caso de usar varios canales, puede modificarse el registro *
;* ADCON0 para intercambiarlos. *
;***********************************************************************
LEER_CANAL_0
movlw 0xC1 ;Selecciona el reloj interno, selecciona
;también el canal cero del
movwf ADCON0 ; ADC (AN0) y activa el ADC
call CONVERTIR ;Salta a la rutina de conversión del A/D
movf ADRESH, W
movwf VALUE_ADC
movwf PORTD
return

;***********************************************************************
;* Rutina para la conversión del A/D *
;***********************************************************************
CONVERTIR
movlw 0x04
movwf VAR
decfsz VAR, F ;Tiempo de retardo para la conversión
goto $-1
clrf ADRESH ;Limpia el registro de resultado del A/D
bsf ADCON0, GO_DONE ;Conversión en progreso
LOOP_AD
btfsc ADCON0, GO_DONE ;Brinca mientras la conversión
goto LOOP_AD ;es completada
bcf ADCON0, ADON ;Modulo de conversión fuera de progreso

pág. 39
Practica 4

return

;***********************************************************************
;* Rutina para desplegar la lectura del A/D en los display de *
;* siete segmentos. *
;***********************************************************************
DISPLAY ;Display parte alta.
movf VALUE_ADC, W
call Hex_Ascii
movlw HIGH TABLA
movwf PCLATH
movf ASCII_H, W ;valor del digito menos significativo
call TABLA ;Lo convierte a segmentos
movwf Var_Aux ;Carga el valor de W a la variable Var_Aux
movwf PORTE ;Coloca en el puerto E
btfss Var_Aux, 3 ;si el bit 3 de la variable Var_Aux es uno
goto $+3 ;brinca tres instrucciones adelante
bsf PORTA, 5 ;Pone en uno el bit 5 del puerto A
goto $+2 ;Brinca 2 instrucciones adelante
bcf PORTA, 5 ;Pone en cero el bit 5 del puerto A
bsf PORTC, 0 ;Activa el digito menos significativo
movlw d'5' ;Se genera un retardo de 5ms
call Retardo
bcf PORTC, 0 ;Desactiva el catodo común
movlw HIGH TABLA
movwf PCLATH
movf ASCII_M, W ;valor del digito menos significativo
call TABLA ;Lo convierte a segmentos
movwf Var_Aux ;Carga el valor de W a la variable Var_Aux
movwf PORTE ;Coloca en el puerto E
btfss Var_Aux, 3 ;si el bit 3 de la variable Var_Aux es uno
goto $+3 ;brinca tres instrucciones adelante
bsf PORTA, 5 ;Pone en uno el bit 5 del puerto A
goto $+2 ;Brinca 2 instrucciones adelante
bcf PORTA, 5 ;Pone en cero el bit 5 del puerto A
bsf PORTC, 3 ;Activa el digito menos significativo
movlw d'5' ;Se genera un retardo de 5ms
call Retardo
bcf PORTC, 3 ;Desactiva el catodo común
movlw HIGH TABLA
movwf PCLATH
movf ASCII_L, W ;valor del digito menos significativo
call TABLA ;Lo convierte a segmentos
movwf Var_Aux ;Carga el valor de W a la variable Var_Aux
movwf PORTE ;Coloca en el puerto E
btfss Var_Aux, 3 ;si el bit 3 de la variable Var_Aux es uno
goto $+3 ; brinca tres instrucciones adelante
bsf PORTA, 5 ;Pone en uno el bit 5 del puerto A
goto $+2 ;Brinca 2 instrucciones adelante
bcf PORTA, 5 ;Pone en cero el bit 5 del puerto A
bsf PORTC, 4 ;Activa el digito menos significativo

pág. 40
Practica 4

movlw d'5' ;Se genera un retardo de 5ms


call Retardo
bcf PORTC, 4 ;Desactiva el catodo común
return

;***********************************************************************
; Configuración de los puertos *
;***********************************************************************
INIT_PORTS
Bank1 ; Select Bank 1
movlw 0x0E ;Configura los canales para usar solo RA0/AN0 y
movwf ADCON1 ;selecciona la justificación a la izquierda
movlw 0x01 ;Se coloca RA0 como entrada (análoga). El resto
movwf TRISA ; son salidas (incluyendo a RA1 y RA2).
movlw 0x00 ;Todo el puerto C se establece como salidas
movwf TRISC
movlw 0x00 ;Todo el puerto D se establece como salidas
movwf TRISD
movlw 0x00 ;Todo el puerto E se establece como salidas
movwf TRISE
Bank0 ; Select Bank 0
clrf PORTA
clrf PORTD
clrf PORTC
clrf PORTE
return

;***********************************************************************
;* Rutina de retardo variable *
;***********************************************************************
;*Esta rutina genera un retardo según la cantidad de milisegundos *
;*indicada en el acumulador. Si el acumulador vale 0, el retardo *
;*es de 256ms. *
;***********************************************************************
Retardo
movwf CONTEO_RETARDO ;Guarda la cuenta en memoria
NUEVO_RETARDO
movlw d'250'
RETARDO_1ms
addlw -d'1' ;Resta uno en el acumulador - 1 clock
btfss STATUS, Z ;Verifica si llego a cero - 1 clock
goto RETARDO_1ms ;Continua mientras no termina - 2 clock

;***********************************************************************
;* Calculo para el retardo interno *
;***********************************************************************
;* 4 x Numero de iteraciones x Instrucciones por iteración *
;* T = ------------------------------------------------------------ *
;* frecuencia de oscilador *
;* *
;* 4 x 250 x 4 *

pág. 41
Practica 4

;* T= ---------------- = 1ms *
;* 4MHz *
;***********************************************************************
decfsz CONTEO_RETARDO, f ;Decrementa la cuenta de milisegundos
goto NUEVO_RETARDO ;Mientras no sea cero, repite
return ;Cuando llega a cero, retorna

;***********************************************************************
; Convierte el valor binario a hexadecimal Ascii *
;***********************************************************************
Hex_Ascii
movwf HEXADECIMAL
clrf ASCII_H ;Para BCD D'0'
clrf ASCII_M ;Para BCD D'0'
clrf ASCII_L ;Para BCD D'0'
Centenas
movlw D'100' ;D'100' --> W
subwf HEXADECIMAL,W ;HEXADECIMAL - D'100' --> W
btfss STATUS,C ;ø HEXADECIMAL es menor que D'100' ?
goto Decenas ;Si
movwf HEXADECIMAL ;Salva el resto
incf ASCII_H,F ;Incrementa el contador de centenas BCD
goto Centenas ;Vuelve por otros D'100'
Decenas
movlw D'10' ;D'10' --> W
subwf HEXADECIMAL,W ;HEXADECIMAL - D'10' --> W
btfss STATUS,C ;ø HEXADECIMAL es menor que D'10' ?
goto Unidades ;Si
movwf HEXADECIMAL ;Salva el resto
incf ASCII_M,F ;Incrementa el contador de decenas BCD
goto Decenas ;Vuelve por otros D'10'
Unidades
Movf HEXADECIMAL,W ;El resto pertenece
Movwf ASCII_L ;a las unidades BCD
Clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL
Return ;Retorna

;**********************************************************************
;*Rutina de tabla de conversión para display de 7 segmentos. *
;*Esta rutina toma el valor de un digito hexadecimal en W, y lo *
;*convierte al valor que activa los segmentos del display para *
; desplegarlo. *
;**********************************************************************
TABLA
addwf PCL, f

retlw b'0000' ;0
retlw b'0001' ;1
retlw b'0010' ;2
retlw b'0011' ;3
retlw b'0100' ;4

pág. 42
Practica 4

retlw b'0101' ;5
retlw b'0110' ;6
retlw b'0111' ;7
retlw b'1000' ;8
retlw b'1001' ;9

END ; directive 'end of program'


Listado 4 – Código fuente.

4. Compile el programa y verifique que no se generen errores.


5. Prepare el programador conectando el cable USB a la computadora.
6. Ejecute la rutina de detección automática del dispositivo para que el software quede configurado.

7. Grabe el programa en el PIC. Una vez terminado, corrobore que el programa fue programado
correctamente con la rutina de comprobación del MPLAB.

8. En estos momentos los display deberían estar mostrando una cantidad en decimal. ¿Qué
cantidad presentan?
9. Ajuste la perilla del potenciómetro y verifique que la lectura del display cambia conforme la
mueve.
10. Ajuste la tensión en el pin RA0 a 0V ayudándose del multímetro. ¿Qué valor se presenta en los
display?
11. Ahora ajuste la tensión en RA0 a 5V y anote el resultado.
12. Finalmente, ajuste la tensión a 2.5V y anote el resultado.
13. Modifique el programa de manera que el microcontrolador muestre en un LED de RC1 encienda
en caso que el voltaje exceda los 4V, y que se apague en caso que se reduzca por debajo de 1V.
Una vez realizados los cambios, compile su programa y descárguelo para verificar su
funcionamiento.

Análisis de resultados
• ¿Los valores medidos en los pasos 12, 13 y 14 son adecuados? Determine los valores teóricos
y compárelos con los obtenidos.
• Si se tuviera un sensor de temperatura conectado al ADC, ¿de qué manera podría activarse un
ventilador en caso que la temperatura exceda cierto valor? ¿Qué cambios habría que realizar
al programa presentado en la práctica para lograrlo?

pág. 43
Practica 4

Investigación complementaria
• Investigue qué aplicaciones puede dársele a un ADC para sistemas de control de lazo cerrado.
• ¿Qué es y en que consiste el efecto conocido como “aliasing”?
¿Qué relación posee con el ADC?

Referencias bibliográficas
• Hoja técnica del microcontrolador PIC16F877:
[Link]
• Palacios, Enrique - Remiro, Fernando y López, Lucas.
Microcontrolador PIC16F84: Desarrollo de proyectos. Segunda edición. Coedición Alfaomega
RA-MA.

pág. 44

También podría gustarte