TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: joseydoris en 07 de Octubre de 2016, 00:54:05

Título: ajuste de termometro
Publicado por: joseydoris 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
       
 
Título: Re:ajuste de termometro
Publicado por: KILLERJC 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.
Título: Re:ajuste de termometro
Publicado por: joseydoris 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
Título: Re:ajuste de termometro
Publicado por: nico 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.
Título: Re:ajuste de termometro
Publicado por: KILLERJC 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.
Título: Re:ajuste de termometro
Publicado por: joseydoris 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.
Título: Re:ajuste de termometro
Publicado por: KILLERJC 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
Título: Re:ajuste de termometro
Publicado por: joseydoris 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
Título: Re:ajuste de termometro
Publicado por: KILLERJC 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.
Título: Re:ajuste de termometro
Publicado por: joseydoris 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

                               
Título: Re:ajuste de termometro
Publicado por: KILLERJC 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.
Título: Re:ajuste de termometro
Publicado por: joseydoris 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


Título: Re:ajuste de termometro
Publicado por: KILLERJC 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.
Título: Re:ajuste de termometro
Publicado por: joseydoris 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
Título: Re:ajuste de termometro
Publicado por: KILLERJC 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.
Título: Re:ajuste de termometro
Publicado por: joseydoris en 12 de Octubre de 2016, 16:51:41
Gracias killerjc,pruebo y te digo
Título: Re:ajuste de termometro
Publicado por: joseydoris 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
Título: Re:ajuste de termometro
Publicado por: KILLERJC 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.
Título: Re:ajuste de termometro
Publicado por: joseydoris 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

     


Título: Re:ajuste de termometro
Publicado por: KILLERJC 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
Título: Re:ajuste de termometro
Publicado por: joseydoris 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