1. Laboratorio de Microcomputadoras
Facultad de
Ingeniería
Práctica 06
Ortiz Gómez Cristian
Teoría: Grupo 1
Sánchez Segovia Diego Armando
Teoría: Grupo 3
Convertidor
Analógico / Digital
2. Convertidor Analógico / Digital
Objetivo
• Familiarizar al alumno con el uso y aplicación del Convertidor Analógico / Digital de un microcontrolador.
Desarrollo
Realizar los programas solicitados y comprobar su funcionamiento
1. Empleando el canal de su elección del convertidor A/D, realizar un programa en el cual, se acuerdo a una entrada
analógica que se ingrese por este canal, se represente el resultado de la conversión en un puerto paralelo; utilizar el
arreglo de leds para ver la salida, como se muestra en la figura 6.1.
1
ConvertidorAnalógico/Digital
processor 16f877
include <p16f877.inc>
; Variables para el DELAY
val equ h'20'
cte equ 20h
org 0
goto BEGIN
org 5
1
2
3
4
5
6
7
8
9
10
11
Figura 6.1
3. 2
ConvertidorAnalógico/Digital
BEGIN
clrf PORTA ; Limpia el puerto A
clrf PORTB ; Limpia el puerto B
bsf STATUS, RP0
bcf STATUS, RP1 ; Cambia la banco 1
clrf TRISB ; Configura puerto B como salida
clrf ADCON1 ; Configura puertos A y E como analógicos
movlw 3Fh
movwf TRISA ; Configura el puerto A como entrada
bcf STATUS, RP0 ; Regresa al banco 0
movlw b'11000001' ; Configuración ADCON0
movwf ADCON ; ADCS1 = 1 ADCS0 = 1 CHS2 = 0 CHS1 = 0
; CHS0 = 0 GO/DONE = 0 - ADON = 1
GO
bsf ADCON0, 2 ; Conversión en progreso GO/DONE = 1
call DELAY ; Espera a que termine la conversión
DONE
brfsc ADCON0, 2 ; Pregunta por GO/DONE = 0 (Terminó la conversión)
goto DONE ; No, vuelve a preguntar
movf ADRESH, 0 ; Mueve la parte alta de la conversión a W
movwf PORTB ; PORTB = ADRESH (Muestra el resultado)
goto GO ; Regresa a la conversión
DELAY ; Rutina que genera un RETARDO
movlw cte
movwf val
DECREASE
decfsz val
goto DECREASE
return
END
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2. Utilizando el circuito anterior, realizar un programa que indique si el valor del voltaje a la entrada del convertidor
A/D, se encuentra entre los siguientes rangos de voltaje.
Entradas Salidas
PX2 PX1 PX0
Ve < 1/3 < VCC 0 0 1
1/3 VCC < Ve < 2/3 VCC 0 1 1
2/3 VCC < Ve < VCC 1 1 1
Tabla 6.1 Donde Vcc = 5 V
processor 16f877
include <p16f877.inc>
; Variables para el DELAY
val equ h'20'
cte equ 20h
org 0
goto BEGIN
org 5
1
2
3
4
5
6
7
8
9
10
4. 3
ConvertidorAnalógico/Digital
BEGIN
clrf PORTA ; Limpia el puerto A
clrf PORTB ; Limpia el puerto B
bsf STATUS, RP0
bcf STATUS, RP1 ; Cambia la banco 1
clrf TRISB ; Configura puerto B como salida
clrf ADCON1 ; Configura puertos A y E como analógicos
movlw 3Fh
movwf TRISA ; Configura el puerto A como entrada
bcf STATUS, RP0 ; Regresa al banco 0
movlw b'11000001' ; Configuración ADCON0
movwf ADCON ; ADCS1 = 1 ADCS0 = 1 CHS2 = 0 CHS1 = 0
; CHS0 = 0 GO/DONE = 0 - ADON = 1
GO
bsf ADCON0, 2 ; Conversión en progreso GO/DONE = 1
call DELAY ; Espera a que termine la conversión
DONE
brfsc ADCON0, 2 ; Pregunta por GO/DONE = 0 (Terminó la conversión)
goto DONE ; No, vuelve a preguntar
movf ADRESH, 0 ; Mueve la parte alta de la conversión a W
sublw h'55' ; Realiza 55 - W (1/3Vcc = 155h)
btfsc STATUS, 0 ; Verifica si W es menor (Carry = 0?)
goto OUT1 ; Sí, ve a SALIDA1 (Ve < 1/3Vcc)
movf ADRESH, 0 ; No
sublw h'AA' ; AAh - W (2/3Vcc = 1AAh)
btfsc STATUS, 0 ; Verifica si W es menor (Carry=0)
goto OUT2 ; Sí, se cumple que 1/3Vcc < Ve < 2/3Vcc
movf ADRESH, 0 ; No
sublw h'FF' ; FFh - W (Vcc=3ffh)
btfsc STATUS, 0 ; Verifica si W es menor a VCC (Carry=0?)
goto OUT3 ; Sí, se cumple que 2/3Vcc < Ve < Vcc
OUT1
movlw 1 ; Salida 001
movwf PORTB
goto LOOP
OUT2
movlw 3 ; Salida 011
movwf PORTB
goto LOOP
OUT3
movlw 7 ; Salida 111
movwf PORTB
goto LOOP
DELAY ; Rutina que genera un RETARDO
movlw cte
movwf val
DECREASE
decfsz val
goto DECREASE
return
END
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
5. 4
ConvertidorAnalógico/Digital
3. Realizar un programa, de manera que identifique cuál de tres señales analógicas que ingresan al convertidor A/D es
mayor que las otras dos; representar el resultado de acuerdo al contenido en la tabla 6.2.
Señal PB2 PB1 PB0
Ve1 < Ve2 y Ve3 0 0 1
Ve2 < Ve1 y Ve3 0 1 0
Ve3 < Ve1 y Ve2 1 0 0
Tabla 6.2
processor 16f877
include <p16f877.inc>
; Variables para el DELAY
val equ h'20'
cte equ 20h
; Canales
ch1 equ h'21'
ch2 equ h'22'
ch3 equ h'23'
org 0
goto BEGIN
org 5
LOOP
movlw b'11000001' ; Configuración ADCON0 canal 0
movwf ADCON0
bsf ADCON0, 2 ; Conversión en progreso GO/DONE = 1
call DELAY ; Espera que termine la conversión
DONE1
btfsc ADCON0, 2 ; Pregunta por DONE(Termino conversión?)
goto DONE1
movf ADRESH, 0 ; Mueve a W
movwf ch1 ; Guardamos el valor en ch1
movlw b'11001001' ; Configuración ADCON0 canal 1
movwf ADCON0
bsf ADCON0, 2 ; Conversión en progreso GO/DONE = 1
call DELAY ; Espera que termine la conversión
DONE2
btfsc ADCON0, 2 ; Pregunta por DONE(Termino conversión?)
goto DONE1
movf ADRESH, 0 ; Mueve a W
movwf ch2 ; Guardamos el valor en ch2
movlw b'11010001' ; Configuración ADCON0 canal 2
movwf ADCON0
bsf ADCON0, 2 ; Conversión en progreso GO/DONE = 1
call DELAY ; Espera que termine la conversión
1
2
3
4
5
6
7
8
9
10
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
6. 5
ConvertidorAnalógico/Digital
DONE3
btfsc ADCON0, 2 ; Pregunta por DONE(Termino conversión?)
goto DONE3
movf ADRESH, 0 ; Mueve a W
movwf ch3 ; Guardamos el valor en ch3
movf ch1, W ; Mueve cal1 a w
subwf ch2, W ; Realiza canal2 - canal1(w)
btfss STATUS, C ; Verifica si W es mayor
goto ONE_two ; Sí, entonces Ve1 > Ve2
goto TWO_one ; No, entonces Ve2 > Ve1
ONE_two ; Ve1 > Ve2
movf ch1, W
subwf ch3, W ; Realiza canal3 - canal1(W)
btfss STATUS, C ; Verifica si W es mayor
goto ONE_two_three ; Sí, entonces Ve1 > Ve3
goto THREE_one_two ; No, entonces Ve3 > Ve1
TWO_one ; Ve1 < Ve2
movf ch2, W
subwf ch3, W ; Realiza canal3 – canal2(W)
btfss STATUS, C ; Verifica si W es mayor
goto TWO_one_three ; Sí, entonces Ve2 > Ve3
goto THREE_one_two ; No, entonces Ve3 > Ve2
ONE_two_three ; Ve1 > Ve2 y Ve3
movlw 1
movwf PORTB ;Salida 0001
goto LOOP
TWO_one_three ; Ve2 > Ve1 y Ve3
movlw 2
movwf PORTB ;Salida 0010
goto LOOP
THREE_one_two ; Ve3 > Ve1 y Ve2
movlw 4
movwf PORTB ;Salida 0100
goto LOOP
DELAY ; Rutina que genera un RETARDO
movlw cte
movwf val
DECREASE
decfsz val
goto DECREASE
return
END
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Conclusiones
El conversor analógico digital permite medir señales analógicas en forma digital, para ello el PIC cuenta con pines por donde
le llegará la señal analógica, estos pines deben configurarse como entradas analógicas, el conversor A/D cuenta con un
circuito que carga un condensador interno al PIC con la tensión analógica que le está llegando a la entrada analógica, luego
la tensión almacenada en el condensador lo convierte en un número binario de 10 bits que representará la tensión
almacenada en el condensador, este número binario se guarda en sus registros ADRESH y ADRESL de 8 bits cada uno pero
estos actúan como un solo registro de 16 bits.