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.
(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.
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.
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.
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.
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:
MOVF Decenas, W
ADDLW '0'
CALL ENVIAR_LCD
MOVF Unidades, W
ADDLW '0'
CALL ENVIAR_LCD
MOVLW '.'
CALL ENVIAR_LCD
MOVF Decimales, W
ADDLW '0'
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.