Algumas
vezes nos deparamos com a necessidade de trabalharmos diretamente com apenas um
bit do registrador, muitos compiladores nos trazem ferramentas específicas para
este fim, mas o mikroC na sua versão PRO não aborda diretamente este problema,
tornando um pouco desgastante o processo de testar ou alterar um único bit.
Para contornar esta situação, eu resolvi desenvolver algumas
macros (bloco de instruções que executam uma determinada função) para tornar o
processo de programação mais confortável, para tanto tomei como base o livro
TÉCNICAS DE PROJETOS ELETRÔNICOS COM OS MICROCONTROLADORES AVR , do autor
Charles Borges de Lima, que por sinal é uma literatura indispensável para
desenvolvedores de sistemas embarcados independentemente da plataforma que
trabalham, e adaptei as idéias dele para o compilador mikroC PRO com alguns
exemplos de uso.
Foram desenvolvidas quatro macros com as funções de setar
(colocar o bit em 1), limpar (colocar o bit em 0), testar o
estado do bit se é falso ou verdadeiro, 0 ou 1 e por fim a última macro que tem
a função de complementar o bit, ou seja, inverte o estado do mesmo,
vejamos como funciona:
__________________________________________________________________________________
#define
Seta_bit(Variavel,bit) (Variavel |= (1<<bit))
Esta macro chamada de Seta_bit usa como parâmetros o registrador do qual queremos
trabalhar e o bit de interesse, e quando chamada efetua uma lógica OR
entre o registrador e o número
00000001 rotacionado a esquerda a quantidade de vezes necessária para setar
apenas o bit de interesse.
Exemplo:
Imaginemos que o PORTB esteja com o seguinte valor ->
PORTB = 0b00010010
Seta_bit(PORTB,2);
O compilador irá fazer o seguinte processo:
PORTB -> 0b00010010
OU ->
0b00000100 <- Valor 0b00000001 rotacionado 2 vezes a
esquerda!
-----------------
PORTB = 0b00010110 <- Pode se
observar que apenas o bit de destino foi alterado.
__________________________________________________________________________________
#define
Limpa_bit(Variavel,bit) (Variavel &=~(1<<bit))
Esta macro tem a função inversa da anterior e serve para
limpar o bit, ou seja, quando chamada coloca o bit passado como parâmetro em
false, zero, nível baixo enfim dizemos que limpa o estado do bit, para isto
efetua a lógica AND entre o registrador passado como parâmetro e o byte
11111110 (que nada mais é do que o byte 00000001 negado), vejamos como isto
funciona:
Limpa_bit(PORTB,4);
O compilador irá fazer o seguinte processo:
PORTB -> 0b00010010
AND -> 0b11101111 <- Valor
0b00000001 negado e rotacionado 4 vezes a esquerda!
-----------------
PORTB = 0b00000010 <- Pode se observar
que apenas o bit de destino foi alterado.
__________________________________________________________________________________
#define
Testa_bit(Variavel,bit) (Variavel & (1<<bit))
A macro chamada Testa_bit tem por finalidade nos informar o
estado do bit em questão, e para tanto efetua a lógica AND entre a variável e o
byte 00000001 rotacionado à esquerda a quantidade de bits necessários, vejamos:
Testa_bit(PORTB,1);
O compilador irá fazer o seguinte processo:
PORTB -> 0b00010010
AND -> 0b00000010 <- Valor
0b00000001 rotacionado 1 vez a esquerda!
-----------------
PORTB = 0b00000010
Neste exemplo temos que analisar que quando
aplicamos a "máscara" temos o espelho apenas do bit passado no
parâmetro, portanto se ele estiver em zero, o resultado desta macro é zero,
mais se ele tiver estiver ativo o resultado será diferente de zero, onde
então podemos efetuar o teste.
__________________________________________________________________________________
#define
Comp_bit(Variavel,bit) (Variavel ^= (1<<bit))
A macro Comp_bit executa o complemento do bit passado como parâmetro,
e faz isto através da lógica EXCLUSIVE OR entre o registrador passado como
parâmetro e 00000001 rotacionado a esquerda a quantidade de bits necessários,
vejamos:
Comp_bit(PORTB,7);
O compilador irá fazer o seguinte processo:
PORTB -> 0b00010010
XOR -> 0b10000000 <- Valor
0b00000001 rotacionado 7 vezes a esquerda!
-----------------
PORTB = 0b10010010 <- Pode se observar
que apenas o bit de destino foi alterado.
__________________________________________________________________________________
Abaixo um vídeo demonstrando o uso das macros na placa
PK2Lab
Bom pessoal por hoje é isto, desejamos a todos um Feliz Natal
com muita paz, alegria, saúde e um ano novo repleto de realizações, que venha
2012!!!
PK2Lab Team
www.esquemas.org
JL Audio Manutenção Eletrônica
@
@ @
@ @ @
@ @ @ @
@ @ @ @ @
@ @
@ @ @ @
@ @ @ @ @ @ @
@ @ @
@ @ @ @ @ @
# #
# # #