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

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

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
Re:ajuste de termometro
« Respuesta #15 en: 12 de Octubre de 2016, 16:51:41 »
Gracias killerjc,pruebo y te digo

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
Re:ajuste de termometro
« Respuesta #16 en: 12 de Octubre de 2016, 20:24:27 »
Saludos killerjc:Seguro que me equivoco pero creo que umbral alto correspondería a univ,decv y cenv que son los registros de lectura del sensor(creo que no se pueden sumar o restar por que cuando vuelve a leer el sensor deja los que el marca) y umbral bajo a tunib ,tdecb y tcenb corresponderia  a la calibracion o viceversa (ya no se)No puedo poner unos valores fijos necesito controlar sobre todo las unidades(decimales)es para una incubadora que tiene que estar a 37.5 que a veces se pasa a 38 y tiene que seguir apagada.No se porque sumas en TempEntero ya que solo utilizo los registros antes mencionados.Att jose

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:ajuste de termometro
« Respuesta #17 en: 12 de Octubre de 2016, 23:37:26 »
Yo no entiendo por que tenes tantos registros para lo mismo.

Deberias tener registros "para todo uso" para tener lo que llega del sensor.
Luego de lo que llega del sensor se pasa a BCD y serian los 3 registros que necesitas: Decenas, Unidades, Decimales

Al momento de enviar el valor al LCD se suma "temporalmente" es decir en W el valor de '0' para pasarlo a ASCII, esto evita tener ademas OTROS registros innecesarios.

Es decir necesitas 3 como maximo para mantener el valor de la lectura del sensor, + unos cuantos auxiliares que podes usar en cualquier parte del programa ( como use yo temp, donde no importa si luego se borra el valor o no )

Yo propuse 1 registro mas para hacer mas facil la comparacion y que tuviera el valor: (Decenas*10 + Unidades), sin tener en cuenta el Decimal.

Para que se entienda hago una especie de grafico del proceso:


Sensor -----> Resultado en registros temporales ---------> Se guarda en 3 registros formato BCD -----------> Sumas '0' y tenes para mostrar en el LCD
                           (Recepcion de datos)                                              (Temp Actual)                  |________> Lo pase a 1 numero y lo comparo con una constante o un registro (Umbrales).


Agregar mas pasos, o mas registros creo que esta por demas al comienzo, luego podes agregar un offset para calibrar. Pero aun asi,la temperatura FINAL siempre lo tendrias en 3 registros y no necesitarias mas.

Citar
(creo que no se pueden sumar o restar por que cuando vuelve a leer el sensor deja los que el marca)
El sensor siempre te va a dar la temperatura Actual (que yo supongo que es univ, decv y cenv), y vos tenes que compararlo con una temperatura de referencia, en este caso es un control ON-OFF, y necesitas una histeresis, por eso mismo tenes 2 limites o umbrales.

Citar
y umbral bajo a tunib ,tdecb y tcenb corresponderia  a la calibracion o viceversa (ya no se)

Entonces tenes guardado en registros una especie de "calibracion" en la cual podes poner un offset a la temperatura leida por el sensor. Me refiero a esto: Supongamos que el sensor sin nada mide 25.6º Y el usuario se da cuenta que esta esa temperatura mal por 1 grado, entonces carga ese offset como -1.0 , entonces la temperatura ahora mostrada es de 24.6º
Si es asi, uno deberia usar el final, es decir el que da 24.6º, De todas formas como digo no necesitas mas de 3 registros para mantener la temperatura.

Citar
No puedo poner unos valores fijos necesito controlar sobre todo las unidades(decimales)
Es decir que vos queres que se pueda configurar con botones a traves de un LCD las temperaturas de encendido y apagado de la salida?, Simple cambia

        SUBLW   Umbralbajo

por

        SUBWF   Umbralbajo, W

Y obviamente Umbralbajo va a ser un registro el cual vas a poder cambiarlo y setearlo, si le pones el numero 25 dentro significaria 25º, lo cual simplifica mucho el codigo (ya que podes usar INCF y DECF sin comprobar si se pasaron de 10 como lo seria en BCD).
Si te interesan los decimales, entonces se agrega tambien un "extra" para comprobar los decimales tambien. En este caso creo que lo mejor es tener 2 registros para cada Umbral, uno de enteros y otro de decimales.

Citar
es para una incubadora que tiene que estar a 37.5 que a veces se pasa a 38 y tiene que seguir apagada
El tema esta en que tan estricto necesitas que sea la temperatura, con un control simple como es el ON-OFF por ahi es complejo hacer que se mantenga en una temperatura fija. Y tal ves lo que buscas es un PID lo cual es mucho mas complejo que esto. Ejemplo con un control ON-OFF si lo que manejas es un calentador, cuando corte la alimentacion del mismo todavia va a seguir subiendo la temperatura, tal ves se pase unas decimas o grados, eso no lo tiene en cuenta.

Citar
No se porque sumas en TempEntero ya que solo utilizo los registros antes mencionados

Te pongo 2 situaciones y vos me decis cual es mas facil de hacer el codigo.

Situacion 1:
Tengo 2 registros Decenas y Unidades, tengo que comparar con otros 2 registros y ver si es mayor o menor, Primero tengo que ver las Decenas
Decenas > Registro de comparacion: Mayor
Decenas < Registro de comparacion: Menor
Decenas = Registro de comparacion: Tengo que revisar Unidades.
Lo que sigue es si son iguales lo anterior
Unidades > Registro de comparacion: Mayor
Unidades < Registro de comparacion: Menor
Unidades = Registro de comparacion: Igual

Todas esas comparaciones tengo que hacer en codigo y es solo para 1 limite o umbral, recorda que cuando tenes histeresis son 2. Ahora veamos la otra

Situacion 2.
Tengo UN registro (TempEntero) que es igual a (Decenas*10 + Unidades, 2 registros en 1). Ahora solo necesito comparar 1 solo registro:
TempEntero > Registro de comparacion: Mayor
TempEntero < Registro de comparacion: Menor
TempEntero = Registro de comparacion: Igual

Fin. Con la mitad de comprobaciones y mitad de registros logre mi cometido por igual, obviamente esto es para 1 limite, deberia ser el doble para los 2 umbrales.


Espero que esto explique que quise hacer con mi codigo. En forma resumida:

Lo que lee el sensor y se muestra en el LCD, lo comparo y actuo en consecuencia, nada mas, creo que tu problema se plantea por que tenes:

univ, decv, cenv
uni, dec, cen
tuni, tdec, tcen
tunib, tdecb, tcenb

Como decia, solo necesitas 3 nomas. Los otros estan por demas. uni, dec y cen podrias ser registros para todo uso, los valores finales de la temperatura que son en BCD por lo que veo estan en univ, decv, cenv. Esos si son los unicos que necesitas para mantener la temperatura.

Leo---> temporalmente en 3 registros ---> Paso a BCD --> Resto o sumo offset en caso que exista a ese BCD --> Comparo ( no se modifican los registros de temperatura) --> Actuo --
|__________________________________________________________________________________________________________________________________________________|
                                                                          ( Vuelvo a comenzar el ciclo )

Mostrar en el LCD podes hacer en cualquier punto Despues de Restar o sumar el offset. Simplemente: Harias:

Código: ASM
  1. MOVF     Decenas, W
  2. ADDLW   '0'
  3. CALL      ENVIAR_LCD
  4. MOVF     Unidades, W
  5. ADDLW   '0'
  6. CALL      ENVIAR_LCD
  7. MOVLW   '.'
  8. CALL      ENVIAR_LCD
  9. MOVF     Decimales, W
  10. ADDLW   '0'
  11. CALL      ENVIAR_LCD

Ves y asi no necesitas otros 3 registros extras para tener el valor en ASCII, simplemente lo calculas antes de enviar. Y no se modifican los registros Decenas, Unidades y Decimales.
« Última modificación: 12 de Octubre de 2016, 23:54:59 por KILLERJC »

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
Re:ajuste de termometro
« Respuesta #18 en: 13 de Octubre de 2016, 11:59:20 »
Saludos killerjc:Quizas si tenga registros de mas.Los saco antes de que unos me sumen 30 y otros antes de que sumen 48 que es como los comparo,para no liarme,se podría simplificar.No tengo tu nivel de conocimiento ni por casualidad por eso se me hace muy difícil entenderte.Te envio  codigo,funciona bien cuando la temperatura es inferior a la calibracion.Creo  que al restar un registro se pone a 255 y como va rapido ira bajando.¿No hay algun modo de hacer que cuando esto ocurra poner los dos al mismo valor para que de 0 y hacer la comparacion?.He probado con iorlw,andlw,xorlw y no doy con el chiste.Tiene que ser tan sencillo como mayor apaga menor prende como basic pero en assembler,disculpa la comparacion.Empece hace mucho tiempo con assembler(no habia mas)y entre prueba y error(siempre empíricamente) pude hacer funcionar las cosas,pero esto me esta sacando de quicio.Att jose


 
call   DECIMAL

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

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

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

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

     



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:ajuste de termometro
« Respuesta #19 en: 13 de Octubre de 2016, 15:07:12 »
Bueno, yo realmente ya estoy perdido, me seguis nombrando una "calibracion"(que una calibracion no va a hacer que una salida corte o no, tal ves la palabra es otra)  y que no podes sumar registros y eso me deja aun MAS perdido.

Tengo varias cosas para decir

Cuando comparas sea mayor o menor y tenes 2 numeros ( de los cuales cada uno ocupa 3 registros) Siempre comenzas por el valor mas grande!.

Suponete estos 2 valores:

Valor Actual : 25.2
Valor a comparar: 25.3

Primero deberias comparar las decenas (en este ejemplo el 2 con el 2), luego las unidades ( aca el 5 con el 5) y finalmente los decimales (el 2 con el 3). Cosa que en tu codigo estas haciendo al reves.

¿Que es para vos una calibracion o ajuste?

Para mi es cuando el sensor mide algo y en realidad deberia medir otra cosa, entonces se crea un valor que sumado a lo que mide el sensor, de el valor correcto.
Eso para mi es una calibracion o ajuste.
Como ves eso no influye o deberia influir en NADA a una salida.

Por el codigo que presentaste ( que es una comparacion ) Y gracias a esa comparacion activar o desactivar una salida. Pense que lo que queres hacer es un control de temperatura, es decir que se mantenga constante la temperatura en un valor prefijado. Y que tu problema era que si lo tenias pensado para 30.2º a los 30.2º se desactivaba y a los 30.1º se volvia activar, volviendose loca la salida. Por eso mismo te dije que usaras una histeresis o margen de activado/desactivado ( control ON/OFF ).

Por eso mismo no queda lo de mayor apaga , menor prende. Pero si aun asi lo queres de esa forma. Voy a suponer que:

tuni, tdec, tcen tienen los valores de a comparar.
univ, decv, cenv tienen el valor desde el sensor.

Lo llamas con un CALL

Código: ASM
  1. CICLO:
  2. Comparo_Decenas:
  3.         movf    tcen, W         ; ajuste decenas
  4.         subwf   cenv, W         ; decenas del sensor
  5.         btfsc   STATUS, Z       ; tcen = cenv? Si-> Comparo unidades
  6.         GOTO    Comparo_Unidades
  7.         BTFSS   STATUS, C
  8.         GOTO    Apagar          ; C=0 si tcen > cenv
  9.         GOTO    Encender        ; C=1 si tcen < cenv
  10. Comparo_Unidades:
  11.         movf    tdec, W         ; ajuste Unidades
  12.         subwf   decv, W         ; unidades del sensor
  13.         btfsc   STATUS, Z       ; tdec = decv? Si-> Comparo decimales
  14.         GOTO    Comparo_Decimales
  15.         BTFSS   STATUS, C
  16.         GOTO    Apagar          ; C=0 si tdec > decv
  17.         GOTO    Encender        ; C=1 si tdec < decv
  18. Comparo_Decimales:
  19.         movf    tuni, W         ; ajuste decimales
  20.         subwf   univ, W         ; decimales del sensor
  21.         btfsc   STATUS, Z       ; tuni = univ? Si-> Apago
  22.         GOTO    Apagar
  23.         BTFSS   STATUS, C
  24.         GOTO    Apagar          ; C=0 si tdec > decv
  25. Encender:
  26.         BSF     PORTA, 1
  27.         RETURN
  28. Apagar:
  29.         BCF     PORTA, 1
  30.         RETURN

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
Re:ajuste de termometro
« Respuesta #20 en: 13 de Octubre de 2016, 17:37:03 »
Saludos killerjc:Como tenemos varias palabras para decir las mismas cosas,nos enredamos.Se suele decir ajustar,calibrar,programar cuando queremos (en este caso)prefijar una temperatura para que active o desactive lo que queramos.Un trillon de gracias por el codigo,ahoraSI.Att jose


 

anything