24 de dez. de 2011

Macros no mikroC PRO

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 

Chamamos a macro abaixo para setar o bit 2 do PORTB.


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

 
                                                                      @
                                                                    @ @
                                                                  @ @ @
                                                                @ @ @ @
                                                             @ @ @ @ @
                                                          @ @ @  @  @ @
                                                       @ @ @  @  @  @ @ 
                                                   @ @ @ @  @  @ @ @ @
                                                                      # # 
                                                                     # # #



 

Nenhum comentário:

Postar um comentário