¿Convertir los valores hexadecimales del complemento de dos a binarios?

0

Estoy leyendo los datos del acelerómetro del eje x de un IC a través del bus I2C usando I2C-Tools (específicamente i2cget ) en Linux. Aquí está el código que está leyendo estos valores:

$OUT_X_L_A = shell_exec( 'i2cget -y 1 0x19 0x28' ) ... eg. returns 0x20
$OUT_X_H_A = shell_exec( 'i2cget -y 1 0x19 0x29' ) ... eg. returns 0xfc

La documentación de este acelerómetro indica que estos valores (0x20 y 0xfc) son Expresado en cumplido de 2. Este acelerómetro tiene una resolución de 16 bits.

Desde otra aplicación que estoy ejecutando que está leyendo estos datos en C, creo que estos valores, cuando se convierten a un valor decimal, deben ser iguales a ~ 65,475 (esencialmente ninguna aceleración ya que el dispositivo está sobre mi escritorio). Algunos otros documentos que he encontrado sugieren que $ OUT_X_L_A es el registro menos significativo y $ OUT_X_H_A es el registro más significativo.

He investigado un poco, pero generalmente no estoy familiarizado con Complemento de Dos, LSB y MSB. ¿Cómo calculo el valor decimal completo (resolución de 16 bits) a partir de los dos valores hexadecimales devueltos por el dispositivo? ¿Cómo se supone que debo deducir de la documentación qué registro es el más significativo?

    
pregunta T. Brian Jones

4 respuestas

2

El número 1234 (decimal) tiene 1 como su dígito "más significativo" y 4 como su dígito "menos significativo". Eso es lo que la MS y el LS representan en números y se aplican a cualquier base (espero que alguien señale que cierta base no la tiene, ¡o tal vez el módulo aritmático no tenga tales conceptos!)

El hexadecimal es el mismo y también lo es el binario. Supongo que el valor completo en hexadecimal cuando los dos bytes se interpretan como 1 byte es 20FC (o quizás FC20). No puedo decirte de qué manera, pero la hoja de datos debería decir.

De todos modos, en decimal 20FC es (2 x 4096) + (0 x 256) + (F x 16) + C y para hexadecimal F = 15 y C = 12. Conecte los números decimales y obtendrá 8192 + 256 + 240 + 12 = 8700. Si esperaba un número diferente en decimal, tal vez sea la otra combinación 61440 + 3072 + 32 + 0 = 64554.

En cuanto al valor 65475 que usted cita, no puedo ver ninguno de los números que he encontrado como coincidentes: 64554 es el más cercano, pero solo usted puede decirme la razón de esto. Acabo de hacer algunos cálculos matemáticos simples en diferentes bases y es posible que haya cometido un error numérico en algún lugar, pero lo importante es que ahora puedes convertir hexadecimal a decimal. A = 10, B = 11, C = 12, D = 13, E = 14 y F = 15.

La conversión de hexadecimal a binario es más sencilla si recuerdas los primeros 16 números binarios 0000, 0001 ... 1111: equivalen al decimal de 0 a 15, así que si tienes el número hexadecimal FC20, su equivalente binario es 1111 1100 0010 0000. El dígito de la izquierda es el MSb, es decir, el bit más significativo y el dígito de la derecha es el LSb.

Espero que esto ayude un poco y aquí hay un enlace sobre el complemento de dos enlace 's_complement

Básicamente es un formato de número para tratar con números negativos en binario

    
respondido por el Andy aka
1

La documentación debe indicarte. De lo contrario, tienes que confiar en la experiencia. MSB y LSB representan el byte más significativo y el byte menos significativo. Incrementar el LSB un conteo incrementa el resultado en un conteo, mientras que incrementar el MSB eleva el resultado en 256. Luego, tenemos los registros en sí mismos. La 'H' y la 'L' en sus nombres representan 'alto' y 'bajo', correspondientes a MSB y LSB. Y, finalmente, su declaración sobre el sensor que está sentado en su escritorio sugiere que la lectura debería ser cercana a cero. Es un poco negativo, probablemente debido al efecto de la gravedad. Esto nos permite confirmar que el registro que está leyendo "FC" es el MSB. ¿Cómo? Tienes que entender el complemento de dos para saber esto.

Para obtener la lectura, coloque el MSB 8 bits por encima del LSB, lo que significa que lo desplaza a la izquierda 8 lugares, obtiene FC00 y luego agrega el LSB (20) para obtener FC20. Eh Bueno, lo dejamos en hexadecimal, pero cuando lo hagamos en decimal, sabemos que dentro de la máquina todavía se ve como el cálculo hexadecimal.

FC es 252 en decimal. 20 es 32. Luego, 252 * 256 + 32 = 64544.

No puedo explicar todo el complemento de dos, pero si restas 1 de cero, obtienes 65535. Esto es 0xFFFF. Y para obtener el valor de este número, le restas 65536. Entonces 65535-65536 = -1. Y, 64544-65536 = -992.

Principalmente, la computadora maneja todos los complementos de los dos (y el material MSB / LSB) por ti internamente, pero es bueno saberlo para que sepas si tu respuesta es creíble.

    
respondido por el gbarry
0

Creo que _H_ significa byte "alto", y _L_ significa byte "bajo". El valor total de los datos sería 0xfc20, o 64554 (o -992 si se interpreta como un número negativo)

    
respondido por el Tim
0

"De todos modos, en decimal 20FC es (2 x 4096) + (0 x 256) + (F x 16) + C y para hexadecimal F = 15 y C = 12. Conecte los números decimales y obtendrá 8192 + 256 + 240 + 12 = 8700. Si esperabas un número diferente en decimal, quizás sea la otra combinación 61440 + 3072 + 32 + 0 = 64554 "

¿Qué profesor te enseñó 256x0 = 256?

El número decimal correcto de 0x20FC = 8444

0x20FC = 2 13 +2 7 +2 6 +2 5 +2 4 +2 3 +2 2 = 8192 + 240 + 12 = 8444

    
respondido por el Bhavesh M Moradiya

Lea otras preguntas en las etiquetas