Autor Tema: Termostato con lm35 pic 16f873A y pantalla 16x2  (Leído 7362 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado tatielectronica

  • PIC10
  • *
  • Mensajes: 5
Termostato con lm35 pic 16f873A y pantalla 16x2
« en: 01 de Marzo de 2010, 15:55:46 »
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

« Última modificación: 01 de Marzo de 2010, 16:58:47 por tatielectronica »

Desconectado tatielectronica

  • PIC10
  • *
  • Mensajes: 5
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #1 en: 09 de Marzo de 2010, 11:49:10 »
Hola ariel
voy a chequear el codigo a ver si te puedo dar una mano con tu problema

saludos Ariel

Desconectado tatielectronica

  • PIC10
  • *
  • Mensajes: 5
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #2 en: 09 de Marzo de 2010, 11:53:05 »
Muchas gracias Ariel

realemente me embarque en este proyecto para un acuario mio y no se por que no funciona. Aunque sea comentame con una pista ya que no quiero que me hagan el trabajo solo una mano para saber por donde empezar a buscar ya que no tengo el conocimiento en este tema. y por mas que intento no puedo lograrlo.
Muchas gracia por tu gentileza.

Saludos Ariel
« Última modificación: 09 de Marzo de 2010, 13:55:22 por tatielectronica »

Desconectado GDM

  • PIC10
  • *
  • Mensajes: 13
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #3 en: 09 de Marzo de 2010, 13:29:03 »
Ariel,

Estoy revisando el código y no encontré nada mal todavía, pero me surgen algunas preguntas:

1) Los fusibles del microcontrolador como los configuras?. Te pregunto dado que en el código no figura nada.
2) El archivo de cabecera del programa es el 16F870. Y por lo que pones en la consulta estas trabajando con el 16F873A.
3) Con que avalores inicializas la memoria EEPROM interna del micro? Tene en cuenta que si no inicializas con un valor va a leer 0xFF (255) y es justamente lo que te muestra en el lugar de mostrar la temperatura actual.
 
Gustavo

Desconectado tatielectronica

  • PIC10
  • *
  • Mensajes: 5
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #4 en: 09 de Marzo de 2010, 13:50:41 »
Ante nada muchas gracias por tu mensaje.

el codigo que puse es tal cual lo habia encontrado, yo le puse para cambiar esto que te describo abajo

   LIST   p=16F873A
   #INCLUDE <P16f873A.inc>

   __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC
   ERRORLEVEL   -302

ahora el tema de la eeprom ahi me matastes porque no entiendo, voy a leer sobre el tema seguramente debe estar ahi el problema porque no hice nada con la eeprom y seguramente es eso.

Te mando un abrazo
Ariel


Desconectado GDM

  • PIC10
  • *
  • Mensajes: 13
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #5 en: 09 de Marzo de 2010, 14:14:27 »
Ariel,

OK. No se con que programador estas trabajando, pero con este código

      org 0x2123
      DE   0x95,0x15

que lo tenes que poner al final de todo (antes del END) inicializas las temperaturas MAX (0x95) y MIN (0x15)
que según tu programa están en las direcciones de EEPROM 0x23 y 0x24.
Si estas trabajando con el PICSTART plus de Microchip, directamente te va a grabar el programa y la EEPROM.
De lo contrario, tenés que cargar (a mano) en la memoria EEPROM del programador que uses, los valores.

Otra cosa. Con la directiva de configuración de los fusibles (__CONFIG) habilitas el Watchdog Timer (_WDT_ON) lo cual yo no lo haría (yo pondria _WDT_OFF) y agregaría el de programación en baja tensión y el de Brown out (_LVP_OFF y _BODEN_OFF) deshabilitando a ambos.

Saludos.
Gustavo
« Última modificación: 09 de Marzo de 2010, 15:17:47 por GDM »

Desconectado tatielectronica

  • PIC10
  • *
  • Mensajes: 5
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #6 en: 10 de Marzo de 2010, 10:52:03 »
Gustavo,

Ahora mejoro bastante por lo menos en proteus queda estable
lo que me muestra la pantalla aun poniendo el teminal 2 directamente al + saltando el lm35, en un termometro facil cuando lo ponia al positivo me mostraba 255 como maximo pero aca no se mueve de 000


----------------------
 TEMP.ACT: 000
MAX:037   MIN:021
----------------------

Saludos Ariel

Desconectado GDM

  • PIC10
  • *
  • Mensajes: 13
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #7 en: 10 de Marzo de 2010, 15:48:52 »
Ariel,

Disculpa mi pregunta, pero no te entiendo. Que funciona y que no? En Proteus si te simula pero en la realidad siempre te muestra 0 como la temperatura actual?

Si tenes armado el circuito en Proteus y queres pasármelo (por email) así lo reviso, eso podría ayudar. Porque creo que hay algún tipo de problema en el circuito.

Saludos, y vamos que ya lo tenemos.

Gustavo

Desconectado pablocaro89

  • PIC10
  • *
  • Mensajes: 6
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #8 en: 13 de Julio de 2010, 11:00:15 »
Hola Ariel, me llamo Pablo, vi tu proyecto y me llamo al interés, porque yo estoy aprendiendo a usar los conversores AD y quiero hacer en base a tu proyecto uno para presentar en mi universidad, yo quería saber si podes pasar el circuito para que lo pueda usar de base, ya que todos los que encontré en Internet no andan. espero que estés muy bien y desde ya muchas gracias.

Desconectado fbelmonte

  • PIC10
  • *
  • Mensajes: 2
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #9 en: 15 de Julio de 2010, 20:06:16 »
Me sumo al pedido de pablocaro89 ya q tengo ganas de ponerle un termostato con lcd a mi sistema de calefaccion y ando buscando alguno q funcione porq dicen q el q hay en Pablin no anda.
Muchas gracias. Salu2

Desconectado transformadormx

  • PIC10
  • *
  • Mensajes: 3
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #10 en: 26 de Agosto de 2010, 10:48:13 »
Si anda el de pablin probado con 16f876.

Desconectado fitomasterman

  • PIC10
  • *
  • Mensajes: 8
Re: Termostato con lm35 pic 16f873A y pantalla 16x2
« Respuesta #11 en: 26 de Agosto de 2010, 11:55:02 »
Hola Titi encontre en una pagina este programa completo escrito en c y simulado en proteus ahi te lo subo