Discusiones sobre Productos NI

cancelar
Mostrando los resultados de 
Buscar en lugar de 
Quiere decir: 

extraer bits

Hola.

 

Tengo dos números de 2 bytes, que son valores de humedad y temperatura (del sensor SHT71), transmitidos por puerto serial.

 

Al valor de humedad necesito convertirlo en un valor de 14 bits de resolución, y al de temperatura en uno de 12 bits.

 

Cómo se hace ese procedimiento?

0 kudos
Mensaje 1 de 9
5.598 Vistas

Asumiendo que lo que sale de la serial es una cadena de caracteres, puedes usar un type cast para convertir dos caracteres en un integer:

 

                    TypeCast.png

 



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 kudos
Mensaje 2 de 9
5.594 Vistas

Hola,

 

        1 bytes son 8 bits.

 

        Si tienes 2 bytes, son 16bits, si la variable es de 14 bits significa que los dos primeros bit son 0, y que al pasarlo a decimal tienes un numero entre 0 y 2^14 -1 (16383), igualmente si la variable es de 12 bits significa que los 4 bits son 0, y que al pasarlo a decimal tienes un número entre 0 y 2^12 -1 (4095).

 

         Lo primero que tienes que hacer es identificar cuales son esos bytes en la trama serial, y con un join de los dos bytes o un type cast, obtener ese numero (creo que ya esto lo tienes hecho de otro post). A partir de ese número según la característica de tu sensores debes aplicar una conversión de ese número al valor real de la variable en unidades de ingenieria, que puede ser a través de una calibración lineal o de alguna otra fórmula, según recuerdo en el datasheet de tu sensor hay unas fórmulas explicitas de como obtener ese valor, para lo cual tienes que hacer unas multiplicaciones y sumas de dicho valor con otros que estan en una tabla en el mismo datasheet, corrigeme si me equivoco y avisame si necesitas ayuda en eso.


Saludos,

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
0 kudos
Mensaje 3 de 9
5.590 Vistas

Esto dice el datasheet:

 

Two bytes of measurement data and one byte of CRC checksum (optional) will then be transmitted. The microcontroller must acknowledge each byte by pulling the DATA line low. All values are MSB first, right justified (e.g. the 5th SCK is MSB for a 12bit value, for a 8bit result the first byte is not used).

0 kudos
Mensaje 4 de 9
5.573 Vistas
Two bytes of measurement data and one byte of CRC checksum (optional) will then be transmitted. The microcontroller must acknowledge each byte by pulling the DATA line low. All values are MSB first, right justified (e.g. the 5th SCK is MSB for a 12bit value, for a 8bit result the first byte is not used).

Yo lo traduzco algo así:

Dos bytes de data medida y un byte de suma de chequeo CRC, codigo de redundancia ciclica, (opcional) seran transmitidos. El microcontrolador debe confirmar cada byte tirando la line de Datos a bajo. Todos los valores son MSB (bit mas significativo) primero, justificados a la derecha. (ejemplo: el quinto bit es el MSB para un valor con resolucion 12 bits, para un resultado de 8 bits el primer byte no es usado).

 

Tu paquete debería ser algo:

1er Byte         2do Byte        CheckSum(Optional

BBBBBBBB   BBBBBBBB   BBBBBBBB

 

En el caso de 12 bytes sin checksum:

XXXXBBBB   BBBBBBBB

 

En el caso de 8 bytes sin checksum:

XXXXXXXX BBBBBBBB

 

Donde las X's son dont care (cualquier valor), osea no influyen en tu lectura. Es posible que las X sean siempre 0, pero como no lo dice no seria bueno asumirlo, en dicho caso para 12 bits, puedes hacer un AND del primer byte con 00001111 (HExadecimal = 0x0F, Decimal = 15) para eliminar esos 4 primeros bits en caso de que tengan un valor distinto de 0. En el caso de 14 bytes, te interesa eliminar los dos primeros bits, y hacerle un AND con 00111111 (Hexadecimal = 0x3F, Decimal = 64).

 

Si te llega XXXX0101 10001011, eso es el numero binario 010110001011, y cuando lo pases a decimal será 1419.

 

No se exactamente cual era tu duda.

 

Saludos,

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
0 kudos
Mensaje 5 de 9
5.564 Vistas

Hola Luis.

 

La explicación anterior es muy útil.

La forma como el sensor transmite los bytes se muestra en las figuras 11 y 12.

 

Según la tabla 5: Status Register, se debe seleccionar los bits de resolución de acuerdo al valor del lsb.

 

La pregunta es:

Teniendo los 2 bytes de cada variable:

 

1er Byte         2do Byte       

BBBBBBBB   BBBBBBBB

 

Cómo hago para evaluar el valor del lsb para decidir cuántos bits de resolución se deben tener en cuenta para luego convertir a humedad y temperatura?

 

Adjunto el enlace del datasheet

http://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/Humidity/Sensirion_Humi...

0 kudos
Mensaje 6 de 9
5.555 Vistas

Hola,

 

      La respuesta a "Cómo hago para evaluar el valor del lsb para decidir cuántos bits de resolución se deben tener en cuenta para luego convertir a humedad y temperatura?" es 42.

 

      Es decir, no entiendo tu pregunta, fórmulala mejor y con gusto tratare de ayudarte en lo que pueda.

 

      En "Table 5: Status Register Bits" el bit 0, segun el valor que le coloques es el que te dice con cuantos bits de resolución estas trabajando.

      ’1’ = 8bit RH / 12bit Temp.resolution
      ’0’ = 12bit RH / 14bit Temp. resolution

 

Saludos,

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
0 kudos
Mensaje 7 de 9
5.542 Vistas

Hola Luis.

 

Si el sensor genera los siguientes Bytes: 10100101 1000101x, dónde x es el bit mesnos significativo lsb, ¿cómo se evalúa el valor de ese lsb para decidir cuál resolución escoger de acuerdo a la tabla 5?

 

Saludos.

 

 

0 kudos
Mensaje 8 de 9
5.538 Vistas

Hola,

 

     Si tienes dos bytes, significa que estas leyendo el valor de humedad, no el de configuracion (a menos que el segundo sea de checksum en cuyo caso deberias ver el lsb en el primer byte).

 

     Si quieres saber que resolución o configurarla, tienes que leer o escribir el status register.

 

After the command Status Register Read or Status Register Write – see Table 4 – the content of 8 bits of the status register may be read out or written

     Por default (a menos que tu lo hayas cambiado), el status register dice que usa 12bit RH 14bit Temp.

 

     Suponiendo que si estas leyendo el status register, aquí te dejo dos formas como puedes verificar si tiene un valor de 1 o 0.

 

lsb.png

 

      Espero esto te ayude un poco mas. Fijate que el index para leer los bits (si usas number to boolean array) estan de derecha a izquierda, naturalmente yo pensaba que era al contrario, pero hice la prueba y pude ver que es como lo coloque en la imagen.

 

Saludos,

Luis A. Mata C.
Ing. Electrónico
Whatsapp: +58-414-1985579
BBM Pin: 2B83E99A
Thanks: Kudos
0 kudos
Mensaje 9 de 9
5.534 Vistas