Learning   Examples | Foundations | Hacking | Links

Las máscaras de bits se utilizan para acceder a partes específicas de un byte de datos. Suele ser útil como método de iteración, por ejemplo cuando se envía un byte de datos en serie a un solo pin. En este ejemplo, el pin tiene que cambiar su estado de alto (1) a bajo (0) para cada bit en el byte a transmitir. Esto se consigue con lo que se conoce como operaciones bit a bit (bitwise operations) y una máscara de bits (bit mask). Las operaciones bit a bit realizan funciones lógicas que tienen efecto al nivel de bits. Las operaciones bit a bit estándar incluyen AND (&) OR (|) Left Shift o desplazamiento a la izquierda (<<) y Right Shift o desplazamiento a la derecha (>>)

El operador AND (&) resultará 1 en cada posición de bit donde ambos valores de entrada eran: 1. Por ejemplo:

    x:  10001101
    y:  01010111
x & y:  00000101

El operador OR (|) también conocido como "Inclusive OR", resultará 1 en cada posición de bit en que cualquiera de los dos valores sea 1. Por ejemplo:

  
    x:  10001101
    y:  01010111
x | y:  11011111

El operador Left Shift (<<) desplaza los bits de un valor hacia la izquierda el número de posiciones especificadas. Por ejemplo:

           y = 1010
           x = y << 1
resultado: x = 0100 

Todos los bits en el byte son desplazados una posición a la izquierda y el bit más a la izquierda se pierde.

El operador Right Shift (>>) desplaza los bits de un valor hacia la derecha el número de posiciones especificadas. Por ejemplo:

           y = 1010
           x = y >> 1
resultado: x = 0101 

Todos los bits en el byte son desplazados una posición a la derecha y el bit más a la derecha se pierde.

Para un ejemplo practico, vamos a tomar el valor 170, que en binario es 10101010. Para sacar este valor secuencialmente por el pin 7, el código sería el siguiente:

byte transmitir = 7; // define el pin por que vamos transmitir
byte valor = 170; // valor a transmitir, binario 10101010
byte mascara = 1; // nuestra mascara de bits
byte tiempoEntreBits = 100; // Tiempo en milisegundos entre cada bit

void setup()
{
   pinMode(transmitir,OUTPUT);
}

void loop()
{
  for (mascara = 00000001; mascara>0; mascara <<= 1) { // recorre la mascara de bits
    if (data & mascara){ // si el bit esta activado
      digitalWrite(transmitir,HIGH); // envia 1
    }
    else{ // si el bit no esta activado
      digitalWrite(transmitir,LOW); // envia 0
    }
    delayMicroseconds(tiempoEntreBits); //espera
  }
}
  

Aquí se utiliza un bucle FOR para iterar a través de una máscara de bits, cambiando el valor de una posición hacia la izquierda cada vez que entramos en el bucle. En este ejemplo se utiliza el operador <<= que es exactamente igual que el operador <<, salvo que se compacta la declaración mascara = mascara << 1 en una línea más corta.

A continuación, realiza una operación bit a bit de tipo AND entre el valor y la máscara de bits. De esta manera, como la máscara de bits se desplaza a la izquierda por cada posición en el byte, se comparará con cada bit en el byte que estamos enviando de forma secuencial y el resultado puede ser usado para fijar el pin de salida a nivel alto (1) o a nivel bajo (0) respectivamente.

Así que en este ejemplo, la primera vez que entra en el bucle la máscara es igual a 00000001 y el valor es igual 10101010 por lo que nuestra operación es así:

  00000001
& 10101010
  ________
  00000000

Por lo que la salida por el pin será 0.

La segunda vez que entra en el bucle, la máscara es igual a 00000010, por lo que la operación sería así:

  00000010
& 10101010
  ________
  00000010

Y la salida por el pin será 1.

El bucle continuará recorriendo cada bit en la máscara hasta que el 1 se pierda por la última posición de la izquierda de los 8 bits y la máscara será entonces 0 y el bucle terminará.

Share