Autor Tema: ajuste de termometro  (Leído 5306 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
ajuste de termometro
« en: 07 de Octubre de 2016, 00:54:05 »
Un saludo a todos:Tengo un problema con la comparación de registros.El asunto es el siguiente:cuando los registros son 0 apaga  la salida 5,1 pero cuando se pasa una décima (es un termómetro) por la inercia del calor,vuelve y se prende el 5,1.¿sabríais solucionarme este problema?.
No puedo sumarlos a otro registro ya que es igual 27.2 que 28.1 Me quede atascado aquí.No puedo  Gracias



;--------------------------------------------------------------------------------------------
CICLO 
        movf      tunib,0      ;temperatura progamada
        subwf     univ,0      ;lectura del sensor
        btfss     3,0
        goto      pasi

        movf      tdecb,0
        subwf     decv,0
        btfss     3,0
        goto      pasi
     
        movf      tcenb,0
        subwf     cenv,0
        btfss     3,0
        goto      pasi

        bcf       0x05,1
       
        goto      paso
pasi    bsf       0x05,1         
       
paso     vuelve y lee
       
 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:ajuste de termometro
« Respuesta #1 en: 07 de Octubre de 2016, 08:31:30 »
Hace una histeresis... pregunta 2 veces por cada registro.

Suponete que medis 25º, la salida 5 se apaga, de ahora en adelanta como sabes que se apago en ves de seguir preguntando por 25º preguntas por 26º, de esa forma la salida esta ves se activaria cuando pase 1 grado mas. Luego cuando esta activo preguntas si bajo de 25º, de esa forma recien ahi apagas la salida.

Resumen:

Apagado --- 25ºC ---- No se modifica --- 26ºC ----- Encendido

Ese grado hace que por 1 decima no este cambiando a cada rato la salida.

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
Re:ajuste de termometro
« Respuesta #2 en: 08 de Octubre de 2016, 01:34:36 »
Hola killerjc: Siempre tan atento, se te agradece inmensamente.¿donde le subo, a la temperatura programada o a la lectura del sensor?Si fueses tan amable ¿me prodrias hacer un ejemplo de esta parte?,o soy muy obtuso de cabeza o me estoy haciendo viejo.Mil gracias

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re:ajuste de termometro
« Respuesta #3 en: 08 de Octubre de 2016, 09:06:13 »
Buenas, a la temperatura programada, imagina que funciona de la misma manera que tu Acodicionador de Aire. Si tu le pones(programas) 25° el mismo tendrá encendido el compresor hasta que la temperatura descienda de 25°, en ese momento la temperatura programada sera igual a la temperatura leída por el sensor. Luego, el compresor no encendera automaticamente cuando la temperatura sea 25,1°, sino que tiene una histeresis, por ejemplo el caso que te propone Killer es de 1°, o sea, ahora colocas la temperatura programada + x °C(1 en este caso) por lo que hasta que el sensor no lea 26° no volvera a encender.
Puedes poner cualquier histeresis mas alta, demorando mas tiempo el encendido, hasta que se cumpla la condicion.

Espero haberme explicado.
Salutes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:ajuste de termometro
« Respuesta #4 en: 08 de Octubre de 2016, 15:33:16 »
Hola killerjc: Siempre tan atento, se te agradece inmensamente.¿donde le subo, a la temperatura programada o a la lectura del sensor?Si fueses tan amable ¿me prodrias hacer un ejemplo de esta parte?,o soy muy obtuso de cabeza o me estoy haciendo viejo.Mil gracias

A la temperatura programada, el sensor va a leer lo que tenga que leer. Supongamos nuevamente que lees 25º, y queres tener un margen de 1º, que se active la salida a los 26º y se desactive a los 25º.

Lo que vas a hacer vos es:

- Preguntar si la salida esta en 1 o en 0
- Si esta en 1, entonces comparas con 25º una ves que es menor , lo pones en 0
- Si esta en 0, entonces coparas con 26º una ves que sea mayor, lo pones en 1.

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
Re:ajuste de termometro
« Respuesta #5 en: 11 de Octubre de 2016, 11:20:25 »
Un saludo:Si ajusto a 27,5 y temperatura esta en 20.5 voy calentando el sensor hasta llegar a la temperatura programada hasta aqui todo bien.El problema es cuando es superior la temperatura al ajuste.ej ajuste 27.5 subo la temperatura a 40,cuando desciende 39.9 39.8 39.7 39.6 39.5 sigue apagado el led cuando baja de 39.5 se prende y asi en 38.5 37.5 etc.creo que en la resta el registro tuni
se pone a 255 ,254 y por eso me da estos errores .¿alguna idea de como solucionarlo? Gracias por vuestro tiempo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:ajuste de termometro
« Respuesta #6 en: 11 de Octubre de 2016, 14:32:25 »
Tal ves esto te sirva:

Código: ASM
  1. MOVF    TUNIB, W        ;Temperatura a comparar
  2.         SUBLW   Umbralbajo
  3.         BTFSS   STATUS, C       ;
  4.         GOTO    Encender        ; C=0, W > TUNIB, es decir esta mas bajo que el umbral lo medido
  5.         MOVF    TUNIB, W
  6.         SUBLW   UmbralAlto
  7.         BTFSS   STATUS, C       ; C=1 si W <= TUNIB, es decir por encima del segundo umbral
  8.         RETURN
  9. Apagar:
  10.         BCF     Salida1
  11.         RETURN
  12. Encender:
  13.         BSF     Salida1
  14.         RETURN

Avizo que no lo probe, lo hice en el bloc de notas mientras estaba comiendo  :D
« Última modificación: 11 de Octubre de 2016, 14:34:26 por KILLERJC »

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
Re:ajuste de termometro
« Respuesta #7 en: 11 de Octubre de 2016, 17:38:14 »
Un saludo Killerjc:Creo que me estoy enredando.No te entiendo lo de umbral alto y umbral bajo.He conseguido que de 37.5 de ajuste,y el sensor llega la misma temperatura y se apague el bit 5,1.el problema es cuando la temperatura es mayor que el ajuste,se vuelve un circo.Necesito que cuando la temperatura sea inferior al ajuste bsf 5,1 y cuando sean iguales o mayor la temperatura que el ajuste bcf 5,1.Sumo resto por todos los lados y no hay forma.Gracias por tu tiempo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:ajuste de termometro
« Respuesta #8 en: 11 de Octubre de 2016, 17:52:13 »
El codigo que puse yo deberia hacer lo que pedis.

TUNIB = Temperatura medida ( Tendrias que tener un entero con la temperatura )
Umbralbajo = Temperatura donde se activaria ( El entero a comparar, en el ejemplo aca seria 25º )
Umbralalto = Temperatura dodne se desactiva ( El entero a comparar para apagarlo, aca serian los 26º )

Siguiendo eñ ejemplo anterior:

Encendido --- 25ºC ---- No se modifica --- 26ºC ----- Apagado
                      |                                          |                   
                      |_ Tu Umbralbajo                  |
                                                                 |_ Tu UmbralAlto

--------------------

Todo eso es posible si tenes la temperatura medida en un entero. No se como lo tenes guardado.

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
Re:ajuste de termometro
« Respuesta #9 en: 11 de Octubre de 2016, 19:39:03 »
Saludos killerjc:No se que puede pasar,envio el pedazo de codigo haber si me dices que hago mal.Le he modificado tantas cosas que igual me lo he tirado.A veces el assembler  me desquicia.Gracias



 
call   DECIMAL

;--------------------------------------------------------------------------------------------
CICLO   movf      tuni,0       ;ajuste decimales
        subwf     univ,0      ;decimales del sensor
        btfss     3,0
        goto      pasi

        movf      tuni,0
        sublw     .10
        movwf     univ
        btfss     3,0
        goto      poso

        movf      tdec,0        ;ajuste unidades
        subwf     decv,0      ;unidades del sensor
        btfss     3,0
        goto      pasi

        movf      tdec,0
        sublw     .10
        movwf     decv
        btfss     3,0
        goto      poso

        movf      tcen,0       ;ajuste decenas
        subwf     cenv,0     ;decenas del sensor
        btfss     3,0         
        goto      pasi

        movf      tcen,0
        sublw     .10
        movwf     cenv
        btfss     3,0
        goto      poso
     
poso    bcf       0x05,1
        goto      paso
pasi    bsf       0x05,1         
       
paso
        btfss   0x08,1         ;Mira el pulsador de incremento en temp. de desactivación
        call    SUBEMAX
       
        goto    Main     ;vuelve y lee

     
SUBEMAX  movf     tcen,0
         movwf    tcen
         xorlw    .9
         btfsc    3,2
         goto     lava;return
        incf      tuni,0       
        movwf     tuni
        xorlw     .10
        btfss     3,2
        goto      lava
        clrf      tuni
        incf      tdec,0
        movwf     tdec
        xorlw     .10        ;incrememto en ajuste
        btfss     3,2
        goto      lava
        clrf      tuni
        clrf      tdec
        incf      tcen,0
        movwf     tcen
        xorlw     .9;.10
        btfss     3,2
        goto      lava
        clrf      tuni
        clrf      tdec
     
lava
         movf     tuni,0
         movwf    tunib
         movf     tdec,0
         movwf    tdecb
         movf     tcen,0
         movwf    tcenb

         movf     tuni,0
         movwf    tunix
         movlw    .48
         addwf    tunix,1

         movf     tdec,0
         movwf    tdecx
         movlw    .48                ;visualizo en el display
         addwf    tdecx,1

         movf     tcen,0
         movwf    tcenx
         movlw    .48
         addwf    tcenx,1

         movlw    0x8c;##     
   call   CONTROL      
   movlw   d'1'
   call   DEMORA      ;Demora 1ms
         movf     tcenx,0
         call     DATO
         movf     tdecx, 0         
   call   DATO
         movlw    0x8f
   call   CONTROL      
   movlw   d'1'
   call   DEMORA      ;Demora 1ms
         movf     tunix, 0            ;Coloca las unidades
   call   DATO

        call      rotada
        clrf      tunix
        clrf      tdecx
        clrf      tcenx

        btfss     0x08,1
        goto     SUBEMAX
        return
   

DECIMAL  SWAPF    TempEntero,0
         ANDLW    0X0F
         ADDLW    0XF0
         MOVWF    unimil
         ADDWF    unimil,1
         ADDLW    0XE2
         MOVWF    cen
         ADDLW    0X32
         MOVWF    uni
         MOVF     TempEntero,0
         ANDLW    0X0F
         ADDWF    cen,1
         ADDWF    cen,1
         ADDWF    uni,1
         ADDLW    0XE9
         MOVWF    dec
         ADDWF    dec,1
         ADDWF    dec,1
         SWAPF    TempDecimal,0
         ANDLW    0X0F
         ADDWF    dec,1
         ADDWF    uni,1
         RLF      dec,1
         RLF      uni,1
         COMF     uni,1
         RLF      uni,1
         MOVF     TempDecimal,0
         ANDLW    0X0F
         ADDWF    uni,1
         RLF      unimil,1
         MOVLW    0X07
         MOVWF    decemil
         MOVLW    0X0A
LB1      ADDWF    uni,1
         DECF     dec,1
         BTFSS    3,0
         GOTO     LB1
LB2      ADDWF    dec,1
         DECF     cen,1
         BTFSS    3,0
         GOTO     LB2
LB3      ADDWF    cen,1
         DECF     unimil,1
         BTFSS    3,0
         GOTO     LB3
LB4      ADDWF    unimil,1
         DECF     decemil,1
         BTFSS    3,0
         GOTO     LB4

         movf     uni,0
         movwf    univ
         movf     dec,0
         movwf    decv
         movf     cen,0
         movwf    cenv

         movlw    0x30              ;Le suma 30h a los valores de UNI, DEC y CEN para que queden en ASCII
         addwf    uni, 1
         addwf    dec, 1
         addwf    cen,1

        movlw     0x85;##        ;Coloca el cursor en la posición 0Dh de la pantalla.
        call      CONTROL
        movf      cen,0
        call      DATO
        movf      dec, 0
        call      DATO
        movlw     0x88
        call      CONTROL
        movf      uni, 0
        call      DATO
        clrf      uni
        clrf      dec
        clrf      cen
        return
   
;-----------------------------------------------------------------

;########################################################################
;--------------------------------------------------------------------
Delay_1s movlw    .250
         movwf    reg6
qqq      movlw    .211
         movwf    reg2
ttt      movlw    .5
         movwf    reg3             ;segundero
ddd      decfsz   reg3,1
         goto     ddd
         clrwdt;--------------------------------------------
         decfsz   reg2,1
         goto     ttt
         decfsz   reg6,1
         goto     qqq
         return
;-------------------------------------------------------------------                 
Delay_35us
         movlw   0x0A
         movwf   d1
Delay_35us_0  clrwdt;--------------------------------------------
         decfsz  d1, f
         goto    Delay_35us_0
         return
;----------------------
mili1   movlw     .248
        movwf     reg2
PLbt    clrwdt                         
        decfsz    reg2,1
        goto      PLbt   
        goto $+1       
        clrwdt             
        return
;----------------------------------------------------------------
CONTROL bcf     0x08,7          ;Pone en bajo la línea de modo del LCD (Control)
        goto    ENVIAR            ;Se saltea la sig. línea
DATO    bsf     0x08,7          ;Pone en alto la línea de modo del LCD (Dato)
ENVIAR  movwf   0x06            ;Coloca el dato o control a enviar en el bus del LCD
        movlw   d'1'
        call    DEMORA          ;Demora 1ms
        bsf     0x08,6          ;Habilita el LCD
        movlw   d'1'
        call    DEMORA            ;Demora 1ms
        bcf     0x08,6          ;Deshabilita el LCD
        movlw   d'1'
        call    DEMORA            ;Demora 1ms
        return
;------------------------------------------------------------------------
DEMORA   movwf   tiempo2      ;Demora tantos milisegundos como valor en w
TOP2     movlw    d'110'
   movwf   tiempo1
TOP1     clrwdt;--------------------------------------------
         nop
   nop
   nop
   nop
   nop
   nop
   decfsz   tiempo1, 1
   goto   TOP1
   decfsz   tiempo2, 1
   goto   TOP2
         clrwdt;--------------------------------------------
   return
;------------------------------------------------------------------------
rotada   movlw    .25;.255
         movwf    reg6
qq      movlw    .211
         movwf    reg2
tt      movlw    .1
         movwf    reg3      ;tiempo de espera mientras estan pulsados
dd      decfsz   reg3,1    ;los botones de subir o bajar
         goto     dd
         clrwdt;--------------------------------------------
         decfsz   reg2,1
         goto     tt
         decfsz   reg6,1
         goto     qq
         return

   end

                               

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:ajuste de termometro
« Respuesta #10 en: 11 de Octubre de 2016, 22:44:46 »
Una cosa mas te pido, decime que son ( o que contienen y el formato del mismo ) cada registro que estas usando, obviamente los de los delays no me importan, es para saber que datos son y entender el programa.

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
Re:ajuste de termometro
« Respuesta #11 en: 12 de Octubre de 2016, 00:14:31 »
Un saludo killerjc:como no pude sacar tempentero y tempdecimal en 8 bit cada uno hice la conversion de 10 bit a bcd(espero que no este ahí el problema)la temperatura que visualizo es la misma que en el termometro digital normal.Disculpa tanta molestia. Este sensor me va a sacar canas negras.Gracias por todo

tuni lo paso a tunib=decimales cuando incremento el ajuste
tdec lo paso a tdecb=unidades     "        "          "
tcen lo paso a tcenb=decenas      "        "          "

en teoria esto no hace falta pasarlos a otro registro

estos registros estan en decimal por lo
tanto sumo .48 en otro registro para visualizar y
despues los borro



los registros que vienen del conversor son
uni que lo paso a univ=decimal enviado por el sensor
dec que lo paso a decv=unidades  "              "
cen que lo paso a cenv=decenas    "             "

a univ,decv y cenv NO les sumo .30

a uni,dec,cen SI les sumo .30 para visualizar y los borro ya
que a la siguiente rotación los pone


Quizás no me entiendas por que a veces no explico bien lo que necesito me pasa a menudo



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:ajuste de termometro
« Respuesta #12 en: 12 de Octubre de 2016, 15:21:20 »
Ok, si entendi correctamente si lees del sensor 25.2º

Tendrias:
CENV = 0x02
DECV = 0x05
UNIV = 0x02

Comparar estos registros pienso que haria mas largo el programa, ya que primero deberia compararse CENV (esto puede tener 3 resultados, menor, mayor o igual), Luego DECV y finalmente UNIV, todos con 3 resultados cada uno. Me decis que recibis 10 bits desde el sensor con los valores de temperatura. Es posible saber como son esos 10bits ? pienso que seria mas simple partir de aca, o directamente me podes dar que sensor estas utilizando ?. O son los 10bits del ADC (si es asi te pido la rutina de conversion de 10bits a BCD)?

Lo pregunto para ubicarme un poco mas, Si es un sensor digital y recibis 10bits como es el formato?

De esta forma (cada letra es un bit)?: ST TTTT TTDD

Donde:
S= Signo
T= Temperatura
D= Decimal

O simplemente lees del ADC y tenes que aplicar alguna formula?

PD: Problema de la conversion de 10bits a BCD no creo que sea, por que te esta dando bien el valor, sino que estas errandole al comparar.

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
Re:ajuste de termometro
« Respuesta #13 en: 12 de Octubre de 2016, 16:01:13 »
Un saludo killerjc: Sigo rompiéndome la cabeza con el DHT22.Como no pude sacar TempEntero por un lado y TempDecimal por otro(no se porque)pues los metí en un conversor de 10 bit a bcd y esta marcando bien la temperatura.El lío de la cuestión esta en comparar los registros.Cuando el ajuste es superior a la temperatura va bien,pero cuando supera la temperatura al ajuste(despues de 200 pruebas),se vuelve loco.Para que te hagas una idea: calibración 27.5 subo la temperatura a 29.9 y cuando los decimales están por encima de 5 prende y cuando llega a 5 o por debajo apaga.Gracias por tu atención

                                  ;Conversor de 10 bit a bcd


DECIMAL  SWAPF    TempEntero,0
         ANDLW    0X0F
         ADDLW    0XF0
         MOVWF    unimil
         ADDWF    unimil,1
         ADDLW    0XE2
         MOVWF    cen
         ADDLW    0X32
         MOVWF    uni
         MOVF     TempEntero,0
         ANDLW    0X0F
         ADDWF    cen,1
         ADDWF    cen,1
         ADDWF    uni,1
         ADDLW    0XE9
         MOVWF    dec
         ADDWF    dec,1
         ADDWF    dec,1
         SWAPF    TempDecimal,0
         ANDLW    0X0F
         ADDWF    dec,1
         ADDWF    uni,1
         RLF      dec,1
         RLF      uni,1
         COMF     uni,1
         RLF      uni,1
         MOVF     TempDecimal,0
         ANDLW    0X0F
         ADDWF    uni,1
         RLF      unimil,1
         MOVLW    0X07
         MOVWF    decemil
         MOVLW    0X0A
LB1      ADDWF    uni,1
         DECF     dec,1
         BTFSS    3,0
         GOTO     LB1
LB2      ADDWF    dec,1
         DECF     cen,1
         BTFSS    3,0
         GOTO     LB2
LB3      ADDWF    cen,1
         DECF     unimil,1
         BTFSS    3,0
         GOTO     LB3
LB4      ADDWF    unimil,1
         DECF     decemil,1
         BTFSS    3,0
         GOTO     LB4

         movf     uni,0         ;saco las unidades
         movwf    univ
         movf     dec,0         ;saco las decenas
         movwf    decv
         movf     cen,0         ;saco las centenas
         movwf    cenv

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:ajuste de termometro
« Respuesta #14 en: 12 de Octubre de 2016, 16:40:03 »
OK ahora entiendo.

Usando el codigo anterior que puse, ahora le agregue un par mas de cosas, y use el resultado del BCD (por que no tenia otra forma simple) para pasar solo el entero.

Código: ASM
  1. ;Supongamos temperatura en 25.6º
  2.  
  3.  
  4. ;Valores de temperatura que van a servir de comparacion
  5.  
  6. Umbralbajo      EQU     .25     ; Cuando la temperatura es MENOR a esto, Enciende (en este ejemplo temp menor o igual 24.9 )
  7. Umbralalto      EQU     .27     ; Cuando la temperatura es MAYOR o IGUAL a esto Apaga ( en este ejemplo de 27.0 para arriba se apagaria)
  8. Salida1         EQU     PORTB,0 ; Puerto de salida
  9.  
  10. PasoBCD_to_Entero:
  11.         INCF    cenv, W         ; Tomo las decenas de la temperatura, en el ejemplo seria el "2"
  12.         MOVWF   temp            ; Lo incremento en 1 y lo pongo en un registro auxiliar ( temp = 3 )
  13.         MOVLW   0xF6            ; Cargo Tempentero con -10
  14.         MOVWF   TEMPENTERO
  15.         MOVLW   0x0A            ; W queda con un valor de 10
  16.         ADDWF   TEMPENTERO, F   ; Sumo a Tempentero 10, en la primer vuelta eso lo dejaria en 0 ( estaba en -10)
  17.         DECFSZ  temp, F         ; Decremento y luego pregunto, por eso mismo necesito incrementar en 1 antes ( ya que primero se decrementa )
  18.         GOTO    $-2             ; De ser 0 cenv, queda en 1 al incrementarse, al pasar por el DECFSZ queda en 0 y saltaria, tempentero queda en 0 en ese caso
  19.         MOVF    decv, W         ; Sino suma de a 10 por cada 1 de "cenv", Luego le sumo la unidad, en este caso el 5
  20.         ADDWF   TEMPENTERO, F   ; Finalmente tengo en tempentero el valor entero, es decir el valor 25
  21.  
  22. Decision:
  23.         MOVF    TEMPENTERO, W   ; Temperatura a comparar
  24.         SUBLW   Umbralbajo
  25.         BTFSS   STATUS, C       ;
  26.         GOTO    Encender        ; C=0, W > TUNIB, es decir esta mas bajo que el umbral lo medido
  27.         MOVF    TEMPENTERO, W
  28.         SUBLW   UmbralAlto
  29.         BTFSS   STATUS, C       ; C=1 si W <= TUNIB, es decir por encima del segundo umbral
  30.         RETURN
  31. Apagar:
  32.         BCF     Salida1
  33.         RETURN
  34. Encender:
  35.         BSF     Salida1
  36.         RETURN

Con un CALL ya tendrias  ( luego de pasarlo a BCD ) tomaria la decision de si apagar o no la salida.
« Última modificación: 12 de Octubre de 2016, 16:43:52 por KILLERJC »


 

anything