# Problema con termostato hecho con PIC16F870



## nep (Mar 16, 2009)

Hola amigos, despues de tanto buscar pude encontrar como hacer un termostato con PIC16F870 en la pagina http://www.pablin.com.ar/electron/circuito/mc/termost/index.htm lo simulo con el programa PROTEUS ISIS 7.2 SP6 (Adjunte el archivo PP con el HEX del pic ya cargado) y no anda del todo bien, cuando subo la temp del LM35 para que encienda el motor me da error y ahi no me responden los comandos. desde ya les digo que mucho del lenguaje no entiendo si bien soy programador visual basic y programador java... jeje.   pero estoy medio jugado con los tiempos y mucho no pude leer.
Les pido por favor que me guien para saber como arreglar el problema, ya que no se si el proyecto que esta en la pagina esta bien o soy yo que lo hice mal.
por las dudas aca les dejo el codigo fuente 
http://www.pablin.com.ar/electron/circuito/mc/termost/fuente.asm
y aca el .HEX
http://www.pablin.com.ar/electron/circuito/mc/termost/hexa.hex
DESDE YA MUCHISIMAS GRACIAS POR LEERLO


----------



## diego_z (Mar 16, 2009)

hola fijate , hace algunos años cuando empece a incurcionar con pic arme el circuito que mencionas y me anduvo sin problemas , otra es que no debes confiar del todo en proteus ya que algunas librerias para lcd con los que se compila el hex , no traen un retardo especifico para una correcta simulacion en proteus, suerte


----------



## nep (Mar 16, 2009)

Que me fije en que sentido? 
Yo se que deberia de entender el codigo, pero lo lei varias veses y no me resulta facil entenderlo, lo que quiero es saber si vale la pena armarlo obviando el tema del proteus (que en realidad me da igual si funciona correctamente o no). la idea es probarlo, armarlo y volver a postear el trabajo terminado, explicando detalladamente desde el principio como aramrlo, donde conseguir los programas, como armar el grabador de pic, etc. para que si alguien lo busca lo encuentre y lo pueda armar sin perder tiempo, por que la verdad a mi me costo mucho, siendo que cuando empece no tenia ningun conocimiento de electronica digital.


----------



## diego_z (Mar 16, 2009)

por eso te digo que lo arme y sii funciona, y que proteus no sirve para simular todos los proyectos que andan dando vueltas por ahi , este  anda al pelo armalo tranquilo, suerte


----------



## nep (Mar 17, 2009)

Bueno muchas gracias por la ayuda, no habia entendido, gracias y ya me pongo a armarlo!


----------



## nep (Mar 19, 2009)

Hay alguna forma de hacerlo mas preciso,ya que segun lo que vi solo da temperaturas enteras, yo aunque sea quisiera tener una precicion de 0.1ºC.?


----------



## alfredoivan69 (Abr 5, 2009)

A ver si alguien soluciona esa duda, habria posibilidad de aumentar la precision cambiando el codigo, para que el ingreso de datos y la temperatura la diese en decimas tambien no solo en numero enteros.

La precision que da el sensor seria cosa de cambiarlo por un lm35a pero en el tema del codigo ando un poco perdido


----------



## nep (Abr 21, 2009)

diego z, te cuento que lo arme, pero tuve y tengo problemas para programar el pic 16F870 con el ic-prog y un programador JDM, cuando paso el archivo hexa.hex el programa me dice que el archivo no contiene la palabra de configuracion (o algo asi) y que no contiene el id, igualmente le doy programar, cuando hago la verificacion de datos me dice error en 000h!. probe tambien abriendo el fuente.asm pero me dice si quiero convertir los bits, le doy que si y programo , no anda, lo cargo de nuevo y respondo que no, tampoco anda. 
ayuda por favor!
estoy tan cerca, seria una lastima no poder concretarlo.


----------



## jaimehedgehog (Mar 31, 2011)

como le hicieron. yo o arme en fisico y solo me muestra cuadros un poco negros en la lcd


----------



## linax00 (May 7, 2011)

buenas queria saber si me puden ayudar armar el termostato pablin ?


----------



## adolf0 (Ago 31, 2011)

hola amigos!..me pueden decir los ajustes de parámetros de grabación (wacht dog,oscilador,etc) que utilizaron para el proyecto del termostato de pablin??el del pic16f870?? porque no me funciona, tengo un programador universal de minipa MTP1020...gracias!!!


----------



## astonf15 (Ago 31, 2011)

buenas amigos

yo monte el proyecto del termostato en PROTEUS y en proteus me funciona bien lo que quiere decir que al llevarlo al fisico TIENE que funcionar bien.. si el lcd se ve todo negro puede ser porque no le has regulado el contraste..


----------



## jaimehedgehog (Sep 1, 2011)

yo he utilizado mucho las lcd y en el termostato de pablin por mas que le intente no lo pude armar, tuve que hacer uno yo mismo



astonf15 dijo:


> buenas amigos
> 
> yo monte el proyecto del termostato en PROTEUS y en proteus me funciona bien lo que quiere decir que al llevarlo al fisico TIENE que funcionar bien.. si el lcd se ve todo negro puede ser porque no le has regulado el contraste..



yo he manejado lcd y en ese termostato no lo pude hacer echar a andar, muchos diagramas pueden funcionar en proteus pero en fisico ya no, te lo digo por experiencia propia


----------



## rockwolfgang77 (Nov 19, 2011)

Usé el pickit2 y su respectivo software para programar el pic16f870 con el archivo .hex y no dió problema alguno al escribir y verificar el programa.  En proteus funcionó perfectamente con un display LM016L, pero físicamente armado este circuito no depliega datos en el display.
Alguno ha dado con la solución o les ha trabajado físicamente este proyecto?

Saludos.


----------



## jaimehedgehog (Nov 19, 2011)

por lo menos a mi no me funciono y eso que le di viltajes adecuados y el brillo a la lcd y ni asi funcionno, tuve que programar uno yo mismo para poder hacer uno,


----------



## rockwolfgang77 (Nov 21, 2011)

Gracias por tu respuesta, al menos ya se sabe que el display no es el adecuado.  Como es que configuraste o programaste un display, jaimehedgehog?, Podrías compartir ese conocimiento?, lo que pasa es que requerimos un control de temperatura para viviendas y ese nos pareció bueno y no queremos quitar el dedo del renglón tan fácilmente. Si pudieras tu o alguien mas ayudarnos con eso que mencionaste de la programación del display se los agradeceríamos mi equipo y yo enormemente.

Saludos.


----------



## jaimehedgehog (Nov 21, 2011)

simplemente coloca un potenciometro de 10k, la pata de enmedio la mandas al pin 3 de la LCD y las otras 2 del potenciometro una a tierra y otra a voltaje

yo tengo otro termostato pero com un pic 16f877a y ese a mi me funciono perfecto,
http://www.taringa.net/posts/ciencia-educacion/12419389/termostato-con-pic16f877A.html es un post que realize tal vez te puede ayudar y ahi viene la configuracion de la LCD, 


espero que alla sido de tu ayuda

PD
ese termostato que te digo no es programable, para cambiarle la temperatura tiene que ser desde el codigo fuente


----------



## chapu87 (Dic 8, 2011)

el proyecto lo arme y realmente no funciona el contraste lo puedo ajustar mediante el potenciometro de 10 k con esto se ven esos cuadros negros pero en ningun momento se ven los datos de temperatura, creo que la programacion en el pic tiene defectos al iniciar con el display, por favor si alguien lo logro hacer funcionar fisicamente, que facilite el .hex o el asm.


----------



## ilcapo (Dic 8, 2011)

Una pregunta,,, para sensar la temperatura todo bien con el circuito pero si queremos CONTROLAR la temperatura me dijieron que hace falta un controlador PID que se puede hacer por software, alguien sabe como se hace esto por software?? saludos!


----------



## chapu87 (Dic 8, 2011)

estuve investigando y me encontre con un datasheet de fe de errata del pic 16f870
http://www.rodrigog.com/pic/pic16f870_err.pdf
estuve leyendo y aparecen varias modificaciones del pic en este datasheet. llege a la conclusion que el circuito que aparece en la pagina de pablin no funciona por lo mismo dado a que en su momento cuando lo pulicaron en la pagina no consideraron estas modificaciones del pic. fin
espero que esta observacion les sea util y no malgasten alrededor de 19000 pesos chilenos


----------



## pandacba (Dic 8, 2011)

El termostato echo en la pagina de pablin le ha funcionado a mucha gente, la mayoria comete muchos errores con los simuladores porque existen dos problemas para los programadores, como  no tienen los conocimientos de electronica necesarios creen que un simulador es la salvación y cuando alli no funciona la culpa la tiene el simulador.

Por otro lado tampoco dominan al mismo simulador hay que conocerlo muy bien para poder sacarle probecho.

Los que más provecho le sacan a la simulación es a los que dominan electrónica y domina al simulador....

Le sacaran más provecho montando en una protoboard que en el simulador....

Il capo, solo en determinados casos hace faltan funciones PID en muchas un termostato simple funciona perfecto


----------



## chapu87 (Dic 9, 2011)

yo lo simule en proteus y todo bien no digo que al simular este no funcione, lo que quiero decir es que al llevarlo al fisico este no funciona no muestra datos en el display, es por ello que mencione que el pic tiene unas modificaciones que aparecen el datasheet (fe de errata). este es el link para ver el pdf del pic 16f870.
http://www.rodrigog.com/pic/pic16f870_err.pdf



si alguien lo hizo funcionar fisicamente favor que disponga el codigo asm o el hex, tengo el proyecto armado pero no funciona, esta conectado tal cual como aparece en la pagina de pablin. se agradeceria mucho, por que ya he gastado 19000 pesos chilenos en materiales para este proyecto


----------



## pandacba (Dic 9, 2011)

Diego_z afirma que le funciono, fijate en los post anteriores


----------



## julio quatrini (May 28, 2014)

Soy nuevo en este foro los amigos tienen razon e proyecto de pablin termostato digital si funciona en proteus mas al montarlo en fisico los datos no son visializados y en siertas ocaciones salen cuadros negros e revisado el programa muchas veces y no e podido ver donde esta el problema, pues bien e buscado informacion y no e logrado nada solo tengo una idea mas no se si es correcta  y es que haya que precargar la lcd con los caracteres osea la tabla alfanumerica en la memoria de la lcd y eso no se como se hacer gracias


----------



## jaimehedgehog (May 28, 2014)

yo me hice un termostato igual y funciona al 100, si lo quieres solo dime


----------



## ilcapo (May 30, 2014)

el 99,9% de los circuitos de pablin son un fraude, todo el mundo tiene problemas, hay algunos que apenas los ves ya te das cuenta que no van a funcionar


----------



## julio quatrini (Jul 16, 2014)

hola jaimehedgehog me podras enviar tus diseños para ver si lo puedo aplicar para enfriar agua gracias por tu ayuda


----------



## jaimehedgehog (Jul 20, 2014)

Este es el archivo del termostato.
Por favor respóndeme que te pareció y que tal te funcionó.

Saludos.


----------



## julio quatrini (Jul 24, 2014)

hola jaime gracias esta muy bueno lo estuve revisando y medi que no tienes una salida que activara a un rele para cuando llegara a la temperatura, el rele sirve para arrancar o parar un compresor de enfriamiento o un motor bomba, tu proyecto lo realizastes con la pantalla en 4 bits esta fino, en el programa asm lo puedes modificar 

              gracias julio quatrini desde venezuela


----------



## jaimehedgehog (Jul 24, 2014)

De hecho si la tiene, no recuerdo cual es pero si tiene una salida, no recuerdo si el el rc0 o el rd0, pero si la tiene


----------



## julio quatrini (Jul 25, 2014)

buen dia jaime disculpame si la tiene es la RD0 pin 19 te estaba tratando de escribirte ayer mismo una hora despues de mi mensaje para disculparme pero el internet se colapso y no pude. jaime es posible que me puedas enviar el archivo ASM es que me gustaria saber como controlaste la pantalla y aprender mas de esta programacion, gracias por tu ayuda es excelente buen dia


                    gracias julio quatrini desde venezuela


----------



## jaimehedgehog (Jul 25, 2014)

a qui te dejo el asm, esta un poco largo y tedioso jejjejee


----------



## julio quatrini (Jul 25, 2014)

hola jaime mis saludos ante todo y gracias  por el archivo lo revisare y tan pronto lo monte te informo como marcha o si tuve algún problema gracias nuevamente me despedido


                                julio quatrini desde venezuela


----------



## Meta (Jul 26, 2014)

Hola:

El mejor termostato que he visto y funciona a la primera, es este.






http://pic16f84a.org/proteus.html#Proteus_Capitulo_28

Si quieres, te paso el código fuente.


----------



## julio quatrini (Jul 27, 2014)

hola META gracias por tu ofrecimiento por favor enviamelo para revisar para ver si puedo utilizarlo en mi proyecto, para controlar agua fria gracias

                  julio quatrini desde  venezuela


----------



## Meta (Jul 28, 2014)

Su código es:


```
; Programa de control para un termómetro y termostato digital. Utiliza el sensor de
; temperatura DS1820 que transmite la información vía serie a través de un bus de una
; sola línea según un protocolo del fabricante de semiconductores Dallas Semiconductors.
;
; El ajuste de la temperatura a la que conmuta el termostato se logra mediante dos
; pulsadores: "MODO" e "INCREMENTAR", que se conectan a pines del Puerto B y cuyo
; funcionamiento se basa en interrupción por cambio en la línea del Puerto B.
;
; Se maneja de la siguiente forma:
; -    En estado de reposo funciona sólo como termómetro. Aparece la temperatura en pantalla
;    del módulo LCD. La salida del termostato está apagada.
; -    Pulsa "MODO" y se ajusta la temperatura deseada mediante el pulsador "INCREMENTAR".
; -    Vuelve a pulsar "MODO", se activa el termostato. Si la temperatura medida es menor
;    que la deseada enciende la carga, que puede ser un calefactor. Si la temperatura 
;    medida es mayor que la deseada, apaga la carga.
; -    Si se vuelve a pulsar "MODO", apaga la carga y pasa a funcionar sólo como termómetro.
;
; Así pues, en el circuito se distinguen tres modos de funcionamiento que se identifican
; mediante tres flags:
; A)    Modo "Termostato_OFF", donde funciona como termómetro normal sin termostato. Se
;        reconoce por el flag F_Termostato_OFF.
; B)    Modo "Termostato_Ajuste", donde se ajusta la temperatura deseada cuando funcione
;        como termostato. Se reconoce por el flag F_Termostato_Ajuste.
; C)    Modo "Termostato_ON", donde funciona como termómetro normal con termostato. Se
;        reconoce por el flag F_Termostato_ON.
;
; El programa consigue que esté activado uno solo de los flags anteriores.
;
; Al apagar el sistema debe conservar el valor de la temperatura deseada en el termostato
; para la próxima vez que se encienda.
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    CBLOCK    0x0C
    TemperaturaDeseada
    Registro50ms                            ; Guarda los incrementos cada 50 ms.
    FlagsModos                                ; Guarda los flags para establecer los
    ENDC                                    ; modos de trabajo.

    ORG    0x2100                                ; Corresponde a la dirección 0 de la zona
                                            ; EEPROM de datos. Aquí se va a guardar el
    DE    .24                                    ; la temperatura deseada. En principio 24 ºC.

#DEFINE  SalidaTermostato         PORTB,1        ; Carga controlada por el termostato.
#DEFINE  Zumbador                 PORTB,2        ; Aquí se conecta el zumbador.
#DEFINE  ModoPulsador            PORTB,7        ; Los pulsadores se conectan a estos
#DEFINE  IncrementarPulsador    PORTB,6        ; pines del puerto B.
#DEFINE  F_Termostato_ON        FlagsModos,2    ; Flags utilizados en el ajuste de la
#DEFINE  F_Termostato_Ajuste    FlagsModos,1    ; temperatura del termostato.
#DEFINE  F_Termostato_OFF        FlagsModos,0

TMR0_Carga50ms    EQU    d'256'-d'195'            ; Para conseguir interrupción cada 50 ms.
CARGA_2s        EQU    d'40'                    ; Leerá cada 2s = 40 x 50ms = 2000ms.    

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0
    goto    Inicio
    ORG    4
    goto    ServicioInterrupcion

Mensajes
    addwf    PCL,F
MensajePublicitario
    DT "IES. ISAAC PERAL", 0x00
MensajeTermostato_ON
    DT "Termostato: ", 0x00
MensajeTermostato_Ajuste
    DT "Temper. deseada", 0x00
MensajeGradoCentigrado
    DT "ºC  ", 0x00                    ; En pantalla LCD: "ºC  "

Inicio    
    call    LCD_Inicializa
    bsf        STATUS,RP0
    movlw    b'00000111'                ; Prescaler de 256 para el TMR0 y habilita
    movwf    OPTION_REG                ; resistencias de Pull-Up del Puerto B.
    bsf        ModoPulsador            ; Se configuran como entrada.
    bsf        IncrementarPulsador
    bcf        SalidaTermostato        ; Se configuran como salida.
    bcf        Zumbador
    bcf        STATUS,RP0
    call    LCD_Linea1                ; Se sitúa al principio de la primera línea.
    movlw    MensajePublicitario
    call    LCD_Mensaje
    call    DS1820_Inicializa        ; Comienza la conversión del termómetro y pone
    call    ModoTermostato_OFF        ; este modo de funcionamiento.
    movlw    TMR0_Carga50ms            ; Carga el TMR0 en complemento a 2.
    movwf    TMR0
    movlw    CARGA_2s                    ; Y el registro cuyo decremento contará los 2 s.
    movwf    Registro50ms
    clrw                            ; Lee la posición 0x00 de memoria EEPROM de datos
    call    EEPROM_LeeDato            ; donde se guarda la temperatura deseada de la última
    movwf    TemperaturaDeseada        ; vez que se ajustó.
    movlw    b'10101000'                ; Activa interrupción del TMR0 (T0IE), por cambio de
    movwf    INTCON                    ; líneas del Puerto B (RBIE) y la general (GIE)
;
; La sección "Principal" es mantenimiento. Sólo espera las interrupciones.
; No se puede poner en modo de bajo consumo porque la instrucción "sleep" detiene el Timer 0.

Principal
    goto    Principal

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Detecta qué ha producido la interrupción y ejecuta la subrutina de atención correspondiente.

ServicioInterrupcion
    btfsc    INTCON,T0IF                ; Si es una interrupción producida por el Timer 0
    call    Termometro                ; lee el termómetro y actualiza termostato.
    btfss    INTCON,RBIF                ; Si es una interrupción RBI lee los pulsadores.
    goto    FinInterrupcion
    btfss    ModoPulsador            ; ¿Está presionado el pulsador de "AJUSTE"?
    call    CambiarModo                ; Sí. Ajusta la temperatura deseada en el termostato.
    btfss    IncrementarPulsador        ; ¿Pulsado "INCREMENTAR"?
    call    IncrementarTempDeseada    ; Sí, pasa a incrementar la temperatura deseada.
FinInterrupcion
    bcf        INTCON,RBIF                ; Limpia los flags de reconocimiento.
    bcf        INTCON,T0IF
    retfie

; Subrutina "Termometro" ----------------------------------------------------------------
;
; Esta subrutina lee y visualiza el termómetro cada 2 segundos aproximadamente. Se ejecuta
; debido a la petición de interrupción del Timer 0, cada 50 ms. Para conseguir una
; temporización de 2 s, habrá que repetir 40 veces el lazo de 50 ms (40x50ms=2000ms=2s).
;
; También actúa sobre la salida del termostato posicionándola adecuadamente.

Termometro
    movlw    TMR0_Carga50ms
    movwf    TMR0                    ; Recarga el TMR0.
    decfsz    Registro50ms,F            ; Decrementa el contador.
    goto    FinInterrupcion            ; No han pasado 2 segundos, por tanto sale.
    movlw    CARGA_2s                ; Repone este contador nuevamente.
    movwf    Registro50ms
    call    DS1820_LeeTemperatura    ; Lee la temperatura.
    call    DS1820_Inicializa        ; Comienza conversión para la siguiente lectura.
    call    Termostato                ; Actúa sobre el termostato.
;    call    Visualiza                ; Como esta subrutina se escribe a continuación
;    return                            ; se ahorra estas dos instrucciones y ahorra 
                                    ; también espacio en la pila.
; Subrutina "Visualiza" -----------------------------------------------------------------
;
; Visualiza el termómetro en tres formatos posibles:
; A)    Con el termostato desactivado, modo "Termostato_OFF". Por ejemplo:
;                 "IES. Isaac Peral" (Primera línea)
;                "       24.5ºC   " (Segunda línea).
;        Donde en la primera línea se visualiza un mensaje publicitario y en la
;        segunda línea la temperatura medida actual.
; B)    Ajuste del termostato, modo "Termostato_Ajuste". Por ejemplo:
;                 "Temper. deseada" (Primera línea)
;                "        25ºC     " (Segunda línea).
;         Donde en la segunda línea visualiza la temperatura que se desea ajustar.
; C)    Con el termostato activado, modo "Termostato_ON". Por ejemplo:
;                 "Termostato: 25ºC" (Primera línea)
;                "      23.5ºC    " (Segunda línea).
;         Donde en la primera línea se visualiza la temperatura que se desea
;        ajustar y en la segunda línea la temperatura medida actual.
Visualiza
    btfsc    F_Termostato_OFF
    goto    VisualizaTermometro
    btfsc    F_Termostato_Ajuste
    goto    VisualizaTermostato_Ajuste
    btfsc    F_Termostato_ON
    goto    VisualizaTermostato_ON
    return

; "VisualizaTermostato_ON" --------------------------------------------------------------
;
; Visualiza el valor de la temperatura deseada en la primera línea y el valor de la
; temperatura medida en la segunda línea.
; 
VisualizaTermostato_ON
    call    LCD_Linea1
    movlw    MensajeTermostato_ON
    call    LCD_Mensaje
    call    VisualizaTemperaturaDeseada
    call    VisualizaTemperaturaMedida
    return

; "VisualizaTermostatoAjuste" y "VisualizaTemperaturaDeseada" ---------------------------
;
; Visualiza en la pantalla el formato propio de este modo.
; 
; Entradas:    (TemperaturaDeseada) temperatura ajustada en la subrutina Incrementar.

VisualizaTermostato_Ajuste
    call    LCD_Linea1                    ; Se sitúa al principio de la primera línea.
    movlw    MensajeTermostato_Ajuste    ; Visualiza mensaje en la primera línea.
    call    LCD_Mensaje
    movlw    .6                            ; Se coloca para centrar visualización en la 
    call    LCD_PosicionLinea2            ; segunda línea.
VisualizaTemperaturaDeseada
    movf    TemperaturaDeseada,W
    call    BIN_a_BCD                    ; La pasa a BCD.
    call    LCD_Byte                    ; Visualiza, apagando los ceros no significativos.
    movlw    MensajeGradoCentigrado        ; En pantalla aparece "ºC  ".
    call    LCD_Mensaje
    return

; "VisualizaTermometro" y ""VisualizaTemperaturaMedida" ---------------------------------
;
; En la primera línea se visualiza un mensaje publicitario y en la segunda línea la
; temperatura medida
;
; Entradas:
;      -    (DS1820_Temperatura), temperatura medida en valor absoluto.
;     -    (DS1820_TemperaturaDecimal), parte decimal de la temperatura medida.
;     -    (DS1820_Signo), registro con el signo de la temperatura. Si es igual a
;        b'00000000' la temperatura es positiva. Si es b'11111111' resulta que
;        la temperatura es negativa.
;
VisualizaTermometro
    call    LCD_Linea1                ; Se sitúa al principio de la primera línea.
    movlw    MensajePublicitario
    call    LCD_Mensaje
VisualizaTemperaturaMedida
    movlw    .5                        ; Se coloca para centrar visualización en la
    call    LCD_PosicionLinea2        ; segunda línea.
    btfss    DS1820_TemperaturaSigno,7 ; ¿Temperatura negativa?
    goto    TemperaturaPositiva        ; No, es positiva.
TemperaturaNegativa:
    movlw     '-'                        ; Visualiza el signo "-" de temperatura negativa.
    call    LCD_Caracter
TemperaturaPositiva
    movf    DS1820_Temperatura,W
    call    BIN_a_BCD                ; La pasa a BCD.
    call    LCD_Byte                ; Visualiza apagando los ceros no significativos.
    movlw    '.'                        ; Visualiza el punto decimal.
    call    LCD_Caracter
    movf    DS1820_TemperaturaDecimal,W ; Visualiza la parte decimal.
    call    LCD_Nibble
    movlw    MensajeGradoCentigrado    ; En pantalla LCD aparece "ºC  ".
    call    LCD_Mensaje
    return

; Subrutina "Termostato" ----------------------------------------------------------------
;
; Controla una carga en función del valor de la temperatura medida respecto de la temperatura
; deseada. Para evitar inestabilidad en la salida, tendrá un pequeño ciclo de histéresis.
; Así por ejemplo, si la temperatura deseada es 24 ºC la carga se activará cuando la
; temperatura baje o sea igual a 23,5 ºC y se apagará cuando la supere o sea igual a 25ºC.
; Si la temperatura medida está entre esos márgenes (23,5 y 25ºC), se queda en el estado
; anterior, tanto si está encendida como apagada.
;
; Para temperaturas negativas la salida se debe activar siempre.
;
; Entradas:
;         -    (DS1820_Temperatura), temperatura medida en valor absoluto.
;         -    (TemperaturaDeseada), temperatura a partir de la cual se tomarán
;            decisiones sobre la salida.
;         -    (DS1820_Signo), registro con el signo de la temperatura medida. Si es cero
;            la temperatura es positiva y todos sus bits son "1", es negativa.
;
; Salida:    -    Su funcionamiento:
;              -    Estando apagada, si la temperatura medida desciende por debajo de la
;                temperatura deseada la salida se activará.
;             -    Estando encendida, si la temperatura medida supera la deseada la
;                salida se apagará.
;             -    Si las temperaturas medidas y deseada son iguales se queda en estado
;                anterior, tanto si está encendida como si está apagada.
;             -    Para temperaturas negativas la salida se debe activar siempre.
Termostato
    btfss    F_Termostato_ON            ; Si el termostato no está activado salta a
    goto    ApagaCarga                ; apagar la carga.
    btfsc    DS1820_TemperaturaSigno,7    ; Con temperaturas negativas pasa a activar
    goto    EnciendeCarga            ; la carga.
    btfss    SalidaTermostato        ; Comprueba el estado actual de la salida para
    goto    SalidaEstabaApagada        ; actuar en consecuencia.
SalidaEstabaActivada                ; Pasa a comprobar si tiene que apagar la carga.
    movf    DS1820_Temperatura,W
    subwf    TemperaturaDeseada,W    ; (W)=(TemperaturaDeseada)-(DS1820_Temperatura).
    btfsc    STATUS,C                ; ¿(TemperaturaDeseada)<(DS1820_Temperatura)?    
    goto    FinTermostato            ; Sí, por tanto, lo deja encendido y sale.
    call    Pitido                    ; Pitido cada vez que conmuta la carga.
ApagaCarga
    bcf        SalidaTermostato        ; Apaga la salida y sale.
    goto    FinTermostato
SalidaEstabaApagada                    ; Pasa a comprobar si tiene que encender la carga
    movf    TemperaturaDeseada,W
    subwf    DS1820_Temperatura,W    ; (W)=(DS1820_Temperatura)-(TemperaturaDeseada).
    btfsc    STATUS,C                ; ¿(DS1820_Temperatura)<(TemperaturaDeseada)?    
    goto    FinTermostato            ; Sí, la deja apagada y sale.
EnciendeCarga
    call    Pitido                    ; Pitido cada vez que activa la carga.
    bsf        SalidaTermostato
FinTermostato
    return

; Subrutinas "CambiarModo" y "ModoTermostato_OFF" -----------------------------------------
;
; Subrutina de atención a la interrupción producida por el pulsador "MODO" que cambia el modo
; de funcionamiento. Cada vez que pulsa pasa por los modos "Termostato_Ajuste", "Termostato_ON",
; "Termostato_OFF" y vuelta repetir.
;
; El ajuste de la temperatura deseada en el termostato se logra mediante dos pulsadores: "MODO"
; e "INCREMENTAR" conectados a pines del Puerto B.

; Al principio aparecerá sólo el termómetro y el termostato estará desactivado: modo
; "Termostato_OFF"
;
; Para comprender el funcionamiento de esta subrutina, hay que saber que el registro FlagsModos
; contiene 3 flags que permiten diferenciar cada uno de los modos de funcionamiento:
; A)    Modo "Termostato_OFF", donde funciona como termómetro normal sin termostato. Se
;        reconoce por el flag F_Termostato_OFF, que es el bit 0 del registro FlagsModos.
; B)    Modo "Termostato_Ajuste", donde se ajusta la temperatura deseada cuando funcione
;        como termostato. Se reconoce por el flag F_Termostato_Ajuste, que es el bit 1 del
;        registro FlagsModos.
; C)    Modo "Termostato_ON", donde funciona como termómetro normal y, además, como termostato.
;        Se reconoce por el flag F_Termostato_ON, que es el bit 2 del registro FlagsModos.
;
; Así pues, el contenido del registro (FlagsModos) identifica los siguientes modos de
; funcionamiento:
; - (FlagsModos)=b'00000001'. Está en el modo "Termostato_OFF".
; - (FlagsModos)=b'00000010'. Está en el modo "Termostato_Ajuste".
; - (FlagsModos)=b'00000100'. Está en el modo "Termostato_ON".

; Pueden darse dos casos:
; -    Que pulse "AJUSTE" estando en el modo más alto, "Termostato_ON",
;    (FlagsModos)=b'00000100'. En este caso debe pasar al modo inicial 
;    "Termostato_OFF" poniendo (FlagsModos)=b'00000001'.
; -    Que pulse "AJUSTE" estando ya en cualquiera de los otros dos modos, en cuyo caso debe
;    pasar al siguiente modo. Esto lo hace mediante un desplazamiento a izquierdas. Así, por
;    ejemplo, si antes estaba en modo "Termostato_OFF", (FlagsModos)=b'00000001', pasará a
;    (FlagsModos)=b'00000010' que identifica al modo "Termostato_Ajuste".
;
CambiarModo
    call    Retardo_20ms            ; Espera a que se estabilicen niveles de tensión.
    btfsc    ModoPulsador            ; Si es un rebote, sale fuera.
    goto    FinCambiarModo
    call    PitidoCorto                ; Cada vez que pulsa se oye un pitido.
    btfss    F_Termostato_ON            ; Detecta si está en el último modo.
    goto    ModoSiguiente            ; Si no, pasa al modo siguiente.
ModoTermostato_OFF
    call    Pitido                    ; Pitido cada vez que conmuta la carga.
    bcf        SalidaTermostato        ; Apaga la carga.
    movlw    b'00000001'                ; Actualiza el registro FlagsModos pasando al
    movwf    FlagsModos                ; modo inicial "Termostato_OFF".
    goto    BorraPantalla
ModoSiguiente                        ; Desplaza un "1" a la izquierda del registro
    bcf        STATUS,C                ; FlagsModos para ajustar secuencialmente
    rlf        FlagsModos,F            ; cada uno de los modos de funcionamiento.
BorraPantalla
    call    LCD_Borra                ; Borra la pantalla anterior.
FinCambiarModo
    call    Visualiza
    btfss    ModoPulsador            ; Ahora espera a que deje de pulsar.
    goto    FinCambiarModo
    return

; Subrutina "IncrementarTempDeseada" ----------------------------------------------------
;
; Subrutina de atención a la interrupción por cambio de la línea RB6 a la cual se ha conectado
; el pulsador "INCREMENTAR". Estando en el modo "Termostato_Ajustar" incrementa el valor de
; la temperatura deseada entre unos valores máximo y mínimo.
;
; Al final debe guardar el valor de la temperatura deseada en memoria EEPROM de datos para
; preservar su valor en caso que desaparezca la alimentación.
;
TemperaturaMinima   EQU    .20
TemperaturaMaxima   EQU    .36

IncrementarTempDeseada
    call    Retardo_20ms            ; Espera a que se estabilicen niveles de tensión.    
    btfsc    IncrementarPulsador        ; Si es un rebote sale fuera.
    goto    FinIncrementar
    btfss    F_Termostato_Ajuste        ; Si no está en modo "Termostato_Ajuste" sale
    goto    FinIncrementar            ; fuera.
    call    PitidoCorto                ; Pitido cada vez que pulsa.
    incf    TemperaturaDeseada,F    ; Incrementa el valor de la temperatura deseada.
    movlw    TemperaturaMaxima        ; ¿Ha llegado a la temperatura máxima de ajuste?.
    subwf    TemperaturaDeseada,W    ; (W) = (TemperaturaDeseada) - TemperaturaMaxima.
    btfss    STATUS,C                ; ¿(TemperaturaDeseada)>=TemperaturaMaxima?
    goto    VisualizaIncremento        ; No, pasa a visualizarlo.
    movlw    TemperaturaMinima        ; Sí, entonces inicializa el registro.
    movwf    TemperaturaDeseada
VisualizaIncremento
    call    Visualiza                ; Visualiza mientras espera a que deje
    call    Retardo_200ms            ; de pulsar.
    btfss    IncrementarPulsador        ; Mientras permanezca pulsado,
    goto    IncrementarTempDeseada    ; incrementa el dígito.
    clrw                            ; Salva el valor de la temperatura deseada en la 
    movwf    EEADR                    ; posición 00h de la EEPROM de datos. Se conserva
    movf    TemperaturaDeseada,W    ; aunque se apague la alimentación.
    call    EEPROM_EscribeDato
FinIncrementar
    return

; Subrutina de pitidos ------------------------------------------------------------------
;
PitidoLargo
    bsf        Zumbador
    call    Retardo_500ms
Pitido
    bsf        Zumbador
    call    Retardo_200ms
PitidoCorto
    bsf        Zumbador
    call    Retardo_20ms
    bcf        Zumbador
    return
;
    INCLUDE  <BUS_1LIN.INC>            ; Subrutinas de control del bus de 1 línea.
    INCLUDE  <DS1820.INC>            ; Subrutinas de control del termómetro digital.
    INCLUDE  <RETARDOS.INC>
    INCLUDE  <BIN_BCD.INC>
    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <EEPROM.INC>
    END
```

Saludo.


----------



## julio quatrini (Jul 28, 2014)

Hola meta saludos gracias por tu envio esta muy bueno lo voy a revisar y luego te dijo como me fue gracias

He estado revisando el programa y el diagrama que esta hecho en proteus pero no entiendo las conexiones y con esa linea azul no pude lograr quitarla para ver como son las conexiones tu sabes como ver las conexiones gracias

                 julio quatrini desde venezuela


----------



## Roberto Verdecia (May 28, 2020)

Yo lo armé con el 16f877 y el lcd 1602a y un lm35 y funcionó perfecto, lo malo fue que no me servía porque solo podia medir temperaturas de hasta 80 o 90 grados Celcios y a mi me hace falta mayor temperaturas, a mas de 250 o 350 grados.


----------



## pepibho (Jun 4, 2020)

En tonces solo tendrás que calibrar los valores a relación de esa temperatura, a un que tengas que poner un aislante térmico para que el sensor no reciba directamente los 350°c si no 180°c y ponerlos como 350.
Pero lo que si es calibrar el nuevo rango de referencia y hueco para las 3 cifras de la temperatura (que seguro que ya las tiene)

Aun así me parece un programa bastante bien estructurado para ser de meta completamente, y le faltan todas las subrutinas que al estar en mplab se habren como distintas partes de programa implementándose, que es la forma correcta.
Aun así faltan.

No llego a topar la variable de temperatura leída. Esta la histeresis de la temperatura deseada, como temperatura mínima y máxima. Pero no topo la temperatura que hay y su calibración para reajustar.

Na... Un placer


----------

