Disculpa, pero es totalmente insensato lo que estas diciendo.
si comparo datoH contra refeH es mayor refeH ,entonces comparo datoL contra refeL y entonces datoL es mayor que refeL
Te lo dije.... Una vez definido las partes altas, no es necesario comparar las partes bajas... Porque ya te lo definió la parte alta si es mayor o menor, no importa el resultado de la parte baja. Voy a hacer un ejemplo medio absurdo:
0x149 vs 0x200 - Obviamente 0x200 es mas grande. Si comparo 0x1 y 0x2 ya eso me lo dice. Si comparas 0x49 con 0x00, El resultado no tiene sentido, ya sabemos que 0x200 es mas grande. No hay necesidad de verificar el byte bajo, porque sea cual sea el resultado, sabes que es mas grande debido al byte alto.
El UNICO momento que te sirve el byte bajo, es cuando los byte altos son iguales, por ejemplo 0x149 y 0x120, Ahora SI necesito verificar los byte bajos, pero observa que para que esto ocurra necesito que los bytes altos sea IGUALES.
si solo miro datoH y refeH pierdo mucha presicion en la medición
¿Qué precisión estas hablando? Si tu "medición" es datoH/datoL, y vas a seguir teniendo los 16 bits. La parte de la "medición" ya paso, te la da tu sensor. Ahora estamos hablando de comparar dos números nada mas. No importa si es mas grande por 1, o por 1000. Solo estamos determinando si es mayor, menor o igual.
todo los niveles son contiguos y por eso tengo que tener en cuenta el byte bajo.
Y haciendo como te lo dije lo tenes en cuenta al byte bajo, SOLO CUANDO IMPORTA!
-----------------------
El único error que podes tener es que este muy al borde del nivel... Por ejemplo si tus niveles son (voy a hacerlo en decimal) 200 (nivel 1), 400 y 600
Y recibís 201, que puedas tener dudas en pasarlo al nivel 2, lo que podes hacer o implementar es una franja de seguridad o histeresis.. Si estabas en el nivel 1 y no pasa de los 220 por ejemplo, queda en nivel 1, si pasa ese valor si ahora el nivel 2. Supongamos ahora que baja, pero hasta que no pase por debajo de los 180 no pasa al nivel 1, y se mantiene en el nivel 2.
De esa forma pequeñas variaciones en la salida de tu sensor no provocan muchas variaciones de nivel en tu programa.
Es decir... De tu (referencia superior + valor de seguridad) , para subir de nivel, y de tu (referencia inferior - valor de seguridad), para bajar de nivel.
Estaba pensando si en lugar de comparar hago una resta?
¿Y que vas a lograr con eso? Lo mismo que estamos haciendo, la comparación en los micros es una resta. Y dependiendo del resultado se activan las banderas Z y C.
La única ventaja que podes determinar CUANTO difiere de tu valor de referencia. Si a vos te hace falta eso, entonces podes hacerlo con una resta, o como te lo plantee antes con el valor de seguridad o histéresis.
Por que luego de que sepas CUANTO difiere, seguramente lo vas a querer comparar con algo.
-------------------------------
Lo que estoy suponiendo es que "TU ERROR" en realidad esta en el código.