Vous êtes sur la page 1sur 11

UNIVERSIDAD NACIONAL DEL

CALLAO
FACULTAD DE INGENIERÍA ELÉCTRICA Y ELECTRÓNICA

ESCUELA PROFESIONAL DE INGENIERÍA ELECTRÓNICA

CONTROL DE TEMPERATURA CON PIC


16F877A

CURSO : ELECTRÓNICA DE POTENCIA 1

PROFESOR : Ing. RUSEL CORDOVA

ALUMNOS:

1 9 6 6
BELLAVISTA – CALLAO
2009
CONTROL DE TEMPERATURA CON PIC 16F877A

o DIAGRAMA DE BLOQUES:

TECLADO
(set point)

SENSOR ADC uC ETAPA DE


(T0 ext) POTENCIA

VISUALIZACION

o SENSOR LM35

Descripción: El LM35 es un sensor de temperatura con una precisión calibrada de


1ºC y un rango que abarca desde -55º a +150ºC.
El sensor se presenta en diferentes encapsulados pero el mas común es el to-92 de
igual forma que un típico transistor con 3 patas, dos de ellas para alimentarlo y la
tercera nos entrega un valor de tensión proporcional a la temperatura medida por
el dispositivo. Con el LM35 sobre la mesa las patillas hacia nosotros y las letras del
encapsulado hacia arriba tenemos que de izquierda a derecha los pines son: VCC -
Vout - GND.
La salida es lineal y equivale a 10mV/ºC por lo tanto:
• +1500mV = 150ºC
• +250mV = 25ºC
• -550mV = -55ºC
o CONVERSIÓN A/D Y PROCESADO DE SEÑAL

Resolución

Vref Vref Volts


RES = =
2 8 −1 255 bits

Voltaje de Temperatura
entrada CONVERSOR en bits

A/D
0.01T

0.01T 0.01T
=T → =T → Vref = 2.55 Volts
LUEGO: RESO LU CIO N Vref
255

Conversión AD: El uC 16F877A tiene el siguiente módulo conversor:

El voltaje de referencia de 2.55 V se introducirá por RA3 y el canal elegido para la


conversión es RA0, el valor de la conversión se almacena en los registros ADRESH y
ADRESL siendo por defecto los de ADRESH los de mayor peso.
Para activar la conversión se pone el bit ADON en “1” y para comenzar la
conversión se activa el bit GO, ambos bits estan en el registro ADCON0.
En el bloque S/H se hace el muestreo de la señal para ser digitalizada en la
siguiente etapa.

Una vez que se tiene el valor de la temperatura en ADRESH se compara con el


valor introducido por el teclado.

Si el valor sensado es menor que el rango establecido anteriormente, entonces


D1=ON y D2=OFF.

Si el valor censado esta dentro del rango establecido anteriormente, entonces


D1=OFF y D2=OFF.

Si el valor censado es mayor que el rango establecido anteriormente, entonces


D1=OFF y D2=ON.

Para la visualización de la temperatura en LCD se transforma el valor que esta en


ADRESH a código ascii a través de una rutina de conversión. Luego este valor es
enviado al LCD por medio del comando EnviaCarLCD que forma parte de una rutina
de manejo de LCD la cual será adjuntada en la última parte del trabajo.

Para capturar la tecla pulsada se usa una rutina la cual explora el teclado y
devuelve el valor de esta en un registro.
o DIAGRAMA DE FLUJOS

CONFIGURACION
DE REGISTROS

PULSO HELP?

NO

SI

INGRESAR T1 < 150

INGRESAR T2 < 150

ACTIVAR
CONVERSOR

TERMINO
CONVERSION?
NO

SI

ENVIAR A LCD

NO
Text < T1?

NO
T1 < Text < T2? SI

D1 = ON
SI
D2 = OFF

Text > T2
D1 = OFF
D1 = OFF
D2 = OFF
D2 = ON
o LENGUAJE EN ASSEMBLER

LIST P=16F877A
INCLUDE <P16F877A.INC>
INCLUDE <MACROPIC.INC>
__CONFIG _XT_OSC &_LVP_OFF &_WDT_OFF
CBLOCK 0x20
ENDC
T_1 EQU 0x22
T_2 EQU 0x23
INDICADOR EQU 0x24
AUX EQU 0x25
AUX2 EQU 0x26
REG1 EQU 0x27
REG2 EQU 0x28
REG3 EQU 0x29
TEMPER EQU 0x2A
ASCII_H EQU 0x2B
ASCII_M EQU 0x2C
ASCII_L EQU 0x2D
HEXADECIMAL EQU 0x2E
Key_var equ 0x2F
ORG 00H
goto EMPEZAR
org 0x05
include <TECLADO2.INC>
EMPEZAR
BSF STATUS,RP0 ;banco 1
BSF TRISA,0 ;entrada de sensor
BSF TRISA,3 ;voltaje Ref=5.1
CLRF TRISB
MOVLW B'11111100'
MOVWF TRISC ;salidas para LEDs
CLRF TRISD
BSF ADCON1,0 ;para permitir ingreso de Vref=5.1V
bcf OPTION_REG,7 ;resistencias Pull Up activada
BCF STATUS,RP0 ;banco_0
;;;configuracion de conversor AD
MOVLW B'11000001' ;RA0=entrada de sensor
MOVWF ADCON0
CLRF PORTC
;iniciar el trabajo
CALL inicio_LCD ;inicio de LCD
MOVLW 'P'
call EnviaCarLCD
MOVLW 'U'
call EnviaCarLCD
MOVLW 'L'
call EnviaCarLCD
MOVLW 'S'
call EnviaCarLCD
MOVLW 'E'
call EnviaCarLCD
MOVLW ' '
call EnviaCarLCD
MOVLW 'M'
call EnviaCarLCD
MOVLW 'E'
call EnviaCarLCD
MOVLW 'N'
call EnviaCarLCD
MOVLW 'U'
call EnviaCarLCD
MOVLW DISP_ON_NOCURSOR
call EnviaCmdLCD
menu
CLRF INDICADOR
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc STATUS,Z ;Hay alguna pulsada ??
goto menu ;no
movlw 0x0F ;si-->verificar si es Menu
subwf Tecla,0
btfss STATUS,Z
goto menu ;NO ES MENU
;pedir_temperatura_1
CALL inicio_LCD ;inicio de LCD
MOVLW 'T'
call EnviaCarLCD
MOVLW 'E'
call EnviaCarLCD
MOVLW 'M'
call EnviaCarLCD
MOVLW 'P'
call EnviaCarLCD
MOVLW '1'
call EnviaCarLCD
MOVLW '='
call EnviaCarLCD
call cap_tecla
movf TEMPER,0
movwf T_1
MOVLW DISP_ON_NOCURSOR
call EnviaCmdLCD
btfss INDICADOR,0
GOTO $+2
GOTO MAL
pedir_temperatura_2
CALL inicio_LCD ;inicio de LCD
MOVLW 'T'
call EnviaCarLCD
MOVLW 'E'
call EnviaCarLCD
MOVLW 'M'
call EnviaCarLCD
MOVLW 'P'
call EnviaCarLCD
MOVLW '2'
call EnviaCarLCD
MOVLW '='
call EnviaCarLCD
call cap_tecla
movf TEMPER,0
movwf T_2
btfss INDICADOR,0
GOTO $+2
GOTO MAL
movf T_2,0
subwf T_1,0 ;w=T_1 - W(T_2)-
btfsc STATUS,C ;T_2>T_1
GOTO MAL ;no
decf T_1,1 ;para efectos de comparacion
GOTO INICIO
;;;;
MAL
CLRF INDICADOR
CALL inicio_LCD ;inicio de LCD
MOVLW 'E'
call EnviaCarLCD
MOVLW 'R'
call EnviaCarLCD
MOVLW 'R'
call EnviaCarLCD
MOVLW 'O'
call EnviaCarLCD
MOVLW 'R'
call EnviaCarLCD
MOVLW DISP_LINEA2
CALL EnviaCmdLCD
MOVLW 'P'
call EnviaCarLCD
MOVLW 'U'
call EnviaCarLCD
MOVLW 'L'
call EnviaCarLCD
MOVLW 'S'
call EnviaCarLCD
MOVLW 'E'
call EnviaCarLCD
MOVLW ''
call EnviaCarLCD
MOVLW 'M'
call EnviaCarLCD
MOVLW 'E'
call EnviaCarLCD
MOVLW 'N'
call EnviaCarLCD
MOVLW 'U'
call EnviaCarLCD
MOVLW DISP_ON_NOCURSOR
call EnviaCmdLCD
goto menu
;;;;
INICIO
BSF ADCON0,GO ;INICIAR CONVERSION
BTFSC ADCON0,GO
GOTO $-1
;;;;MOSTRAR EN LCD;;;;;;;;;;;;;;;;
MOVF ADRESH,0 ;W=Temperatura
CALL inicio_LCD ;inicio de LCD
MOVF ADRESH,0
CALL Hex_Ascii ;para convertir de HEXADECIMAL a ASCII
MOVLW 'T'
call EnviaCarLCD
MOVLW 'E'
call EnviaCarLCD
MOVLW 'M'
call EnviaCarLCD
MOVLW 'P'
call EnviaCarLCD
MOVLW '='
call EnviaCarLCD
MOVLW ' '
call EnviaCarLCD
movf ASCII_H,0 ;envia las centenas de temperatura
call EnviaCarLCD
movf ASCII_M,0 ;envia las decenas de temperatura
call EnviaCarLCD
movf ASCII_L,0 ;envia las unidades de temperatura
call EnviaCarLCD
MOVLW 0xDF ;envia el simbolo de grados celsius
call EnviaCarLCD
MOVLW 'C'
call EnviaCarLCD
MOVLW DISP_ON_NOCURSOR;es para apagar el cursor del LCD
CALL EnviaCmdLCD
CALL COMPARAR ;chequea en que rango de temperatura se esta
CALL RETARDO ;retardo de 20ms necesario para el ADC
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc STATUS,Z ;Hay alguna pulsada ??
goto INICIO ;no
movlw 0x0F ;si-->verificar si es Menu
subwf Tecla,0
btfss STATUS,Z
goto INICIO ;NO ES MENU
goto menu
;********************
RETARDO ;20ms
MOVLW .10
MOVWF 20H
LAZO
DECFSZ 20H,1
GOTO LAZO
RETURN
;*********************
COMPARAR
MOVF ADRESH,0 ;W=TEMPERATURA ACTUAL
SUBWF T_1,0 ;W=T_1-TEMPERATURA
BTFSC STATUS,C ;C=0? (TEMP>T_1)
GOTO LED_1 ;NO
GOTO SIGUIENTE ;SI
LED_1
MOVLW B'00000001'
MOVWF PORTC
RETURN
SIGUIENTE
MOVF ADRESH,0 ;W=TEMPERATURA ACTUAL
SUBWF T_2,0 ;W=T_2-TEMPERATURA
BTFSC STATUS,C ;C=0? (TEMP>T_2)
GOTO LED_2 ;NO
GOTO LED_3 ;SI
LED_2
MOVLW B'00000000'
MOVWF PORTC
RETURN
LED_3
MOVLW B'00000010'
MOVWF PORTC
RETURN
;***********************************************
;RUTINA PARA CONVERTIR DE HEXADECIMAL A ASCII
Hex_Ascii ;cargar en W el dato hex.
;
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
Bcd_A_Ascii
movlw H'30' ;H'30' --> W
iorwf ASCII_L,F ;Convierte de BCD a ASCII
iorwf ASCII_M,F ;Convierte de BCD a ASCII
;
movf ASCII_H,F ;ASCII_H --> F
btfsc STATUS,Z ;? ASCII_H es D'00' ?
goto Espacio ;Si
movlw H'30' ;H'30' --> W
iorwf ASCII_H,F ;Convierte de BCD a ASCII
return ;Retorna
;
Espacio
;
movlw '0' ;A' ' --> W
movwf ASCII_H ;A' ' --> ASCII_H
return ;Retorna
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cap_tecla
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc STATUS,Z ;Hay alguna pulsada ??
goto cap_tecla ;No
movf Tecla,W ;Lee el código de la tecla pulsada
movwf REG1 ;Tecla-->REG1
call Hex_Ascii
movf ASCII_L,0
call EnviaCarLCD
pulso1
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc STATUS,Z ;Hay alguna pulsada ??
goto pulso1 ;no
on1
movlw 0x0D ;si-->verificar si es ON
subwf Tecla,0
btfss STATUS,Z ;fue ON??
goto $+2 ;no
goto salir1 ;si
movf Tecla,W ;Lee el código de la tecla pulsada
movwf REG2 ;Tecla-->REG2
call Hex_Ascii
movf ASCII_L,0
call EnviaCarLCD
pulso2
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc STATUS,Z ;Hay alguna pulsada ??
goto pulso2 ;no
on2
movlw 0x0D ;si-->verificar si es ON
subwf Tecla,0
btfss STATUS,Z ;fue ON??
goto $+2 ;no
goto salir2 ;si
movf Tecla,W ;Lee el código de la tecla pulsada
movwf REG3 ;Tecla-->REG3
call Hex_Ascii
movf ASCII_L,0
call EnviaCarLCD
pulso_3
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc STATUS,Z ;Hay alguna pulsada ??
goto pulso_3 ;no
movlw 0x0D ;si-->verificar si es ON
subwf Tecla,0
btfss STATUS,Z
goto pulso_3
goto salir3
;;;;;;
salir3
;*****
MOVF REG1,0
SUBLW .1
BTFSC STATUS,C
GOTO CONTINUA
MOVF REG1,0
SUBLW .2
BTFSS STATUS,Z
GOTO MALO
MOVF REG2,0
SUBLW .4
BTFSC STATUS,C
GOTO CONTINUA
GOTO MALO
;*****
MALO
BSF INDICADOR,0
RETURN
;*****
CONTINUA
BCF INDICADOR,0
movlw .9
movwf AUX
movf REG2,0
movwf AUX2 ;AUX2=REG2 inicial
follow3
movf AUX2,0
addwf REG2,1 ;REG2=REG2+REG2
decfsz AUX
goto follow3
movf REG2,0
addwf REG3,1 ;REG3=10*REG2+REG3
falta
movlw .99
movwf AUX
movf REG1,0
movwf AUX2 ;AUX2=REG1 inicial
otro
movf AUX2,0
ADDWF REG1,1
DECFSZ AUX
GOTO otro
movf REG1,0
ADDWF REG3,0
MOVWF TEMPER
RETURN
;;;;;;;;;;,
salir1
movf REG1,0
movwf TEMPER ;TEMP<--REG1
RETURN
;;;;;;;;;;
salir2
movlw .9
movwf AUX
movf REG1,0
movwf AUX2 ;AUX2=REG1 inicial
follow2
movf AUX2,0 ;w=aux2
addwf REG1,1 ;REG1=REG1+aux2
decfsz AUX
goto follow2
movf REG1,0
addwf REG2,0 ;w=REG1+REG2
movwf TEMPER
RETURN
INCLUDE <LCD.ASM>
INCLUDE <RETARDO.ASM>
END