LENGUAJE C PARA MICROCONTROLADORES OPERACIONES DE BITS

operaciones de bits 1

Utilizar las operaciones bit por bit u operaciones de bits o el manejo de bits es fundamental al momento de programar los microcontroladores, el lenguaje C nos facilita mucho esta tarea, todos los registros con los que se controlan los microcontroladores están formados por bits, de ahí la importancia de las operaciones de bits.

Un bit solo puede tener 2 valores, o es 0 o es 1 a los que se les llama dígitos, en los microcontroladores los registros forman grupos de bits, un grupo de 8 bits es conocido como 1 byte, un grupo de 16 bits estará formado por 2 bytes, a este grupo se le suele llamar 1 word o una palabra.

Las agrupaciones de bits forman números, con 8 bits se pueden tener números positivos que van del 0 al 255, y con 16 bits del 0 al 65535, esto se obtiene de la siguiente relación para los números binarios, así se les llama a los números cuando están representados por ceros y unos.

operaciones de bits 2

Cuando se tienen 0 bits n será cero entonces número será 0, si se tienen 8 bits, entonces número será 2^8-1 lo que resulta en 255, por eso es que con 8 bits los números van de 0 a 255, algo similar ocurre para el caso de los números de 16 bits, la relación es válida para el número de bits que se tengan, lo común en nuestro caso serán 8 bit o 16 bits. 

Será necesario tener conocimientos sobre el manejo de los números binarios, lo importante será en nuestro caso la conversión de binario a decimal,  de decimal a binario, también será necesario la conversión de números hexadecimales a  decimales y a la inversa.

Una calculadora nos vendrá muy bien, si estamos en el ordenador por ejemplo usando Windows, este tiene una calculadora que se puede poner en modo programador, donde sale las opciones de las conversiones de los números, en la siguiente imagen se ha elegido la opción decimal, se ingresa el número 187, en los resultados se ve que este número en hexadecimal es 0xbb y en binario es 0b10111011, también se obtiene el resultado en octal.

operaciones de bits 3

Si el número que se tiene esta en binario, en la calculadora se elige la opción BIN, se ingresan los 0 y 1 que conforman el número y en los resultados se obtendrá el número binario representado en las otra bases.

En la hoja de datos del microcontrolador que se esté utilizando se podrá consultar los nombres  de los registros de los que se tendrá que manipular sus bits para programar el microcontrolador, por ejemplo en la hoja de datos del PIC18F4550 se ve que este tiene una gran cantidad de registros, pero si nos interesa utilizar sus pines como entradas salidas digitales, será necesario manipular los bits de sus registros TRISx, PORTx y LATx, donde x depende del puerto a utilizar.

Si en el registro TRISx a uno de sus bits se le pone a 0, se hará que el pin correspondiente al mismo número de bit del PORTx se convierta en una salida digital, por el contrario si el bit del TRISx se pone a 1, ese pin se comportará como una entrada digital.

El lenguaje C para las operaciones de bits, u operaciones de bit a bit cuenta con los siguientes operadores:

operaciones de bits 4

LENGUAJE C OPERACIONES DE BITS DESPLAZAMIENTO DE BITS <<  >>

En los números binarios los  bits se cuentan de derecha a izquierda, por ejemplo en los números de 8 bits se cuentan del 0 al 7, el  bit0 será el de mas a la derecha y el bit7 será el de mas a la izquierda.

Las operaciones de bits de desplazamiento lo que hacen es que cambian el numero o se le asigna el resultado a una nueva variable, mediante el cambio de las posiciones de los bits que conforman el número, este desplazamiento puede ser a la derecha o a la izquierda.

Por ejemplo si se tiene el número decimal x=187 que en binario es x=10111011 

Si se utiliza el desplazamiento a la derecha por ejemplo de 3 posiciones, asignando el resultado al mismo número, en el lenguaje C esto se indicará así:

x=x>>3;

También se puede hacer así:

x>>=3;

Ahora el valor de x será x=00010111, lo que ocurre es que los bits se mueven 3 posiciones a la derecha, reemplazando con 0 las posiciones que ya no son utilizadas, como el resultado se le ha asignado al mismo x, ahora x=23;

El resultado se le puede asignar a otra variable, por ejemplo:

y=x>>3;

Así x  conserva su valor de 187 siendo el valor de y=23.

Si se utiliza el desplazamiento a la izquierda por ejemplo de 5 posiciones, asignando el resultado al mismo número, en el lenguaje C esto se indicará así:

x=x<<5;

También se puede hacer así:

x<<=5;

Ahora el valor de x será x=01100000, lo que ocurre es que los bits se mueven 5 posiciones a la izquierda, reemplazando con 0 las posiciones que ya no son utilizadas, como el resultado se le ha asignado al mismo x, ahora x=96;

El resultado se le puede asignar a otra variable, por ejemplo:

y=x<<5;

Así x  conserva su valor de 187 siendo el valor de y=96

El desplazamiento de bits será muy utilizado al programar los microcontroladores, para poder manipular los bits de sus registros, !hay que acostumbrarse a moverse entre bits!.

LENGUAJE C OPERACIONES DE BITS COMPLEMENTO BIT A BIT ~

El operador bit a bit de complemento, simbolizado con ~, lo que hace es que si se tiene una variable o número binario, invierte los valores de los bits que lo conforman, esto es al 0 lo convierte en 1 y al 1 en 0.

Por ejemplo si se tiene el número decimal x=187 que en binario es x=10111011.

La operación de complemento de bits en lenguaje C, para ser guardada en otra variable y se hará así:

y=~x;

Siendo el valor de y en binario y=01000100 que en decimal será y=68.

Cuando se utiliza un puerto completo de un microcontrolador como salidas digitales, algunas veces se colocan leds en estas salidas, se suele invertir estas salidas cada cierto tiempo, esto se puede realizar con el operador de complemento bit a bit, por ejemplo si  se usa el puerto D del ATMEGA328P, se hace lo siguiente:

PORTD=~PORTD;

LENGUAJE C OPERACIONES DE BITS OPERADOR AND &

La tabla de verdad para las operaciones de bits del operador & AND es la siguiente: 

operaciones de bits 5

La única comparación entre 2 bits que da como resultado 1 es cuando ambos  bits son 1, si alguno de ellos es 0 o si ambos son 0 el resultado será un 0.

Si se tienen 2 números en  decimal con su equivalente en binario en este caso de 8 bits, en los números binarios los  bits se cuentan de derecha a izquierda, se cuentan del 0 al 7, el  bit0 será el mas a la derecha y el bit7 será el de mas a la izquierda, en el siguiente ejemplo se realiza la operación & entre el número 187 y el número 253.

operaciones de bits 6

Como se puede ver los bits 0 son ambos 1 por lo que la operación & da un 1, el bit1 de x  es 1, el bit 1 de y es 0, por lo que la operación & da un 0, el bit2 de x es 0 y el bit2 de y es 1, por lo que la operación & da un 0, los bits 3,4 y 5 de x e y son 1 por lo que sus operaciones & dan 1, el bit6 de x es 0 mientras que el de y es 1 por lo que la operación & es 0, los bits 7 de ambos son 1 por lo que la operación & da un 1, siendo el resultado el número binario 0b10111001 que en decimal es el 185.

Suponiendo que se tienen 2 variables A y B, al utilizar el operador AND en operaciones de bits del lenguaje C con los microcontroladores, esto dará un resultado que se podrá guardar en otra variable que llamaremos R puede ser cualquier nombre, en lenguaje C se puede proceder así:

R = A&B;

Si lo que se quiere es guardar en la variable A el resultado de la operación & entre A&B, modificando de esta manera el valor de A se hará lo siguiente:

A=A&B;

El lenguaje C permite hacer lo siguiente para operaciones de bits con el operador &, que es lo mismo  que lo anterior:

A&=B;

Este operador se utiliza para ver si algunos de los bits de algún registro se ha puesto a 1, esto se utiliza en las condicionales if else del lenguaje C por ejemplo si se quiere ver si el bit3 del registro PORTB se ha puesto a 1, mediante el operador & y el uso de desplazamiento de bits, asignando el resultado a alguna variable que llamaremos x, se procede como sigue.

Se utilizará el número 1 que en binario de 8 bits es 00000001, a este se le hace un corrimiento de 3 bits hacia la izquierda, para que el 1 se coloque en la posición 4 que es donde está el bit3 del PORTB, al desplazar los bits del número 1, quedará 00001000 que es el 8 en decimal.

Esto en el lenguaje C se puede hacer así:

00000001<<3;

Que es lo mismo que hacer:

1<<3;

Ahora se hace la operación & entre el registro PORTB y el desplazamiento de 3 bits hecho al 1, esto se le asigna a la variable x.

x = PORTB&(1<<3);

Como el bit3 del 1 desplazado 3 posiciones es 1, si el bit3 del PORTB esta a 1, mediante la operación & de estos dos bits el bit3 de x será 1, caso contrario será 0, los demás bits de x serán 0 ya que se esta operando los otros bits del 1 desplazado que son 0 con los otros bits del registro PORTB, no importando ya que valores tengan los demás bits del registro PORTB, ya que al operar el & con un 0 el resultado será siempre un 0.

El operador & es utilizado también para poner algunos de los bits de los registros de los microcontroladores a 0, para esto se utilizará el número 1 que en binario de 8 bits es 00000001, a este se le hace un corrimiento dependiendo de la posición del bit que se quiera poner a 0, por ejemplo el bit5.

Al número 1 se le hace un desplazamiento de bits hacia la izquierda, para que el 1 se coloque en la posición 6 que es donde está el bit5 del registro a utilizar, por ejemplo el registro TRISD, al desplazar los bits del número 1, quedará 00100000 que es el 32 en decimal.

Esto en el lenguaje C se puede hacer así:

00000001<<5;

Que es lo mismo que hacer:

1<<5;

Al valor obtenido se le hace una operación de complemento, esto es:

~(00100000);

Esto se puede hacer en un solo paso asi:

~(1<<5);

El valor resultante será 11011111, al registro TRISD se le realizará una operación AND con este valor, de tal modo que el bit 5 del registro TRISD se hará 0 ya que el bit5 del complemento encontrado será un 0, esto es suficiente para que la operación AND bit a bit sea un 0, los demás bits del valor encontrado serán 1, por lo que los demás bits del registro TRISD conservarán sus valores, si son 1 la operación & dará un 1, si son 0 la operación AND dará un 0.

Lo comentado en el lenguaje C se hace así:

TRISD=TRISD&~(1<<5);

También se puede hacer así:

TRISD&=~(1<<5);

Esta es la forma que será utilizada para poner a 0 los bits de los registros de los microcontroladores mediante las operaciones de bits.

LENGUAJE C OPERACIONES DE BITS OPERADOR OR |

La tabla de verdad para las operaciones de bits del operador | OR es la siguiente:

operaciones de bits 7

La única comparación entre 2 bits que da como resultado 0 es cuando ambos  bits son 0, si alguno de ellos es 1 o si ambos son 1 el resultado será un 1.

Si se tienen 2 números en  decimal con su equivalente en binario en este caso de 8 bits, en los números binarios los  bits se cuentan de derecha a izquierda, se cuentan del 0 al 7, el  bit0 será el mas a la derecha y el bit7 será el de mas a la izquierda, en el siguiente ejemplo se realiza la operación OR entre el número 187 y el número 233

operaciones de bits 8

Como se puede ver los bits 0 son ambos 1 por lo que la operación OR da un 1, el bit1 de x  es 1, el bit 1 de y es 0, por lo que la operación OR da un 1, el bit2 de x es 0 y el bit2 de y es 0, por lo que la operación OR da un 0, los bits 3,4,5,6 y 7 de x e y no son ambos a la vez 0 por lo que sus operaciones OR dan 1, siendo el resultado el número binario 0b11111011 que en decimal es el 251.

Suponiendo que se tienen 2 variables A y B, al utilizar el operador OR en operaciones de bits del lenguaje C con los microcontroladores, esto dará un resultado que se podrá guardar en otra variable que llamaremos R puede ser cualquier nombre, en lenguaje C se puede proceder así:

R = A|B;

Si lo que se quiere es guardar en la variable A el resultado de la operación OR entre A|B, modificando de esta manera el valor de A se hará lo siguiente:

A=A|B;

El lenguaje C permite hacer lo siguiente para operaciones de bits con el operador OR, que es lo mismo  que lo anterior:

A|=B;

El operador OR es utilizado para poner algunos de los bits de los registros de los microcontroladores a 1, para esto se utilizará el número 1 que en binario de 8 bits es 00000001, a este se le hace un corrimiento dependiendo de la posición del bit que se quiera poner a 1, por ejemplo el bit5.

Al número 1 se le hace un desplazamiento de bits hacia la izquierda, para que el 1 se coloque en la posición 6 que es donde está el bit5 del registro a utilizar, por ejemplo el registro TRISD, al desplazar los bits del número 1, quedará 00100000 que es el 32 en decimal.

Esto en el lenguaje C se puede hacer así:

00000001<<5;

Que es lo mismo que hacer:

1<<5;

El valor resultante será 00100000, al registro TRISD se le realizará una operación OR con este valor, de tal modo que el bit 5 del registro TRISD se hará 1 ya que el bit5 del número 1 desplazado será un 1, esto es suficiente para que la operación OR bit a bit sea un 1, los demás bits del número 1 desplazado serán 0, por lo que los demás bits del registro TRISD conservarán sus valores, si son 1 la operación OR dará un 1, si son 0 la operación OR dará un 0.

Lo comentado en el lenguaje C se hace así:

TRISD=TRISD|(1<<5);

También se puede hacer así:

TRISD|=(1<<5);

Esta es la forma que será utilizada para poner a 1 los bits de los registros de los microcontroladores mediante las operaciones de bits.

LENGUAJE C OPERACIONES DE BITS OPERADOR OR EXCLUSIVO ^

La tabla de verdad para las operaciones de bits del operador ^ OR EXCLUSIVO es la siguiente:

operaciones de bits 9

Las comparaciones entre 2 bits que da como resultado 1 es cuando los bits son diferentes es decir si uno es 0 el otro es 1, si los bits son iguales el resultado será un 0.

Si se tienen 2 números en  decimal con su equivalente en binario en este caso de 8 bits, en los números binarios los  bits se cuentan de derecha a izquierda, se cuentan del 0 al 7, el  bit0 será el mas a la derecha y el bit7 será el de mas a la izquierda, en el siguiente ejemplo se realiza la operación OR EXCLUSIVO entre el número 187 y el número 233

operaciones de bits 10

Como se puede ver los bits 0 son ambos 1 por lo que la operación OR EXCLUSIVO da un 0, el bit1 de x  es 1, el bit 1 de y es 0, por lo que la operación OR EXCLUSIVO da un 1, el bit2 de x es 0 y el bit2 de y es 0, por lo que la operación OR EXCLUSIVO da un 0, los bits 3, son ambos 1 por lo que se tiene un 0, y así se para los demás bits, se obtiene un 1 cuando los bits  son diferente y un 0  cuando los bits son iguales, siendo el resultado el número binario 0b01010010 que en decimal es el 82.

Suponiendo que se tienen 2 variables A y B, al utilizar el operador OR EXCLUSIVO en operaciones de bits del lenguaje C con los microcontroladores, esto dará un resultado que se podrá guardar en otra variable que llamaremos R puede ser cualquier nombre, en lenguaje C se puede proceder así:

R = A^B;

Si lo que se quiere es guardar en la variable A el resultado de la operación OR EXCLUSIVO entre A^B, modificando de esta manera el valor de A se hará lo siguiente:

A=A^B;

El lenguaje C permite hacer lo siguiente para operaciones de bits con el operador OR EXCLUSIVO, que es lo mismo  que lo anterior:

A^=B;

El operador OR EXCLUSIVO es utilizado para cambiar algunos de los bits de los registros de los microcontroladores a 1 si está a 0 o a 0 si está a 1, para esto se utilizará el número 1 que en binario de 8 bits es 00000001, a este se le hace un corrimiento dependiendo de la posición del bit que se quiera poner cambiar, por ejemplo el bit5.

Al número 1 se le hace un desplazamiento de bits hacia la izquierda, para que el 1 se coloque en la posición 6 que es donde está el bit5 del registro a utilizar, por ejemplo el registro PORTD, al desplazar los bits del número 1, quedará 00100000 que es el 32 en decimal.

Esto en el lenguaje C se puede hacer así:

00000001<<5;

Que es lo mismo que hacer:

1<<5;

El valor resultante será 00100000, al registro PORTD se le realizará una operación OR EXCLUSIVO con este valor, de tal modo que el bit5 del registro PORTD se hará 1 si era un 0 ya que el bit5 del número 1 desplazado será un 1, esto es suficiente para que la operación OR EXCLUSIVO bit a bit sea un 1.

Si el bit5 del PORTD es un 1, al realizar la operación OR EXCLUSIVO, se pondrá a 0, ya que el bit5 del 1 desplazado será un 1, esto es suficiente para que la operación OR EXCLUSIVO bit a bit sea un 0.

Los demás bits del número 1 desplazado serán 0, por lo que los demás bits del registro PORTD conservarán sus valores, si son 1 la operación OR EXCLUSIVA dará un 1, si son 0 la operación OR EXCLUSIVO dará un 0.

Lo comentado en el lenguaje C se hace así:

PORTD=PORTD^(1<<5);

También se puede hacer así:

PORTD^=(1<<5);

Esta es la forma que será utilizada para poner alternar entre 0 y 1 los bits de los registros de los microcontroladores mediante las operaciones de bits.


Esperamos de todo corazón haber podido ayudarles en este tema tan interesante del lenguaje C sobre las operaciones de bits, en cuanto a su uso con los microcontroladores.

ANTERIOR: directivas de preprocesador

SIGUIENTE

Publicar un comentario

Copyright © Electricidad y Electrónica. Designed by OddThemes