Autor Tema: Leer bit de una variable  (Leído 5128 veces)

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

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Leer bit de una variable
« en: 06 de Abril de 2016, 11:14:30 »
Tengo un programa para un PIC donde guardo unos valores en una variable char cada x tiempo.
¿Como puedo consultar en valor de algunos bits de esa variable?
Por ejemplo tengo que:
var= 0b01101100
Y quiero saber el valor del bit 4. ¿Como podría hacerlo?

¡Gracias de antemano!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer bit de una variable
« Respuesta #1 en: 06 de Abril de 2016, 11:17:42 »
Depende del compilador..

XC8/CCS/etc:

Código: C
  1. if ( (var & 0x10) == 1)
  2. {
  3. }

CCS

Código: C
  1. if(bit_test(var,4)==1)
  2. {
  3. }

En el primer metodo si no tiene optimizaciones puede llegar a producir un codigo medio largo. Lo mejor es usar una union con una estructura para todos los bits ( bit field ) y alli usar ese bit. De esa forma se pasa al menor cdigo posible
« Última modificación: 06 de Abril de 2016, 11:25:01 por KILLERJC »

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Re:Leer bit de una variable
« Respuesta #2 en: 06 de Abril de 2016, 11:39:39 »
Depende del compilador..

XC8/CCS/etc:

Código: C
  1. if ( (var & 0x10) == 1)
  2. {
  3. }

CCS

Código: C
  1. if(bit_test(var,4)==1)
  2. {
  3. }

En el primer metodo si no tiene optimizaciones puede llegar a producir un codigo medio largo. Lo mejor es usar una union con una estructura para todos los bits ( bit field ) y alli usar ese bit. De esa forma se pasa al menor cdigo posible
Gracias. Uso XC8
¿Que es el bit field? No entiendo eso...
¿Porque pones var & 0x10?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer bit de una variable
« Respuesta #3 en: 06 de Abril de 2016, 12:02:36 »
Me acabo de dar cuenta que tengo un error.

Código: C
  1. if ( (var & 0x10) == 0)
  2. {
  3. }
  4.  
  5. // o
  6.  
  7. if ( (var & 0x10) != 0)
  8. {
  9. }

Si estas interesado en el bit 4, es decir este bit: 0001 0000 = 0x10. Si haces una AND de ese valor y tu variable, solo queda el bit ese que tenia el 1.

Tomando 2 ejemplos, con bit4 en 0

0x67 = 0b01100111
0x10 = 0b00010000
AND  = 0b00000000

Con el bit 4 en 1

0x77 = 0b01110111
0x10 = 0b00010000
AND  = 0b00010000


Es decir que si era 0 te queda en 0, si era 1 te queda en cualquier otro numero

-----------------------------------------------------------

Respecto a los bit field:

https://en.wikipedia.org/wiki/Bit_field
http://www.tutorialspoint.com/cprogramming/c_bit_fields.htm
http://stackoverflow.com/questions/1044654/bitfield-manipulation-in-c

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Leer bit de una variable
« Respuesta #4 en: 06 de Abril de 2016, 12:18:03 »
Tal vez sea útil lo siguiente:

Código: C
  1. unsigned char LeerBit(unsigned char MiByte, unsigned char QueBit)
  2. {
  3.       return ((MiByte >> QueBit) & 0x01);
  4. }

Se lo podría usar así:

Código: C
  1. if (LeerBit(var,6)) //Determino si el bit 6 de var es 1
  2. {
  3.  
  4. }
  5.  
  6.  
  7. if (!LeerBit(var,6)) //Determino si el bit 6 de var es 0
  8. {
  9.  
  10. }
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Re:Leer bit de una variable
« Respuesta #5 en: 06 de Abril de 2016, 19:18:31 »
Me acabo de dar cuenta que tengo un error.

Código: C
  1. if ( (var & 0x10) == 0)
  2. {
  3. }
  4.  
  5. // o
  6.  
  7. if ( (var & 0x10) != 0)
  8. {
  9. }

Si estas interesado en el bit 4, es decir este bit: 0001 0000 = 0x10. Si haces una AND de ese valor y tu variable, solo queda el bit ese que tenia el 1.

Tomando 2 ejemplos, con bit4 en 0

0x67 = 0b01100111
0x10 = 0b00010000
AND  = 0b00000000

Con el bit 4 en 1

0x77 = 0b01110111
0x10 = 0b00010000
AND  = 0b00010000


Es decir que si era 0 te queda en 0, si era 1 te queda en cualquier otro numero

-----------------------------------------------------------

Respecto a los bit field:

https://en.wikipedia.org/wiki/Bit_field
http://www.tutorialspoint.com/cprogramming/c_bit_fields.htm
http://stackoverflow.com/questions/1044654/bitfield-manipulation-in-c

¿Entonces, si cualquier bit del AND es un 1, el IF saldría positivo?
¡Gracias!

Desconectado RinconR

  • PIC10
  • *
  • Mensajes: 27
Re:Leer bit de una variable
« Respuesta #6 en: 06 de Abril de 2016, 19:19:54 »
Tal vez sea útil lo siguiente:

Código: C
  1. unsigned char LeerBit(unsigned char MiByte, unsigned char QueBit)
  2. {
  3.       return ((MiByte >> QueBit) & 0x01);
  4. }

Se lo podría usar así:

Código: C
  1. if (LeerBit(var,6)) //Determino si el bit 6 de var es 1
  2. {
  3.  
  4. }
  5.  
  6.  
  7. if (!LeerBit(var,6)) //Determino si el bit 6 de var es 0
  8. {
  9.  
  10. }

¡Gracias! Lo probaré.
Aunque no entiendo esto: ((MiByte >> QueBit) & 0x01);

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re:Leer bit de una variable
« Respuesta #7 en: 06 de Abril de 2016, 19:34:43 »
mibyte >> quebit = desplaza hacia la derecha (>>) (quebit) posiciones. Osea si tienes 11000 y pones (11000 >> 2) obtendras  110. Luego esta el & 0x01 que simplemente hace una operacion AND con un bit '1'. En este caso si tienes 110 & 1 tendras como resultado: 0; ya que 0 & 1 = 0.

Son operaciones con bits. Los >> se llama desplazar, & = AND


 

anything