Anda di halaman 1dari 14

GRUPO N_1 1

PLANTILLA DEL PROGRAMA:


;**************UNIVERSIDAD DE LAS FUERZAS ARMADAS ESPE**************************
;NOMBRES: ESTEBAN GUATO NRC:2094
; DANIELA SUNTASIG
; CHRISTIAN TERAN
;GRUPO: 1
;*****************************MICROCONTROLADORES**********************************
;***************MODULO DE CONVERSION ANALOGICO DIGITALADC*********************
include "P16f877A.inc"
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _BOREN_ON & _LVP_OFF &
_CPD_OFF & _WRT_OFF & _CP_OFF
; cristal de 4Mhz -> ciclo de maquina de 1 [us]
; Se entiende que inicialmente PORTB debe ser estar configurado como entrada.
CBLOCK
T_C_HOLD ; "VARIABLE", tiempo de adquisicion.
ENDC
; ADCON0 = ||ADCS1||ADCS0||CHS2||CHS1||CHS0||GO/DONE||NOP||ADON||
; ADCON1 = ||ADFM||ADCS2||NOP||NOP||PCFG3||PCFG2||PCFG1||PCFG0||
; NOP = Se lee como cero (0).
ORG 0
bsf STATUS,RP0 ; Ir banco 1
bcf STATUS,RP1
;1. Paso || Configurar que pines seran utilizados como entradas digitales o analogas
;o si se quiere una tensin de referencia diferente a la tensin de trabajo del PIC.
; Ejemplo: 1110
; ||AN7||AN6||AN5||AN4||AN3||AN2||AN1||AN0||
; || D || D || D || D || D || D || D || A ||
; D = Digital.
; A = Analogico.
; ADCON1 = || X || X || 0 || 0 || 1 || 1 || 1 || 0 ||
BSF ADCON1,3 ; PCFG3 = 1
BSF ADCON1,2 ; PCFG2 = 1
BSF ADCON1,1 ; PCFG1 = 1
BCF ADCON1,0 ; PCFG0 = 0
;2. Paso || Elegir el tiempo de conversion adecuado, que tendra que ser mayor a 1.6 [us]
; Ejemplo: 001 -> Fosc/8
; Fosc = 4 [MHz] -> Fosc = 0.5 [MHz] -> T = 2 [us] para que Fosc > 1.6 [us]

GRUPO N_1 2
; ||ADCS2||ADCS1||ADCS0||
; || 0 || 0 || 1 ||
BCF ADCON1,6 ; ADCS2 = 0
bcf STATUS,RP0 ; Ir banco 0
bcf STATUS,RP1
BCF ADCON0,7 ; ADCS1 = 0
BSF ADCON0,6 ; ADCS0 = 1
;3. Paso || Elegir la entrada analogica a leerse
; Ejemplo: 000
; Se elejira Bit AN0
; ||CHS2||CHS1||CHS0||
; || 0 || 0 || 0 ||
BCF ADCON0,5 ; CHS2 = 0
BCF ADCON0,4 ; CHS2 = 0
BCF ADCON0,3 ; CHS2 = 0
;4. Paso || Activar el conversor analgico digital PIC poniendo a 1 el bit 0 del registro ADCON0
; ||ADON||
; || 1 ||
BSF ADCON0,0 ; ADON = 1
;5. Paso || Esperar el tiempo de adquisicin necesario para que el condensador del mdulo
; conversor analgico digital PIC se cargue en forma adecuada 20 [us]
; 1 ciclo de maquina = 1 [us]
; Con la siguiente subrutina generaremos dicho tiempo:
; TIEMPO_ADQUISICION
; DECFSZ T_C_HOLD,1 ; DECFSZ CICLOS DE MAQUINA (1)
; GOTO TIEMPO_ADQUISICION ; GOTO CICLOS DE MAQUINA (2)
; TOTAL = 3 [us]
; RETARDO = N * 3 [us]; donde N = T_C_HOLD
; Si deseamos un RETARDO de 20 [us] -> N = RETARDO / 3[us]
; N = 6.66 -> N = 7
MOVLW B'00000111'
MOVWF T_C_HOLD ; T_C_HOLD = 7
TIEMPO_ADQUISICION
DECFSZ T_C_HOLD,1
GOTO TIEMPO_ADQUISICION ; SI T_C_HOLD != 0 -> T_C_HOLD - 1 -> T_C_HOLD
;6. Paso || Poner a 1 el bit 2 del registro ADCON0 para que comience la conversin de la tensin

GRUPO N_1 3
;almacenada en el condensador y elegir el tipo de almacenamiento de resultado (ADRESH ,
ADRESL)
BSF ADCON0,2 ; GO/DONE = 1
bsf STATUS,RP0 ; Ir banco 1
bcf STATUS,RP1
BSF ADCON1,7 ; ADFM = 1 -> Justificacion a la derecha -> 000000xxxxxxxxxx
;7. Paso || Esperar a que la conversin analgica digital termine mediante la lectura del bit 2 del
;registro ADCON0, la conversin habr terminado cuando el valor de este bit se ponga
;a 0.
; Para ello utilizaremos:
bcf STATUS,RP0 ; Ir banco 0
bcf STATUS,RP1
BTFSC ADCON0,2
;Conversion en proceso GO/DONE = 1
; Si el GO/DONE = 0 -> termino la conversion, salta.
END

Ejemplo:
Disear un circuito capaz de detectar una temperatura mediante el sensor LM35, y
visualizarla en la pantalla LCD16x2. Como se muestra en la figura:
1. Diagrama de conexiones:

Inicialmente debemos comprender como funciona este sensor. El LM35 es un sensor de


temperatura con una precisin calibrada de 1C y un rango que abarca desde -55 a
+150C. La salida es lineal y equivale a 10mV/C por ejemplo:

GRUPO N_1 4
+1500mV = 150C
+250mV = 25C
-550mV = -55C
Para entender el proceso de conversin del mdulo ADC, se tiene lo siguiente:
Suponemos que el sensor detect una temperatura de 26C, por lo tanto se tendr una
salida de 250 mv, este ltimo ser el voltaje de entrada analgico al PIC

= = 260 []

El voltaje de resolucin del PIC16F877A, viene dado por la ecuacin:


=
2 1
Donde:
: Tiene un valor de 5 [V].
n: Bits de conversin (8 Bits).
Entonces:
5
=
255
= 19.60 []

Indica que, a la tensin de referencia de 5[], se le ha partido en 255, partes iguales y


cada una de estas equivalen a 19.60 []. El modulo del PIC contiene un contador anillo,
que variara para las aproximaciones sucesivas.
En la siguiente tabla se muestra el procedimiento, como tal:
Ciclo Binario Decimal
1 260 [] 1 = 2.50 No 10000000 128

2 260 [] 2 = 1.25 No 01000000 64

3 260 [] 3 = 0.62 No 00100000 32

4 260 [] 4 = 0.31 No 00010000 16

5 260 [] 5 = 0.15 Si 00001000 8

6 260 [] 6 = 0.23 Si 00001100 12

7 260 [] 7 = 0.27 No 00001110 14

8 260 [] 8 = 0.25 Si 00001101 13


Donde:

GRUPO N_1 5
=

Luego:
1 = 128 19.60[]
1 = 2.50
Se pregunta entonces s:
1
260 [] 2.50 ()
Entonces Binario recorre un Bit hacia la derecha es decir se hace ms pequeo.
2 = 64 19.60[]
1 = 1.25
Se pregunta entonces s:
2
260 [] 1.25 ()
Como vemos este procedimiento se repite hasta el ciclo 5 donde:
5 = 8 19.60[]
5 = 0.15
Se pregunta entonces s:
5
260 [] 0.15 ()
Guardamos en memoria el Bit que se encontraba en uno y volvemos a recorrer un Bit hacia
la derecha.
Y ahora se tiene:
6 = 12 19.60[]
6 = 0.23
Se pregunta entonces s:
6
260 [] 0.23()
Y nuevamente se procede a guardar en memoria el Bit que se encontraba en uno y
volvemos a recorrer un Bit hacia la derecha.
Y ahora se tiene:
7 = 14 19.60[]
7 = 0.27
7
260 [] 0.27()
Entonces Binario recorre un Bit hacia la derecha es decir se hace ms pequeo.
Luego:
8 = 13 19.60[]
7 = 0.25
8
260 [] 0.25 ()

GRUPO N_1 6
Es aqu donde terminan las iteraciones anillo del mdulo ADC, y por tanto se escoge la
ltima respuesta:
= = 00001101

Como vemos = 00001101 (13C), pero realmente nos debera haber entregado una
respuesta de 00011010 (26C), por lo tanto en este punto se puede apreciar que debemos
duplicar la salida, obteniendo el resultado aproximado.
NOTA:

Para poder visualizar este resultado en la pantalla LCD, se proceder a convertir dicho dato
2, en cdigo BCD separando as unidades, decenas y centenas. Para que al final
mediante la operacin lgica OR, sumemos 30h a cada parte, respectivamente. Enviando
as al LCD la respuesta como tal.

DIAGRAMA DE FLUJO:

GRUPO N_1 7
GRUPO N_1 8
EXPLICACIN DEL CDIGO:

;**************UNIVERSIDAD DE LAS FUERZAS ARMADAS ESPE**************************


;NOMBRES: ESTEBAN GUATO NRC:2094
; DANIELA SUNTASIG
; CHRISTIAN TERAN
;GRUPO: 1
;*****************************MICROCONTROLADORES**********************************
;****************MODULO DE CONVERSION ANALOGICO DIGITA ADC*********************
;*******************************EJERCICIO**********************************************
;Disear un circuito capaz de detectar una temperatura mediante el sensor LM35
; y visualizarla en la pantalla LCD16x2.

GRUPO N_1 9
include "P16f877A.inc"
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _BOREN_ON & _LVP_OFF &
_CPD_OFF & _WRT_OFF & _CP_OFF
CBLOCK 20h ; REGISTROS DE PROPOSITO GENERAL
CONT1_LCD
CONT2_LCD
ESPACIO
T_C_HOLD
CENTENAS
DECENAS
UNIDADES
AUX
ENDC
ORG 0
BSF STATUS,RP0 ; Ir banco 1
BCF STATUS,RP1
MOVLW B'00000000'
MOVWF TRISC ; PORTC COMO SALIDA
MOVLW B'00000000'
MOVWF TRISD ; PORTD COMO SALIDA
MOVLW B'00000000'
MOVWF TRISB ; PORTB COMO SALIDA
MOVLW B'01001110'
MOVWF ADCON1
; ADCON1 = ||ADFM||ADCS2||NOP||NOP||PCFG3||PCFG2||PCFG1||PCFG0||
; ADFM = 0 -> JUSTIFICACION IZQUIERDA ADRESH=XXXXXXXX || ADRESL=XX000000
; ADSC0 = 0 || AJUSTE DE RELOJ DE CONVERSION
; PCFG3 = 1 , PCFG2 = 1 , PCFG1 = 1 , PCFG0 = 0 || -> 1110
; ||AN7||AN6||AN5||AN4||AN3||AN2||AN1||AN0||
; || D || D || D || D || D || D || D || A ||
MOVLW B'11111111'
MOVWF TRISA ; PORTA COMO ENTRADA
BCF STATUS,RP0 ; Ir banco 0
BCF STATUS,RP1
INICIO
CALL INICIA_LCD ; INICIALIZACION DE LCD
GOTO INICIAR_ADC ; INICIALIZACION DE MODULO ADC

GRUPO N_1 10
;///////////////////////INICIALIZACION LCD//////////////////////////////////////
INICIA_LCD
BCF PORTD,0 ; RS = 0 MODO INSTRUCCION
MOVLW 01H ; BORRAR LA PANTALLA
MOVWF PORTC
CALL COMANDO
MOVLW 0CH ; ENCIENDE PANTALLA || DESACTIVAR CURSOR || NO PARPADEA EL
CARACTER
MOVWF PORTC
CALL COMANDO
MOVLW 3CH ; INTERFAZ DE 8 BITS || SE USARA 2 INEAS DEL LCD || CARCTERES DE 5x10
PTOS
MOVWF PORTC
CALL COMANDO
BSF PORTD,0
RETURN
;///////////////////////ENVIO DE INSTRUCCION A LCD//////////////////////////////
COMANDO
BSF PORTD,1 ; E = 1
CALL DELAY_LCD ; RETARDO
CALL DELAY_LCD ; RETARDO
BCF PORTD,1 ; E = 0
CALL DELAY_LCD ; RETARDO
RETURN
;////////////////////////ENVIO DE DATO A LCD////////////////////////////////////
ENVIA
BSF PORTD,0 ; RS = 1 MODO DATO
CALL COMANDO
RETURN
;//////////////////BORRAR LCD///////////////////////////////////////////////////
BORRAR
BCF PORTD,0 ; RS = 0 MODO INSTRUCCION
MOVLW 01H ; BORRAR LA PANTALLA
MOVWF PORTC
CALL COMANDO
bsf PORTD, 0
RETURN

GRUPO N_1 11
;///////////////////RETARDO LCD/////////////////////////////////////////////////
DELAY_LCD
MOVLW B'01111111'
MOVWF CONT1_LCD
CONT1
MOVLW B'00111111'
MOVWF CONT2_LCD
CONT2
DECFSZ CONT2_LCD,1
GOTO CONT2
DECFSZ CONT1_LCD,1
GOTO CONT1
RETURN
;/////////////////////INICIALIZACION DE MODULO ADC//////////////////////////////
INICIAR_ADC
MOVLW B'01000001' ;
MOVWF ADCON0
; ADCON0 = ||ADCS1||ADCS0||CHS2||CHS1||CHS0||GO/DONE||NOP||ADON||
; ADSC1 = 0 , ADCS0 = 1 || -> Fosc = 0.5 [MHz] -> 2 [us]
; CHS2=0 || CHS1=0 || CHS0=0 || -> SELECCION CANAL AN0
; G0/DONE = 0 -> NO SE REALIZA LA CONVERSION ADC AUN.
; ADON = 1 -> SE INICIALIZA EL MODULO ADC AUN
VERIFICAR
BSF ADCON0,2 ; GO/DONE = 1 -> COMIENZA CONVERSION ADC
CALL DELAY_ADC ; RETARDO MODULO ADC 20 [us]
ADCON_0
BTFSC ADCON0,2 ; VERIFICA SI TERMINO LA CONVERSION
GOTO ADCON_0 ; NO TERMINA AUN LA CONVERSION
MOVFW ADRESH ; TERMINO LA CONVERSION ALMACENAMOS EL CONTENIDO DE
ADRESH EN W
MOVWF PORTB ; EL RESULTADO LO MUESTRA EN PORTB
;/////////////////////IMPRESION DE CARACTERES EN LCD////////////////////////////
IMPRIMIR_TEMP
CALL BORRAR ; BORRAR LCD
MOVLW 'T'
MOVWF PORTC
CALL ENVIA

GRUPO N_1 12
MOVLW '='
MOVWF PORTC
CALL ENVIA
CALL CONVERSION_BCD ; SUBRUTINA DE
MOVFW CENTENAS ; IMPRESION DE CENTENAS EN LCD
MOVWF PORTC
CALL ENVIA
MOVFW DECENAS ; IMPRESION DE DECENAS EN LCD
MOVWF PORTC
CALL ENVIA
MOVFW UNIDADES ; IMPRESION DE UNIDADES EN LCD
MOVWF PORTC
CALL ENVIA
MOVLW ' ' ; ESPACIO
MOVWF PORTC
CALL ENVIA
MOVLW h'DF' ; SIMBOLO DE GRADOS CENTIGRADOS
MOVWF PORTC
CALL ENVIA
MOVLW 'C'
MOVWF PORTC
CALL ENVIA
GOTO VERIFICAR ; VUELVE A VERICAR OTRO INGRESO DE DATO ANALOGICO
;///////////////////////////CONVERSION BCD//////////////////////////////////////
CONVERSION_BCD
CLRF CENTENAS ; REGISTROS EN CERO
CLRF DECENAS
CLRF UNIDADES
MOVFW ADRESH ; ADRESH -> W
ADDWF ADRESH,0 ; SUMAMOS EL MISMO VALOR ES DECIR EL DOBLE
MOVWF AUX ; GUARDA EL VALOR EN EL REGISTRO AUX
CENTENAS1
MOVLW d'100' ;W = d'100'
SUBWF AUX,0 ;AUX - d'100' -> W
BTFSS STATUS,C ;AUX MENOR QUE d'100'?
GOTO DECENAS1 ;SI, IR A DECENAS1
MOVWF AUX ;NO, ALMACENA W EN AUX

GRUPO N_1 13
INCF CENTENAS,1 ;INCREMENTA EN 1 A CENTENAS1
GOTO CENTENAS1 ;REGRESA
DECENAS1
MOVLW d'10' ;W=d'10'
SUBWF AUX,0 ;AUX - d'10' -> W
BTFSS STATUS,C ;AUX MENOR QUE d'10'?
GOTO UNIDADES1 ;Si, IR A UNIDADES1
MOVWF AUX ;No, ALMACENA W EN AUX
INCF DECENAS,1 ;INCREMENTA EN 1 A DECENAS1
GOTO DECENAS1 ;REGRESA
UNIDADES1
MOVFW AUX ; W = AUX
MOVWF UNIDADES ; UNIDADES = W
;//////////////////////OBTENCION DE CARACTER ASCII//////////////////////////////
OBTEN_ASCII
MOVLW h'30' ; SUMAMOS 30H A UNIDADES, DECENAS , CENTENAS
IORWF UNIDADES,1 ; UNIDADES + 30H -> UNIDADES
IORWF DECENAS,1 ; DECENAS + 30H -> DECENAS
IORWF CENTENAS,1 ; CENTENAS + 30H -> CENTENAS
RETURN
;//////////////////////RETARDO MODULO ADC///////////////////////////////////////
DELAY_ADC
MOVLW h'30'
MOVWF T_C_HOLD
CICLO
DECFSZ T_C_HOLD,1
GOTO CICLO
RETURN
END
EJERCICIO PROPUESTO:

En base al ejercicio anterior, disear un circuito capaz de detectar una temperatura en


grados Centgrados mediante el mdulo de conversin ADC, con la cualidad de que si
supera los 40 C, se encender un ventilador, durante un tiempo estimado.

GRUPO N_1 14