Hola, soy nuevo Ariel es mi nombre,en el mundo de los microcontroladores y con muy poca experiencia, pero tengo voluntad y estoy leyendo para aprender.
Hace unos dias baje un diagrama y un codigo de un termostato. lo arme y cuando probe funciona todo bien, carga temperatura maxima, minima, pero lo unico que no hace es mostrar la temperatura actual, la pantalla siempre muestra 255. este o no este el lm35 conectado. Probe el lm35 y funciona correctamente. El cicuito esta correctamente tambien, lo unico que me queda es que el programa tenga algun erro. leyendo aprendi a usar el proteus (costo) En la simulacion la temperatura mustra siempre cero. Luego comence a probar cambios pero al no entender se complico bastatente y no llegue a nada. Les puedo pegar el codigo para ver si alguien con experiencia puede encontrar el error del programa y darme una mano para poderlo hacer funcionar. Desde ya muchas gracias
En el circuito l lm35 entra por el pin2 del pic
saludos
Ariel
;CONTROL DE TEMPERATURA
;CURSO DE AUTOMATIZACION CON PIC
;ALUMNO: SERGIO ESTEBAN GORJUP
;PROFESOR: ANDRES BRUNO SARAVIA
;-------------------------------------------------------------------------------------------------
;declaracion del modelo del pic, la libreria y todas las variables
;-------------------------------------------------------------------------------------------------
LIST P=16F870 ;DECLARO QUE PIC UTILIZARE
INCLUDE <P16F870.INC> ;LIBRERIA DEL PIC
UNIDAD EQU 0X020 ;CONVERCION DE LA TEMP, EN UNIDAD (BCD)
DECENA EQU 0X021 ;CONVERCION DE LA TEMP, EN DECENA (BCD)
CENTENA EQU 0X022 ;CONVERCION DE LA TEMP, EN CENTENA (BCD)
UNIDAD_ASCII EQU 0X026 ;CONVERCION DE LA UNIDAD EN ASCII
DECENA_ASCII EQU 0X027 ;CONVERCION DE LA DECENA EN ASCII
CENTENA_ASCII EQU 0X028 ;CONVERCION DE LA CENTENA EN ASCII
TEM_MAX EQU 0X023 ;VARIABLE PARA SETEAR LA TEMP. MAXIMA
TEM_MIN EQU 0X024 ;VARIABLE PARA SETEAR LA TEMP. MINIMA
TEM_SENSOR EQU 0X025 ;VARIABLE PARA LA TEMPERATURA DEL SENSOR
CONT1 EQU 0X040 ;VARIABLE PARA CONTADOR, DE TIEMPO
CONT2 EQU 0X041 ;VARIABLE PARA CONTADOR, DE TIEMPO
CONT3 EQU 0X042 ;VARIABLE PARA CONTADOR, DE TIEMPO
CONT4 EQU 0X015 ;VARIABLE PARA CONTADOR, DE TIEMPO
CONT5 EQU 0X016 ;VARIABLE PARA CONTADOR, DE TIEMPO
CONT EQU 0X043 ;VARIABLE PARA CONTADOR, DE TIEMPO
PDel0 EQU 0X044 ;VARIABLE PARA CONTADOR, DE TIEMPO
PDel1 EQU 0X045 ;VARIABLE PARA CONTADOR, DE TIEMPO
PDel2 EQU 0X46 ;VARIABLE PARA CONTADOR, DE TIEMPO
RS EQU .5 ;SELECCION DEL REG. DE CONTROL O REG. DE DATOS
E EQU .2 ;SEÑAL DE ACTIVACION DEL MODULO LCD
RA3 EQU .3 ;TENSION DE REFERENCIA
RC0 EQU .0 ;PULSADOR PARA SETEAR LA TEMP. MAX
RC1 EQU .1 ;PULSADOR PARA SETEAR LA TEMP. MIN
RC2 EQU .2 ;PULSADOR PARA INCREMENTAR LA TEMP.
RC3 EQU .3 ;PULSADOR PARA DECREMENTAR LA TEMP.
RC4 EQU .4 ;PULSADOR PARA SALIR DEL SETEO, Y VOLVER AL INICIO
RC5 EQU .5 ;SALIDA EN LA CUAL HAY UN RELAY
RC6 EQU .6 ;SALIDA EN LA CUAL HAY UN RELAY
org 0
;-------------------------------------------------------------------------------------------------
;INICIO Esta es la rutina principal
;-------------------------------------------------------------------------------------------------
INICIO CALL INICIALIZACION ;CONFIGURACION DE LOS PUERTOS Y PONER A CERO LAS VARIABLES
CALL LONG_DLY ;ESPERO UN TIEMPO
CALL INI_DISPLAY ;INICIALIZO EL DISPLAY
CALL DLY5MS ;ESPERO UN TIEMPO
CALL PRESENTACION ;PANTALLA DE PRESENTACION
CALL DEMORA ;ESPERO UN TIEMPO
CALL BORRA_PANTALLA ;RUTINA QUE BORRA LA PANTALLA
CALL LONG_DLY ;ESPERO UN TIEMPO
MEN CALL SENSOR ;ESTA RUTINA TRAE LA TEMP. DEL SENSOR
CALL DLY5MS ;ESPERO UN TIEMPO
CALL PANTALLA_MAIN ;PANTALLA PRINCIPAL(TEMP. ACTUAL, TEMP. MAX. Y TEMP. MIN.)
CALL MENU ;RUTINA QUE CONTIENE EL MENU, QUE PERMITE SETEAR LA TEMP.
CALL COMPARACION ;RUTINA DE COMPARACION DE TEMP.,PARA PODER ACTIVAR
;O DESACTIVAR EL RELAY
GOTO MEN ;VUELVO A MEN, PARA EMPEZAR DE NUEVO
;-------------------------------------------------------------------------------------------------
;MENU Esta rutina es el menu principal del programa. En la cual se elige
el seteo de las temperaturas maximas y minimas.
;PUL0 seteo de la temp. maxima
;PUL1 seteo de la temp. minima
;-------------------------------------------------------------------------------------------------
MENU
PUL0 BTFSS PORTC,RC0 ;pregunto si RC0 = 1
GOTO PUL1 ;si es = 0, me voy a PUL1
CALL DLY_PUL ;espero un tiempo (antirebote)
CALL BORRA_PANTALLA ;si es = 1, voy a la rutina que borra la pantalla
CALL LONG_DLY ;espero un tiempo
CALL SETEO_MAX ;rutina en la cual voy a setear la max. temp.
RETURN ;retorno
PUL0_NO BTFSC PORTC,RC0 ;pregunto si RC0 = 0
GOTO PUL0_NO ;si es = 1, me voy a PUL0_NO
CALL DLY_PUL ;espero un tiempo (antirebote)
GOTO PUL0 ;si es = 0, voy a PUL0
;------------------------------------------------------------
PUL1 BTFSS PORTC,RC1 ;pregunto si RC1 = 1
GOTO EXIT ;si es = 0, retorno
CALL DLY_PUL ;espero un tiempo (antirebote)
CALL BORRA_PANTALLA ;rutina que borra la pantalla
CALL DLY5MS ;espero un tiempo
CALL SETEO_MIN ;rutina en la cual voy a setear la min. temp.
RETURN ;retorno
PUL1_NO BTFSC PORTC,RC1 ;pregunto si RC1 = 0
GOTO PUL1_NO ;si es = 1, me voy a PUL1_NO
CALL DLY_PUL ;;espero un tiempo (antirebote)
GOTO PUL1 ;si es = 0, voy a PUL1
EXIT RETURN ;retorno
;-------------------------------------------------------------------------------------------------
;SETEO_MAX esta rutina es la encargada de setear la temp. maxima.
;-------------------------------------------------------------------------------------------------
SETEO_MAX CALL PANTALLA_MAX ;cargo la pantalla, en la cual se setea la temp. max.
CALL LONG_DLY ;espero un tiempo
CALL CTRL_DIS ;apago el cursor
BSF STATUS,RP1 ;paso al banco 2
BCF STATUS,RP0 ;paso al banco 2
MOVLW 0X023 ;paso la direccion de la variable a W
MOVWF EEADR ;paso la direccion a EEADR
BCF STATUS,RP0 ;paso al banco 0
BCF STATUS,RP1 ;paso al banco 0
CALL LEER ;llamo a la lectura de la memoria
BSF STATUS,RP1 ;paso al banco 2
BCF STATUS,RP0 ;paso al banco 2
MOVF EEDATA,0 ;muevo al dato almacenado a W
BCF STATUS,RP0 ;paso al banco 0
BCF STATUS,RP1 ;paso al banco 0
MOVWF TEM_MAX ;muevo el dato almacenado a la variable TEM_MAX
CALL DLY5MS ;espero un tiempo
PUL2 BTFSS PORTC,RC2 ;pregunto si RC2 = 1
GOTO PUL3 ;si es = 0, voy a PUL3
CALL DLY_PUL ;espero un tiempo (antirebote)
INCF TEM_MAX,1 ;incremento la variable TEM_MAX
MOVF TEM_MAX,0 ;cargo TEM_MAX a W
XORLW .140 ;comparo para ver si es igual a 140
BTFSC STATUS,Z ;pregunto si W=1 y Z=0 salto,si W=0 y Z=1 borro a TEM_MAX
CLRF TEM_MAX ;borro la variable TEM_MAX
PUL2_NO CALL PANTALLA_MAX ;cargo la pantalla, en la cual se setea la temp. max.
CALL LONG_DLY ;espero un tiempo
BTFSC PORTC,RC2 ;pregunto si RC2 = 0
GOTO PUL2_NO ;si es = 1, voy a PUL2_NO
CALL DLY_PUL ;espero un tiempo (antirebote)
GOTO PUL2 ;si es = 0, voy a PUL2
PUL3 BTFSS PORTC,RC3 ;pregunto si RC3 = 1
GOTO PUL4 ;si es = 0, voy a PUL4
CALL DLY_PUL ;espero un tiempo (antirebote)
DECF TEM_MAX,1 ;decremento la variable TEM_MAX
MOVF TEM_MAX,0 ;cargo TEM_MAX a W
XORLW .255 ;comparo para ver si es igual a 0
BTFSC STATUS,Z ;pregunto si W=1 y Z=0 salto,si W=0 y Z=1 borro a TEM_MAX
CLRF TEM_MAX ;borro la variable TEM_MAX
PUL3_NO CALL PANTALLA_MAX ;cargo la pantalla, en la cual se setea la temp. max.
CALL LONG_DLY ;espero un tiempo
BTFSC PORTC,RC3 ;pregunto si RC3 = 0
GOTO PUL3_NO ;si es = 1, voy a PUL3_NO
CALL DLY_PUL ;espero un tiempo (antirebote)
GOTO PUL3 ;si es = 0, voy a PUL3
PUL4 BTFSS PORTC,RC4 ;pregunto si RC4 = 1
GOTO PUL2 ;si es = 0, voy a PUL2
CALL DLY_PUL ;espero un tiempo (antirebote)
MOVF TEM_MAX,0 ;cargo TEM_MAX a W
BSF STATUS,RP1 ;paso al banco 2
BCF STATUS,RP0 ;paso al banco 2
MOVWF EEDATA ;muevo el dato a almacenar a EEDATA
MOVLW 0X023 ;paso la direccion de la variable a W
MOVWF EEADR ;paso la direccion a EEADR
BCF STATUS,RP0 ;paso al banco 0
BCF STATUS,RP1 ;paso al banco 0
CALL EE_WRITE ;rutina de escritura de la EEPROM
CALL BORRA_PANTALLA ;rutina que borra la pantalla
CALL DLY_PUL ;espero un tiempo
RETURN ;retorno
PUL4_NO BTFSC PORTC,RC4 ;pregunto si RC4 = 0
GOTO PUL4_NO ;si es = 1, voy a PUL4_NO
CALL DLY_PUL ;espero un tiempo (antirebote)
GOTO PUL4 ;si es = 0, voy a PUL4
;-------------------------------------------------------------------------------------------------
;SETEO_MIN esta rutina es la encargada de setear la temp. minima
;-------------------------------------------------------------------------------------------------
SETEO_MIN CALL PANTALLA_MIN ;cargo la pantalla, en la cual se setea la temp. min.
CALL LONG_DLY ;espero un tiempo
CALL CTRL_DIS ;apago el cursor
BSF STATUS,RP1 ;paso al banco 2
BCF STATUS,RP0 ;paso al banco 2
MOVLW 0X024 ;paso la direccion de la variable a W
MOVWF EEADR ;paso la direccion a EEADR
BCF STATUS,RP0 ;paso al banco 0
BCF STATUS,RP1 ;paso al banco 0
CALL LEER ;llamo a la lectura de la memoria
BSF STATUS,RP1 ;paso al banco 2
BCF STATUS,RP0 ;paso al banco 2
MOVF EEDATA,0 ;muevo al dato almacenado a W
BCF STATUS,RP0 ;paso al banco 0
BCF STATUS,RP1 ;paso al banco 0
MOVWF TEM_MIN ;muevo el dato almacenado a la variable TEM_MIN
CALL DLY5MS ;espero un tiempo
PUL2_1 BTFSS PORTC,RC2 ;pregunto si RC2 = 1
GOTO PUL3_1 ;si es = 0, voy a PUL3_1
CALL DLY_PUL ;espero un tiempo (antirebote)
INCF TEM_MIN,1 ;incremento la variable TEM_MIN
MOVF TEM_MIN,0 ;cargo TEM_MIN a W
XORLW .140 ;comparo para ver si es igual a 140
BTFSC STATUS,Z ;pregunto si W=1 y Z=0 salto,si W=0 y Z=1 borro a TEM_MIN
CLRF TEM_MIN ;borro la variable TEM_MIN
PUL2_NO1 CALL PANTALLA_MIN ;cargo la pantalla, en la cual se setea la temp. min.
CALL LONG_DLY ;espero un tiempo
BTFSC PORTC,RC2 ;pregunto si RC2 = 0
GOTO PUL2_NO1 ;si es = 1, voy a PUL2_NO1
CALL DLY_PUL ;espero un tiempo (antirebote)
GOTO PUL2_1 ;si es = 0, voy a PUL2_1
PUL3_1 BTFSS PORTC,RC3 ;pregunto si RC3 = 1
GOTO PUL4_1 ;si es = 0, voy a PUL4_1
CALL DLY_PUL ;espero un tiempo (antirebote)
DECF TEM_MIN,1 ;decremento la variable TEM_MIN
MOVF TEM_MIN,0 ;cargo TEM_MIN a W
XORLW .255 ;comparo para ver si es igual a 0
BTFSC STATUS,Z ;pregunto si W=1 y Z=0 salto,si W=0 y Z=1 borro a TEM_MIN
CLRF TEM_MIN ;borro la variable TEM_MIN
PUL3_NO1 CALL PANTALLA_MIN ;cargo la pantalla, en la cual se setea la temp. min.
CALL LONG_DLY ;espero un tiempo
BTFSC PORTC,RC3 ;pregunto si RC3 = 0
GOTO PUL3_NO1 ;si es = 1, voy a PUL3_NO1
CALL DLY_PUL ;espero un tiempo (antirebote)
GOTO PUL3_1 ;si es = 0, voy a PUL3_1
PUL4_1 BTFSS PORTC,RC4 ;pregunto si RC4 = 1
GOTO PUL2_1 ;si es = 0, voy a PUL2_1
CALL DLY_PUL ;espero un tiempo (antirebote)
MOVF TEM_MIN,0 ;cargo TEM_MIN a W
BSF STATUS,RP1 ;paso al banco 2
BCF STATUS,RP0 ;paso al banco 2
MOVWF EEDATA ;muevo el dato a almacenar a EEDATA
MOVLW 0X024 ;paso la direccion de la variable a W
MOVWF EEADR ;paso la direccion a EEADR
BCF STATUS,RP0 ;paso al banco 0
BCF STATUS,RP1 ;paso al banco 0
CALL EE_WRITE ;rutina de escritura de la EEPROM
CALL BORRA_PANTALLA ;rutina que borra la pantalla
CALL DLY_PUL ;espero un tiempo
RETURN ;retorno
PUL4_NO1 BTFSC PORTC,RC4 ;pregunto si RC4 = 0
GOTO PUL4_NO1 ;si es = 1, voy a PUL4_NO1
CALL DLY_PUL ;espero un tiempo (antirebote)
GOTO PUL4_1 ;si es = 0, voy a PUL4_1
;-------------------------------------------------------------------------------------------------
;LEER
;-------------------------------------------------------------------------------------------------
LEER BSF STATUS,RP1 ;paso al banco 3
BSF STATUS,RP0 ;paso al banco 3
BCF EECON1,EEPGD ;EEPGD = 0
BSF EECON1,RD ;RD = 1
BCF STATUS,RP0 ;paso al banco 2
MOVF EEDATA,0 ;muevo el dato a EEDATA
BCF STATUS,RP1 ;paso al banco 0
BCF STATUS,RP0 ;paso al banco 0
RETURN ;retorno
;-------------------------------------------------------------------------------------------------
;EE_WRITE GRABACION DE LA MEMORIA EEPROM
;-------------------------------------------------------------------------------------------------
EE_WRITE BSF STATUS,RP0 ;paso al banco 3
BSF STATUS,RP1 ;paso al banco 3
BCF INTCON,GIE ;desabilitos las interrupciones
LOOP_WREEPROM BTFSC EECON1,WR ;pregunto si EECON1,WR =0
GOTO LOOP_WREEPROM ;si es = 0 voy a LOOP_WREEPROM
BCF EECON1,EEPGD ;si es = 1, EEPGD = 0
BSF EECON1,WREN ;WREN = 1
MOVLW 0X055 ;muevo 0x055 a W
MOVWF EECON2 ;muevo W a EECON2
MOVLW 0X0AA ;muevo 0x0AA a W
MOVWF EECON2 ;muevo W a EECON2
BSF EECON1,WR ;WR = 1
BCF EECON1,WREN ;WREN = 0
BSF INTCON,GIE ;habilitos las interrupciones
BCF STATUS,RP0 ;paso al banco 0
BCF STATUS,RP1 :paso al banco 0
RETURN ;retorno
;-------------------------------------------------------------------------------------------------
;INICIALIZACION Esta rutina se encarga de limpiar las variables,
;configurar los puertos como entrada y salida.
;Tambien se configura la entrada del conversor ADC.
;-------------------------------------------------------------------------------------------------
INICIALIZACION CLRF UNIDAD
CLRF DECENA
CLRF CENTENA
CLRF UNIDAD_ASCII
CLRF DECENA_ASCII
CLRF CENTENA_ASCII
CLRF TEM_MAX
CLRF TEM_MIN
CLRF PORTA
CLRF PORTB
CLRF PORTC
BSF STATUS,RP0 ;selecciona banco1
MOVLW b'00000101' ;RA0 Y RA1 = A, RA2 Y RA5 = D Y RA3 = +Vref
MOVWF ADCON1
MOVLW 00H
MOVWF TRISB ;portb como salida
MOVLW B'00001001'
MOVWF TRISA ;porta como entrada y salida
MOVLW B'00011111'
MOVWF TRISC ;portc como entrada y salida
BCF STATUS,RP0 ;seleciona banco0
RETURN
;-------------------------------------------------------------------------------------------------
; INI_DISPLAY Esta rutina inicializa el display
;-------------------------------------------------------------------------------------------------
INI_DISPLAY CALL DLY5MS
CALL DLY5MS
CALL DLY5MS
MOVLW 0X38
CALL COMANDO
CALL DLY5MS
MOVLW 0X38
CALL COMANDO
CALL DLY100US
MOVLW 0X38
CALL COMANDO
CALL DLY100US
MOVLW 0X01
CALL COMANDO
CALL DLY100US
MOVLW 0X02
CALL COMANDO
CALL DLY100US
MOVLW 0X38
CALL COMANDO
CALL DLY100US
MOVLW 0X06
CALL COMANDO
call DLY100US
MOVLW 0X0C
CALL COMANDO
RETURN
;-------------------------------------------------------------------------------------------------
;DATO Esta rutina escribe un dato en la pantalla. Cargar el caracter en ASCII
;en W, y lluego ejecutar esta rutina.
;-------------------------------------------------------------------------------------------------
DATO MOVWF PORTB
BSF PORTA,RS
BSF PORTA,E
CALL DLY100US
BCF PORTA,E
CALL DLY5MS
RETURN
;-------------------------------------------------------------------------------------------------
;COMANDO escribe un comando en el display. primero hay que cargarlo en W, y
;luego ejecutar esta rutina.
;-------------------------------------------------------------------------------------------------
COMANDO MOVWF PORTB
BCF PORTA,RS
BSF PORTA,E
CALL DLY100US
BCF PORTA,E
CALL DLY5MS
RETURN
;-------------------------------------------------------------------------------------------------
; CTRL_DIS Esta rutina apaga el cursor del display
;-------------------------------------------------------------------------------------------------
CTRL_DIS MOVLW B'00001100' ;apago el cursor
CALL COMANDO
RETURN
;-------------------------------------------------------------------------------------------------
; BORRA_PANTALLA Esta rutina borra la pantalla
;-------------------------------------------------------------------------------------------------
BORRA_PANTALLA call DLY5MS
MOVLW B'00000001' ;borramos pantalla
CALL COMANDO
RETURN
;-------------------------------------------------------------------------------------------------
; DLY100US Esta rutina genera un delay de 100US
;-------------------------------------------------------------------------------------------------
DLY100US MOVLW .5
MOVWF CONT
LOOP DECFSZ CONT,1
GOTO LOOP
RETURN
;-------------------------------------------------------------------------------------------------
; DLY5MS Esta rutina genera un delay de 5 Milisegundos
;-------------------------------------------------------------------------------------------------
DLY5MS MOVLW .5
MOVWF CONT1
LOOP2 MOVLW .25
MOVWF CONT2
LOOPI DECFSZ CONT2,1
GOTO LOOPI
DECFSZ CONT1,1
GOTO LOOP2
RETURN
;-------------------------------------------------------------------------------------------------
;LONG_DLY rutina de tiempo
;-------------------------------------------------------------------------------------------------
LONG_DLY MOVLW .10
MOVWF CONT1
LOOPuno MOVLW .100
MOVWF CONT2
LOOPdos MOVLW .100
MOVWF CONT3
LOOPtres DECFSZ CONT3,1
GOTO LOOPtres
DECFSZ CONT2,1
GOTO LOOPdos
DECFSZ CONT1,1
GOTO LOOPuno
RETURN
;-------------------------------------------------------------------------------------------------
;DLY_PUL Esta rutina se utiliza en los pulsadores, para el antirrebote
;-------------------------------------------------------------------------------------------------
DLY_PUL MOVLW .2
MOVWF CONT4
LOOP6 MOVLW .1
MOVWF CONT5
LOOP1 DECFSZ CONT5,1
GOTO LOOP1
DECFSZ CONT4,1
GOTO LOOP6
RETLW .0
;-------------------------------------------------------------------------------------------------
;Generado con PDEL ver SP r 1.0 el 05/05/08 Hs 08:59:05 p.m.
; Descripcion: Delay 6000000 ciclos
;-------------------------------------------------------------------------------------------------
DEMORA movlw .91 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .95 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .138 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2,1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1,1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0,1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------------------------------------------
;LEER_ADC Esta rutina lee el valor del ADC segun el canal especificado en
; ADCON0, Y guarda el valor en la variable TEM_SENSOR
;-------------------------------------------------------------------------------------------------
LEER_ADC NOP
LEER_ADC0 movlw b'10000000'
movwf ADCON0
CALL DLY5MS
call LEER_ADC_CHN
movwf TEM_SENSOR
CALL DLY5MS
RETURN
;-------------------------------------------------------------------------------------------------
;LEER_ADC_CHN Esta rutina complementa a LEER_ADC
;-------------------------------------------------------------------------------------------------
LEER_ADC_CHN BSF ADCON0,0
CALL DLY5MS
bsf ADCON0,2
CALL DLY100US
LOOPLEER_ADCCHN btfsc ADCON0,2
goto LOOPLEER_ADCCHN
movf ADRESH,0
BCF ADCON0,0
return
;-------------------------------------------------------------------------------------------------
;SENSOR esta rutina se encarga de levantar los datos del conversor
;-------------------------------------------------------------------------------------------------
SENSOR CLRF TEM_SENSOR
CALL LEER_ADC
RETURN
;-------------------------------------------------------------------------------------------------
;CONVER_BINBCD Esta rutina convirte un numero binario de 8 bits en un numero
; bcd de 2 bytes. El numero a convertir debe encontrarse en el
; registro W. El resultado podr levantarse en los registros
; LSD y MSD
;-------------------------------------------------------------------------------------------------
CONVER_BINBCD movwf UNIDAD
clrf DECENA
clrf CENTENA
movlw .100
OTRA subwf UNIDAD,1
btfss STATUS,C
goto SUM
incf CENTENA,1
goto OTRA
SUM addwf UNIDAD,1
movlw .10
REPITE subwf UNIDAD,1
btfss STATUS,C
goto SUM1
incf DECENA,1
goto REPITE
SUM1 addwf UNIDAD,1
END_BINBCD RETURN
;-------------------------------------------------------------------------------------------------
;CONVER_ASCII Esta rutina convierte el numero decimal a codigo ASCII.
;-------------------------------------------------------------------------------------------------
MUESTREO MOVF UNIDAD,0
ADDLW 0x30
MOVWF UNIDAD_ASCII
MOVF DECENA,0
ADDLW 0x30
MOVWF DECENA_ASCII
MOVF CENTENA,0
ADDLW 0X30
MOVWF CENTENA_ASCII
RETURN
;-------------------------------------------------------------------------------------------------
;COMPARACION Esta rutina se encarga de comparar la temperatura del sensor,
; con la temperatura maxima y minima seteadas. En la cual si se
; cumple la condicion activa el relay, o lo desactiva.
;-------------------------------------------------------------------------------------------------
COMPARACION MOVF TEM_SENSOR,0 ;temperatura maxima
SUBWF TEM_MAX,0
BTFSC STATUS,C ;C=0 si es positivo se cumple
GOTO COM_MIN ;la condicion.En la cual prendo
BSF PORTC,RC6 ;un RELAY
COM_MIN MOVF TEM_SENSOR,0 ;temperatura minima
SUBWF TEM_MIN,0
BTFSS STATUS,C ;C=1 si es negativo se cumple
RETURN ;la condicion.En la cual apago
BCF PORTC,RC6 ;el RELAY.
RETURN
;-------------------------------------------------------------------------------------------------
;PANTALLA_MAIN esta es la pantalla principal del programa. En la cual
; se muestra la temp. actual, la temp. max y min seteadas
;-------------------------------------------------------------------------------------------------
PANTALLA_MAIN CALL DLY5MS
MOVLW 0X80
CALL COMANDO
MOVLW 'T'
CALL DATO
MOVLW 'E'
CALL DATO
MOVLW 'M'
CALL DATO
MOVLW 'P'
CALL DATO
MOVLW '.'
CALL DATO
MOVLW 'A'
CALL DATO
MOVLW 'C'
CALL DATO
MOVLW 'T'
CALL DATO
MOVLW '.'
CALL DATO
MOVLW ':'
CALL DATO
MOVF TEM_SENSOR,0 ;variable que contiene la temperatura del sensor
CALL CONVER_BINBCD
CALL MUESTREO
MOVF CENTENA_ASCII,0
CALL DATO
MOVF DECENA_ASCII,0
CALL DATO
MOVF UNIDAD_ASCII,0
CALL DATO
CALL DLY5MS
MOVLW 0XC0 ;salto a la segunda linea
CALL COMANDO
MOVLW 'M'
CALL DATO
MOVLW 'A'
CALL DATO
MOVLW 'X'
CALL DATO
MOVLW ':'
CALL DATO
MOVLW 0X023
BCF STATUS,RP0
BSF STATUS,RP1
MOVWF EEADR
BCF STATUS,RP0
BCF STATUS,RP1
CALL LEER
BCF STATUS,RP0
BSF STATUS,RP1
MOVF EEDATA,0 ;variable que contiene la temperatura maxima
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF TEM_MAX
CALL CONVER_BINBCD
CALL MUESTREO
MOVF CENTENA_ASCII,0
CALL DATO
MOVF DECENA_ASCII,0
CALL DATO
MOVF UNIDAD_ASCII,0
CALL DATO
MOVLW ' '
CALL DATO
MOVLW ' '
CALL DATO
MOVLW 'M'
CALL DATO
MOVLW 'I'
CALL DATO
MOVLW 'N'
CALL DATO
MOVLW ':'
CALL DATO
MOVLW 0X024
BCF STATUS,RP0
BSF STATUS,RP1
MOVWF EEADR
BCF STATUS,RP0
BCF STATUS,RP1
CALL LEER
BCF STATUS,RP0
BSF STATUS,RP1
MOVF EEDATA,0 ;variable que contiene la temperatura minima
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF TEM_MIN
CALL CONVER_BINBCD
CALL MUESTREO
MOVF CENTENA_ASCII,0
CALL DATO
MOVF DECENA_ASCII,0
CALL DATO
MOVF UNIDAD_ASCII,0
CALL DATO
return
;-------------------------------------------------------------------------------------------------
;PANTALLA_MAX pantalla en la cual se muestra el seteo de la temp. max
;-------------------------------------------------------------------------------------------------
PANTALLA_MAX CALL DLY5MS
MOVLW 0X80
CALL COMANDO
MOVLW 'S'
CALL DATO
MOVLW 'E'
CALL DATO
MOVLW 'T'
CALL DATO
MOVLW 'E'
CALL DATO
MOVLW 'O'
CALL DATO
MOVLW ' '
CALL DATO
MOVLW 'D'
CALL DATO
MOVLW 'E'
CALL DATO
MOVLW ' '
CALL DATO
MOVLW 'T'
CALL DATO
MOVLW 'E'
CALL DATO
MOVLW 'M'
CALL DATO
MOVLW 'P'
CALL DATO
MOVLW '.'
CALL DATO
CALL DLY5MS
MOVLW 0XC0 ;salto a la segunda linea
CALL COMANDO
MOVLW 'M'
CALL DATO
MOVLW 'A'
CALL DATO
MOVLW 'X'
CALL DATO
MOVLW 'I'
CALL DATO
MOVLW 'M'
CALL DATO
MOVLW 'A'
CALL DATO
MOVLW ':'
CALL DATO
MOVF TEM_MAX,0 ;variable que contiene la temperatura maxima
CALL CONVER_BINBCD
CALL MUESTREO
MOVF CENTENA_ASCII,0
CALL DATO
MOVF DECENA_ASCII,0
CALL DATO
MOVF UNIDAD_ASCII,0
CALL DATO
RETURN
;-------------------------------------------------------------------------------------------------
;PANTALLA_MIN pantalla en la cual se muestra el seteo de la temp. min
;-------------------------------------------------------------------------------------------------
PANTALLA_MIN CALL DLY5MS
MOVLW 0X80
CALL COMANDO
MOVLW 'S'
CALL DATO
MOVLW 'E'
CALL DATO
MOVLW 'T'
CALL DATO
MOVLW 'E'
CALL DATO
MOVLW 'O'
CALL DATO
MOVLW ' '
CALL DATO
MOVLW 'D'
CALL DATO
MOVLW 'E'
CALL DATO
MOVLW ' '
CALL DATO
MOVLW 'T'
CALL DATO
MOVLW 'E'
CALL DATO
MOVLW 'M'
CALL DATO
MOVLW 'P'
CALL DATO
MOVLW '.'
CALL DATO
CALL DLY5MS
MOVLW 0XC0 ;salto a la segunda linea
CALL COMANDO
MOVLW 'M'
CALL DATO
MOVLW 'I'
CALL DATO
MOVLW 'N'
CALL DATO
MOVLW 'I'
CALL DATO
MOVLW 'M'
CALL DATO
MOVLW 'A'
CALL DATO
MOVLW ':'
CALL DATO
MOVF TEM_MIN,0 ;variable que contiene la temperatura manima
CALL CONVER_BINBCD
CALL MUESTREO
MOVF CENTENA_ASCII,0
CALL DATO
MOVF DECENA_ASCII,0
CALL DATO
MOVF UNIDAD_ASCII,0
CALL DATO
RETURN
;-------------------------------------------------------------------------------------------------
;PRESENTACION : es la presentacion del control de temperatura.
;-------------------------------------------------------------------------------------------------
PRESENTACION CALL DLY5MS
MOVLW 0X80
CALL COMANDO
MOVLW '*'
CALL DATO
MOVLW '*'
CALL DATO
MOVLW '*'
CALL DATO
MOVLW '*'
CALL DATO
MOVLW 'M'
CALL DATO
MOVLW 'I'
CALL DATO
MOVLW 'C'
CALL DATO
MOVLW 'R'
CALL DATO
MOVLW 'O'
CALL DATO
MOVLW 'C'
CALL DATO
MOVLW 'H'
CALL DATO
MOVLW 'I'
CALL DATO
MOVLW 'P'
CALL DATO
MOVLW '*'
CALL DATO
MOVLW '*'
CALL DATO
MOVLW '*'
CALL DATO
MOVLW 0XC0 ;salto a la segunda linea
CALL COMANDO
MOVLW '*'
CALL DATO
MOVLW '*'
CALL DATO
MOVLW '*'
CALL DATO
MOVLW '*'
CALL DATO
MOVLW 'P'
CALL DATO
MOVLW 'I'
CALL DATO
MOVLW 'C'
CALL DATO
MOVLW ' '
CALL DATO
MOVLW '1'
CALL DATO
MOVLW '6'
CALL DATO
MOVLW 'F'
CALL DATO
MOVLW '8'
CALL DATO
MOVLW '7'
CALL DATO
MOVLW '0'
CALL DATO
MOVLW '*'
CALL DATO
MOVLW '*'
CALL DATO
RETURN
END