Autor Tema: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?  (Leído 6185 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Hola de nuevo.
Abro este hilo nuevo siguiendo con el tema anterior que se puede ver en este hilo:
http://www.todopic.com.ar/foros/index.php?topic=33895.0

Creo que es mejor abrir otro nuevo porque trato otro tema diferente, aunque sea una pregunta basada en el tema anterior, si la comunidad no considera que se deba abrir un tema nuevo, borren este hilo y ya hago la pregunta en el anterior hilo.

La duda que tengo ahora es, una vez tengo el dato de 16 bits metido en una variable, como puedo desechar los bits que no me interesan y como utilizar los que me interesa, no pido que me lo resuelvan pero si pido que me orienten para empezar a investigar sobre el tema y si no doy con la solución ya preguntare las dudas

Resulta que esa palabra no me vale toda, el dispositivo envía el dato desde MSB hasta LSB.

Por ejemplo, el bit 15 es un bit tonto no me vale porque no tiene información igual que el bit 0 , el bit 1 y 2 tiene un tipo distinto de información cada uno, juntos no me valen pero por separado si, y los bits del 14 al 3 corresponden a un dato float.

Gracias de ante mano
« Última modificación: 22 de Febrero de 2011, 15:54:40 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #1 en: 22 de Febrero de 2011, 15:55:57 »
Lo puedes hacer con máscaras de bit, usando los operadores AND (&) y OR (|) que trabajan con los datos a nivel lógico.

La wikipedia no dice mucho, pero seguro que si buscas por ahí encontrarás más info: http://es.wikipedia.org/wiki/M%C3%A1scara_(inform%C3%A1tica)

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #2 en: 22 de Febrero de 2011, 16:13:53 »
¿pero eso funcionará?, es que los datos no son fijos si no que cambian, date cuenta que un and es.

   AND
 
 00 | 0   
 01 | 0
 10 | 0
 11 | 1

con lo cual si son 1 si me los pillara pero si son 0 los desechara

  OR

 00 | 0
 01 | 1
 10 | 1
 11 | 1

estas técnicas las he utilizado para hacer que en un mismo puerto tenga patillas de entrada y patillas de salida.
pero si dices que funciona....estudiaré el tema.
gracias
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #3 en: 22 de Febrero de 2011, 16:37:59 »
Ponme un ejemplo de lo que necesitas, verás cómo lo entiendes rápidamente.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #4 en: 22 de Febrero de 2011, 17:06:54 »
Puedes aplicar la mascara utilizando el operador & para solo dejar los bits que te interesan y luego rotarlos para guardarlos en una variable.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #5 en: 22 de Febrero de 2011, 18:53:42 »
Una de las cosas que necesito es, separar la palabra desde el bit 15 al 3, ahí hay un valor en float, hay más bits que sirven para hacer otras cosas pero si entiendo uno los demás son iguales.

-¿Lo de rotarlos lo hago con un shift rigth?.
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #6 en: 22 de Febrero de 2011, 19:02:29 »
Lo podrías hacer así:

resultado = (palabra & 0b1111111111111000) >> 3;

aunque, puesto que la rotación rellena con ceros, obtendrías el mismo resultado haciendo así:

resultado = palabra >> 3;

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #7 en: 22 de Febrero de 2011, 19:07:07 »
Vaya, no tengo palabras para agradecer toda la ayuda.

ya que estoy me aprobecho  :)

¿el >>3 que hace?, creo que dices rodar a la derecha 3 posiciones, ¿cuales son?, ¿sería para eliminar los 3 ceros del final y dejarlo así?

0b001111111111111
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #8 en: 22 de Febrero de 2011, 19:10:51 »
Exacto, "empuja" los bits hacia la derecha. Los bits menos significativos que salen, se pierden. Y por el lado izquierdo entran ceros.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #9 en: 22 de Febrero de 2011, 19:46:10 »
Y por último si no es abusar,
si quisiera cambiar el orden de los bits, como lo haría.

me refiero a esto:
imagina que el dato de 16 bis me entra desde el dispositivo así: (lo pongo con números para que se entienda, si lo pongo en binario es más lioso)

15,14,13,12,10,9,8,7,6,5,4,3,2,1,0

que utilizaría para invertirlos y dejar así

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

¿podría ser con la función shift right?
« Última modificación: 22 de Febrero de 2011, 19:53:04 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #10 en: 22 de Febrero de 2011, 20:56:49 »
Hola.

Se podria con SWAPF a cada byte?
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #11 en: 22 de Febrero de 2011, 23:11:52 »
 :?

algo así?


Código: C
  1. for(k=0;k<16;k++){
  2.     shift_left(VarOut,2,bit_test(VarIn,k));
  3. }

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #12 en: 23 de Febrero de 2011, 03:43:48 »
Con swap no se podria, no quedarian en el orden deseado.

a=0111 1101

Deberia de quedar como: b=1011 1110 y queda con swap como: b=1101 0111

Conforme lo tiene Suky si que esta bien.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #13 en: 23 de Febrero de 2011, 13:09:33 »
yo una vez utilicé el desplazamiento y los operadores lógicos para tomar bits de diferentes puertos.

Código: [Seleccionar]
//**************************************************************
// Aquí se agrupa los bits concerniente a las columnas 1-4 junto
// con RB[7-4] en un solo registro para manejarlo a posteriori
// iPuerto_compuesto = [RB7,RB6,RB5,RB4,columna3,columna2,columna1,columna0]
//**************************************************************
void  Configurar_iPuerto_compuesto(void){
  iPuerto_compuesto=0;
  iPuerto_compuesto = input_b() & iLos_Cuatro_MSB_PORTB;
  iPuerto_compuesto |= (input_state(iColumna3) << 3);
  iPuerto_compuesto |= (input_state(iColumna2) << 2);
  iPuerto_compuesto |= (input_state(iColumna1) << 1);
  iPuerto_compuesto |= input_state(iColumna0);
}

necesitaba tomar el estado de RB[7-4] y un bit del un puerto cualquiera, después los juntaba todos en un Integer de 1Byte al que llamé iPuerto_compuesto

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Como puedo seleccionar los bits que me interesan dentro de una palabra?
« Respuesta #14 en: 23 de Febrero de 2011, 14:20:23 »
Pues la verdad es que no sé cómo utilizar el shift_left, el ejemplo que ha puesto Suky no me funciona, el proteus me da muchos mensajes como estos:



Y en el display no aparece datos si no 0000 o números que no coinciden con los que debiera de haber

La verdad es que no hay mucha documentación al respecto y los ejemplos que he encontrado están poco claros

Alguien me lo puede explicar, así como para tontos.
gracias
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...