Autor Tema: Comparar 16 bits  (Leído 268 veces)

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

Desconectado hobby67

  • PIC10
  • *
  • Mensajes: 5
Comparar 16 bits
« en: 21 de Abril de 2021, 21:22:56 »
Hola! a Todos! ,tengo un problema que hace rato que le doy vuelta y no le encuentro salida ,se me presenta esta situación ,tengo 2 registros que forman uno solo de 16bts datoH y datoL ,estos los tengo que comparar con otros dos que son referencia refeH refeL y saber si son igual/mayor /menor y a partir de saber esa condición seguir con el programa ,hasta ahora siempre compare registros de 8 bits que para saber si son iguales/mayor/menor veo el registro status z y c ,según sus estados sabia que resultado daba la comparación pero con dos registros nunca hice esta operación y no se me ocurre nada! ,use el buscador y en assembler no tuve suerte ,cualquier sugerencia se agradece! .Saludos!!! a Todos!!!           

Desconectado Robert76

  • PIC18
  • ****
  • Mensajes: 380
Re:Comparar 16 bits
« Respuesta #1 en: 21 de Abril de 2021, 21:55:25 »
Hola, pues lo que se me ocurre es comparar en 1ra. instancia, los registros de mayor peso. El que sea mayor, ya estaría dándote la condición que deseas.
Ahora sí esos registros son iguales, deberás comparar los registros de menor peso.
A partir de aquí ya tienes definida la condición que necesitabas.

Desconectado hobby67

  • PIC10
  • *
  • Mensajes: 5
Re:Comparar 16 bits
« Respuesta #2 en: 21 de Abril de 2021, 22:51:46 »
Hola! ,ensaye esa posibilidad ,comparar el dato alto primero y luego el bajo y resulto hasta que me di cuenta que con la parte baja no puedo compara si es igual/mayor/menor porque según el valor que tome se presenta un problema ,ejemplo: tengo datoH y datoL que forman el valor 2BC hex y el valor  refeH y refeL tiene un valor 460 hex veo que si los comparo tengo 2BC hex en binario es  datoH b'00000010' y datoL b'10111100' y el 460 hex en refeH b'00000100' refeL b'01100000' ,pasa bien en la parte alta pero en la baja no ,en decimal el valor de referencia es 1120 y el dato a comparar es de 700 y salta el error ,pensé pasar todo a bcd pero tampoco veo que funcione de esa manera... muchas gracias por tu ayuda . Saludos!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8092
Re:Comparar 16 bits
« Respuesta #3 en: 21 de Abril de 2021, 23:00:29 »
Es que no tenes que hacer mas comparacion.... Es simple:

Las partes altas son iguales?
SI -> Procedo a comparar las partes bajas como lo hacias con 8 bits, y este te va a definir si es mayor, menor o igual
NO ->  Si es mas grande uno de ellos, entonces NO continuas con la parte baja.

Voy por el ejemplo que diste y algunos mas...

Caso 1:
Comparar dato: 0x2BC y ref: 0x460
Comparo la parte alta, 0x2 y 0x4. Es mas grande ref, por lo tanto salgo y declaro mayor a Ref. (No hace falta comparar la parte baja)

Caso 2:
Comparar dato: 0x7BC y ref: 0x460
Comparo la parte alta, 0x7 y 0x4. Es mas grande dato, se termino. (No hace falta comparar la parte baja)

Caso 3:
Comparar dato: 0x4BC y ref: 0x460
Comparo la parte alta, 0x4 y 0x4. Son iguales, este es el único momento que voy a ver la parte baja.
Comparo la parte baja 0xBC y 0x60, es mas grande dato. Fin

Caso 4:
Comparar dato: 0x420 y ref: 0x460
Comparo la parte alta, 0x4 y 0x4. Son iguales, este es el único momento que voy a ver la parte baja.
Comparo la parte baja 0x20 y 0x60, es mas grande ref. Fin

Caso 5:
Comparar dato: 0x460 y ref: 0x460
Comparo la parte alta, 0x4 y 0x4. Son iguales, este es el único momento que voy a ver la parte baja.
Comparo la parte baja 0x60 y 0x60, son iguales. Fin

Solo vas a comparar la partes bajas cuando sean iguales las altas.

PD: Es lo mismo que haces con el decimal, si te pido que me digas cual es el mas grande entre 320 y 700, solo observas el de mayor peso, que son las centenas y comparas , 7 es mas grande que 3, y no te importa que el primer numero tenga 2 decenas, ya te lo define el de mayor peso.
« Última modificación: 21 de Abril de 2021, 23:05:37 por KILLERJC »

Desconectado hobby67

  • PIC10
  • *
  • Mensajes: 5
Re:Comparar 16 bits
« Respuesta #4 en: 22 de Abril de 2021, 00:12:10 »
Hola! ,el caso 1 es el que veo problemático ,como en el avance del programa los valores de refeH y refeL cambian estaría incluyendo un error voluntario de inicio que lo cargo al primer cambio de refeH y refeL ,tiene que haber una forma de saber bien si se cumplen las condiciones de comparación... voy a ensayar las consignas que enumeras a ver que sale ,gracias!!! por el planteo del problema .Saludos!!!

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 193
Re:Comparar 16 bits
« Respuesta #5 en: 22 de Abril de 2021, 05:21:58 »
hola,  el allgoritmo de esas comparaciones,  es como te indicaron...

Éste sitio,  supongo que está entre tus enlaces,  porque hay de todo,
http://www.piclist.com/techref/microchip/compcon.htm#16_bit

y lo que describis al último suena como a que es en tiempo real,  entonces deberías emplear algun módulo de los pic,  según tus necesidades,  ésto es cosas como CTC,  los comparadores analógicos y yerbas así,  disparadas con una interrupción..

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8092
Re:Comparar 16 bits
« Respuesta #6 en: 22 de Abril de 2021, 06:50:25 »
Hola! ,el caso 1 es el que veo problemático ,como en el avance del programa los valores de refeH y refeL cambian estaría incluyendo un error voluntario de inicio que lo cargo al primer cambio de refeH y refeL ,tiene que haber una forma de saber bien si se cumplen las condiciones de comparación... voy a ensayar las consignas que enumeras a ver que sale ,gracias!!! por el planteo del problema .Saludos!!!

No entiendo porque cambiarias los valores a comparar mientras estas ejecutando la comparación. Si son 2 registros que se cambian en alguna interrupción, entonces procede a desactivar las interrupciones por unas 4 instrucciones que seria lo que te llevaría a copiarlo a otro set de registros que no cambiaria, y luego activarlas de nuevo.

Si podes explicarte mejor porque cambiarían en medio de la parte de la comparación seria mas fácil de entender. Proviene de algún modulo ?

Desconectado hobby67

  • PIC10
  • *
  • Mensajes: 5
Re:Comparar 16 bits
« Respuesta #7 en: 22 de Abril de 2021, 10:19:12 »
Hola! ,estoy tomando valores de un sensor de luz que me entrega su estado en dos registros ,el fabricante me indica ''franjas'' de niveles de potencia que ya están establecidos y lo que hago en mis primeras pruebas en dialogar con el sensor obtener el estado y los cargo en datoH y datoL  y los compararos con estas ''franjas'' establecidas y veo si el valor obtenido del sensor supera el primer nivel_1 refeH y refeL ? si es igual o menor estoy dentro de este nivel ,si supera la referencia salto a la segunda comparación con otros valores de referencia ,actualizo refeH y refeL que representan a nivel_2 y pregunto si son igual o menor? y esto sigue.... con varios niveles .
Entonces lo que me sucede es que si salto del nivel_1 cumpliendo en parte con la comparación ,me digo no estoy cumpliendo en verdad con la comparación bit a bit total ,por ahi es una mala interpretación mia y en verdad comparo los 16bits ,como es la primera vez que me toca comparar dos registros me deja pensando ,gracias!!! por sus comentarios y el link me dieron otros puntos de vista del problema ,de movida voy a cambiar el orden de niveles de comparación ,voy comenzar con el mas alto para descartar un estado perjudicial de inicio .Saludos!!!     

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8092
Re:Comparar 16 bits
« Respuesta #8 en: 22 de Abril de 2021, 17:20:12 »
Voy a hacer un ejemplo con 3 niveles. Los niveles son 0x200, 0x500 y 0x700. Tu dato supongamos esta en 0x502

Entonces
Comparas 0x502 con 0x200, NO es menor por lo tanto tenes que seguir
Comparas 0x502 con 0x500, NO es menor por lo tanto tenes que seguir
Comparas 0x502 con 0x700, Es menor, por lo tanto esta en el nivel 3..


Estamos hablando de una comparacion entre rangos de numeros. Y luego leo esto:

Citar
me digo no estoy cumpliendo en verdad con la comparación bit a bit total

¿Que es para vos una comparacion bit a bit total? ¿Que diferencia tiene con la comparacion que estamos haciendo?
O es que para vos el omitir la parte baja si ya lo define la alta no es una comparacion bit a bit total ?

Estamos comparando numeros, si tuviera los numeros 0x5FF y 0x724
Es suficiente y necesario ver que 0x700 es mas grande que 0x500, eso estas probando vos con la primera comparación de la parte alta.
Nunca el byte bajo va a influir (siempre y cuando sean distintas las partes altas), es mas lo podes pensar con los numeros 0x5FF y 0x600, Sabes que el numero 6 es mas grande que 5, sea lo que sea que valga el byte bajo como en este caso 0xFF.  (0x5FF = 1535  y 0x600 = 1536)
« Última modificación: 22 de Abril de 2021, 17:22:13 por KILLERJC »

Desconectado hobby67

  • PIC10
  • *
  • Mensajes: 5
Re:Comparar 16 bits
« Respuesta #9 en: 22 de Abril de 2021, 19:45:15 »
Hola! ,es como comentas ,hasta ahora lo que hacia es compara rangos, los datos del sensor datoH y datoL contra la referencia y todo iba bien hasta que comencé a probar y vi que los saltos entre niveles se solapaban por llamarlo de alguna manera y entonces vi que los registros  bajos no funciona como parte del control de niveles en ciertos valores y es normal que pase.
Como en el ejemplo que puse ,el sensor me entrega 0x2BC (.700) y la referencia de nivel esta en 0x460 (.1120) si comparo datoH contra refeH es mayor refeH ,entonces comparo datoL contra refeL y entonces datoL es mayor que refeL y salta al segundo nivel y como el segundo nivel comienza 0x461 (.1121) se produce el error porque estaria en el segundo nivel sin que este cargado el valor para esto ,si solo miro datoH y refeH pierdo mucha presicion en la medición ,todo los niveles son contiguos y por eso tengo que tener en cuenta el byte bajo.

datoH datoL 0x2BC datoH  b'00000010' datoL b'10111100' datoL 0xBC
refeH refeL  0x460   refeH  b'00000100' refeL b'01100000' datoL 0x60

Estaba pensando si en lugar de comparar hago una resta? es una idea pero no se bien ,de alguna manera tengo que poder saltar de nivel sin que haya error  ,muchas! gracias!. Saludos!   

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8092
Re:Comparar 16 bits
« Respuesta #10 en: 22 de Abril de 2021, 20:21:51 »
Disculpa, pero es totalmente insensato lo que estas diciendo.

Citar
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.

Citar
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.

Citar
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.

Citar
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.


 

anything