Operadores bit a bit no exemplo de programação de microcontrolador

Operadores bit a bit na programação de microcontroladores

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


Neste tutorial, aprenderemos sobre um dos conceitos importantes da Programação incorporada, ou seja, as Operações Bitwise ou Operações em nível de Bit. Os operadores de bit a bit na linguagem de programação C são a espinha dorsal dessas operações. Vou mostrar como você pode usar os operadores Bitwise na programação de microcontroladores para facilitar as manipulações bit a bit.

NOTA IMPORTANTE: É necessário um conhecimento prévio do sistema de números binários e do sistema de números hexadecimais para trabalhar com operadores bit a bit na programação de microcontroladores.

Introdução

Se você conhece os microcontroladores, provavelmente deve conhecer os operadores de bit a bit na programação de microcontroladores. Em um microcontrolador de 8 bits como o 8051, por exemplo, um grupo de 8 pinos combinados para formar uma porta. O motivo para agrupar os pinos em portas é facilitar a programação, pois você pode manipular 8 pinos ao trabalhar no nível da porta.

Mas e se você quiser controlar pinos individuais de uma porta. Então você tem que fazer uso de operadores Bitwise na programação de microcontroladores. Usando seis operadores bit a bit, você pode executar algumas das importantes manipulações de bits, como Definir um bit, Limpar um bit, Alternar um bit, Testar um bit, Extrair um bit e Monitorar um bit.

Noções básicas de operadores bit a bit

Agora, vamos começar com algumas noções básicas de operadores Bitwise. Como o nome sugere, os operadores bit a bit são usados ​​para manipular dados no nível de bit. Os operadores bit a bit podem ser usados ​​com números inteiros e não podem ser aplicados a outros tipos de dados, como float ou double (bem, pelo menos não diretamente).

Números inteiros decimais são convertidos em binários, ou seja, uma sequência de 1 e 0 e os operadores bit a bit trabalham nesses dados bit a bit, começando no LSB (o bit menos significativo à direita) e trabalhando no MSB (o bit mais significativo no esquerda longínqua).

Diferentes tipos de operadores bit a bit

Basicamente, existem seis tipos de operadores Bitwise. Eles são:

  • OR bit a bit – indicado por “|”
  • AND bit a bit – indicado por “&”
  • XOR bit a bit – indicado por “^”
  • Bitwise NOT – indicado por “~”
  • Deslocamento à direita bit a bit – indicado por “>>”
  • Deslocamento à esquerda bit a bit – indicado por “<<"

Antes de entender cada um desses operadores em detalhes, vamos dar uma olhada rápida na tabela verdade para os operadores Bitwise AND, OR e XOR. A tabela a seguir mostra a tabela verdade para operadores Bitwise AND, OR e XOR com dois operandos.

OP1OP2OP1 OP2 (OU)OP1 e OP2 (AND)OP1 ^ OP2 (XOR)

0 0

0 00 00 0

0 0

0 0

110 0

1

1

0 010 0

1

1

111

0 0

Vamos agora dar uma olhada em todos os seis operadores Bitwise usados ​​na programação C incorporada.

OR bit a bit – ‘|

O OR bit a bit é indicado pelo símbolo ‘|‘ O resultado do OR bit a bit é ‘1’ quando qualquer bit é ORed com 1 e o resultado do OR bit a bit é igual ao bit quando é ORed com 0. Considere dois números de 4 bits A = 1100 e B = 1001. OR bit a bit desses dois números será o seguinte:

Posição de bit ->

321

0 0

A = 1100

110 0

0 0

B = 1001

10 00 0

1

UMA | B

110 0

1

Cada bit do LSB de um número é ORed com o bit correspondente no outro número. Por exemplo, o 0º bit de A é 0 e o 0º bit de B é 1. 0 | 1 é 1. Isso deve ser repetido para todos os bits.

AND bit a bit – ‘&

O AND bit a bit é indicado pelo símbolo ‘&’. O resultado do AND bit a bit é ‘1’ somente quando os dois operandos são 1. Caso contrário, o resultado do AND bit a bit é 0. Considere os mesmos dois números de 4 bits que no exemplo anterior, ou seja, A = 1100 e B = 1001. O AND bit a bit desses dois números será o seguinte:

A = 1100

110 0

0 0

B = 1001

10 00 0

1

A e B

10 00 0

0 0

Bitwise XOR – ‘^

O XOR bit a bit é abreviação de OU exclusivo e é indicado pelo símbolo ‘^’. O Bitwise XOR é um operador importante na programação de microcontroladores.

Quando um bit é XORed com 0, o resultado é igual ao próprio bit, isto é, se 0 for XORed com 0, o resultado será 0 e se 1 for XORed com 0, o resultado será 1.

Quando um bit é XORed com 1, o resultado é alternado, ou seja, se 0 for XORed com 1, o resultado será 1 e se 1 for XORed com 1, o resultado será 0.

Considere os mesmos dois números de 4 bits que no exemplo anterior, ou seja, A = 1100 e B = 1001. O XOR bit a bit desses dois números será o seguinte:

A = 1100

110 0

0 0

B = 1001

10 00 0

1

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

A ^ B

0 010 0

1

Bitwise NOT – ‘~

O NOT bit a bit é indicado pelo símbolo ‘~’ e é o único Operador Unitário Bitwise no grupo, ou seja, requer apenas um único operando (enquanto todos os outros Operadores Bitwise exigem dois operandos).

O operador bit a bit NOT também é chamado de negação ou complemento. Como é um Operador Unário, o Bitwise NOT de 0 é 1 e o Bitwise NOT de 1 é 0.

Agora, considere um número de 4 bits A = 1011. O NOT bit a bit deste número é 0100.

A = 1011

10 01

1

~ A

0 010 0

0 0

Operadores de deslocamento bit a bit (deslocamento à esquerda ‘<<’ and Right Shift ‘>> ‘)

Finalmente, existem dois operadores de turno, ou seja, Shift Esquerdo e Shift Direito e eles são representados por ‘<<’ and ‘>> ‘Respectivamente. Primeiro vamos entender o operador do turno esquerdo. A operação de deslocamento à esquerda é representada da seguinte maneira:

Operando << n

O que isto significa é deslocar os bits do ‘Operando’ para a esquerda pelo número de posições especificado por ‘n’. Os bits mais ‘n’ esquerdos serão descartados e o número de zeros ‘n’ será anexado à direita. Por exemplo, considere o seguinte exemplo.

11101100 << 2 resultará em 10110000

Da mesma forma, uma operação de mudança à direita é representada da seguinte maneira:

Operando >> n

Considere o seguinte exemplo de deslocamento à direita.

10010111 >> 4 resultará em 00001001

Operadores bit a bit na programação de microcontroladores

Agora que vimos um pouco sobre os operadores bit a bit em C, vamos agora entender como podemos usar esses operadores bit a bit na programação de microcontroladores. Para fins de demonstração, estou usando um microcontrolador de 8 bits como exemplo. Mas a mesma implementação também pode ser aplicada aos microcontroladores de 32 bits.

Ao trabalhar com microcontroladores, geralmente modificamos, lemos e atualizamos seus registros. Mas é uma prática ruim atribuir valores a um registro diretamente. Por exemplo, se você se lembra em 8051, existe um SFR chamado IE (abreviação de Interrupt Enable) Register.

Operadores bit a bit no exemplo de programação de microcontrolador

As interrupções individuais podem ser ativadas ou desativadas configurando ou limpando o bit no IE SFR. Temos que executar esta operação de forma que apenas o bit selecionado deva ser afetado, enquanto todos os outros bits devem manter o status pretendido. As operações bit a bit serão muito úteis em tais cenários. Deixe-me explicar algumas das operações Bitwise comuns que implementamos na programação de microcontroladores.

Configurando um pouco

A primeira operação é Configurando um bit, ou seja, tornando o bit como 1. Por exemplo, considere os seguintes dados de 8 bits chamados REG.

REG = 10001111

Agora, se queremos “definir” os 6º bit, podemos simplesmente executar a seguinte operação.

Primeiro, mude para a esquerda 1 por 6, isto é, 1 << 6. Isso resultará em 01000000. Agora OU este valor com o valor do REG e atribua-o novamente ao REG.

REG = REG | 01000000;

O valor final do REG é 11001111. A operação acima pode ser implementada em uma única linha da seguinte maneira:

REG = REG | (1 << 6);

ou até simplificá-lo como

REG = (1 << 6); // Defina o bit 6

Dessa forma, podemos definir o bit desejado sem perturbar os outros bits.

Limpando um pouco

Agora, suponha que você queira limpar as 5º bit nos dados REG = 10110000. Primeiro, desloque a esquerda 1 por 5, ou seja, 1 << 5. O resultado é 00100000. Agora, execute uma operação Bitwise NOT nesse valor.

~ (00100000) = 11011111.

Finalmente, execute uma operação AND bit a bit (&) entre esse valor e o valor de REG.

REG & (11011111) = 10110000 & 11011111 = 100100000. Somente os 5º bit é limpo. Toda a operação pode ser implementada em uma única linha da seguinte maneira:

REG & = ~ (1 << 5); // Limpar bit 5

Alternando um pouco

Agora, vamos ver um exemplo de alternar um pouco, ou seja, se o bit for 0, faça-o como 1 e se for 1, faça-o como 0. Se você se lembra do operador Bitwise XOR, pode usar esse operador para execute esta tarefa.

Considere o valor de REG como 00110010. Agora, se você deseja alternar 4º pouco, então simplesmente XOR os 4º bit com 1. Para isso, primeiro desloque a esquerda 1 por 4, ou seja, 1 << 4 e depois XOR com REG.

REG ^ = (1 << 4); // Alterna o bit 4

As três operações Bitwise acima estão relacionadas às manipulações de bits, ou seja, o bit é definido ou desmarcado ou alternado. As próximas três operações estão relacionadas ao status do bit e não o modificam.

Testando um pouco

Agora, considere uma situação em que você precisa executar alguma operação, dependendo do valor do bit, isto é, se o bit for 0, execute um conjunto de instruções e se o bit for 1, execute um conjunto diferente de instruções. Aqui, na verdade, estamos testando o valor do bit.

if (REG & (1 << 5)! = 0)

{

}

No exemplo acima, a instrução if é executada apenas se o 5º bit de REG é 1.

Extraindo um pouco

Usando o método semelhante ao Teste de um bit, podemos extrair um bit ou um conjunto de bits de um dado. Por exemplo, deixe REG = 11010101. Agora, se você deseja extrair um único bit na posição, diga 3, por exemplo.

Então, podemos extrair os 3rd bit em outra variável (vamos chamar EXTD) da seguinte maneira.

EXTD = REG & (1 << 3);

Agora, se quisermos extrair um conjunto de bits, digamos de 3 a 6. Então, primeiro, temos que mascarar os bits de 3 a 6. Portanto, o valor da máscara se torna 01111000.

Então podemos extrair os bits desejados usando dois métodos.

Método I

EXTD = (REG & 01111000) >> 3;

Método II

EXTD = (REG >> 3) & 1111;

Monitorando um pouco

A Operação Bitwise final geralmente usada na Programação de Microcontroladores é Monitorar um Bit. Isso é muito importante na programação incorporada, pois geralmente precisamos verificar ou monitorar o status de alguns bits no registro de um microcontrolador. Por exemplo, os bits do sinalizador de interrupção, que geralmente são definidos pelo hardware, devem ser monitorados e prosseguir com a execução do ISR.

Se você quiser monitorar um pouco, diga 3rd bit para uma mudança de 0 para 1, você pode usar o seguinte código.

while (REG e (1 << 3))

{

}

Da mesma forma, se você deseja monitorar uma alteração de 1 para 0 nos 3rd bit, você pode usar o seguinte código.

while (~ (REG & (1 << 3))))

{

}

Conclusão

Neste tutorial, vimos o básico dos operadores Bitwise e também como podemos usar esses operadores Bitwise na programação de microcontroladores. As operações bit a bit na programação incorporada fornecem uma maneira rápida de obter resultados e também melhoram o desempenho do código (e do hardware). Use essas operações Bitwise em seus aplicativos incorporados o mais rápido possível.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
Leia Também  Baidu aposta em FPGAs para estacionamento com manobrista automatizado