Академический Документы
Профессиональный Документы
Культура Документы
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:
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 []
=
2 1
Donde:
: Tiene un valor de 5 [V].
n: Bits de conversin (8 Bits).
Entonces:
5
=
255
= 19.60 []
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:
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:
GRUPO N_1 14