MACRO PARA SETAR E ZERAR BIT EM C (DÚVIDA)

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

MACRO PARA SETAR E ZERAR BIT EM C (DÚVIDA)

Mensagempor Jagger » 19 Set 2007 17:15

Mestres, tenho uma dúvida. As seguintes macros podem ser usadas para setar e limpar bits de uma variável em C no compilador PICC da HI-TECH:

#define bitset(var,bitno) (var|=1UL<<(bitno))
#define bitclr(var,bitno) (var&=~(1UL<<(bitno)))

Funcionam, mas gosto de entender e não apenas copiar. O que significa 1UL nesse comando? Como essas macros agem? Obrigado, prezados amigos.
Jagger
Nibble
 
Mensagens: 53
Registrado em: 20 Out 2006 12:39
Localização: Chapecó - SC

Mensagempor ze » 19 Set 2007 17:30

para facilitar a vida dos mestres segue a macro que uso:

#define setbit(var,bitno) ((var) |= 1 << (bitno))
#define clrbit(var,bitno) ((var) &= ~(1 << (bitno)))

de quebra, inverter bit

#define xorbit(var,bitno) ((var) ^= 1 << (bitno))

troque 1Ul por 1 e tente entender. dá no mesmo (acho que não ajudei nada! mas aguarde...)
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Jagger » 19 Set 2007 17:45

Muito obrigado lellis, show!!!
Jagger
Nibble
 
Mensagens: 53
Registrado em: 20 Out 2006 12:39
Localização: Chapecó - SC

Mensagempor Maurício » 19 Set 2007 17:51

Olá, Jagger.

Não conheço o PICC, mas, acredito que o UL seja referente à UNSIGNED LONG, ou seja, a macro faz um "casting" no numeral 1 pra unsigned long, antes de fazer a operação, o que permite fazer operações com qualquer número inteiro até o limite do unsigned long ( 32 bits no seu caso? ).

Quando vc cria uma macro o compilador substitui o nome da macro pelo texto que está a direita da macro.

No caso dessas macros que vc citou, a macro substitui os valores que foram digitados pelos equivalentes na fórmula que está à direita da macro.

#define bitset(var,bitno) (var|=1UL<<(bitno))

No programa, a variavel var tem o valor de 0xA2, e queremos setar o bit 3 dessa variável (D2), então usamos a macro:

bitset (var, 2 );

Na compilação, quando o pré-processador encontrar essa macro, ele irá fazer as seguintes modificações:

bitset (var, 2 ); // local da chamada no programa

0xA2 |= 1UL << 2 // operação do pré-processador, sem esquecer que ANTES de fazer a operação de deslocamento no numeral 1, o número 1 é convertido para LONGO.

Espero que ajude.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor andre_luis » 20 Set 2007 08:08

Só pra constar :

O PIC, assim como diversos outros cores, possui instruções de manipulação de bits, e por isso pode-se usar comandos set e clear de bit's diretamente. Na verdade, se o compilador tiver alguma otimização, saberá que pode trocar cada uma dessas macros acima por uma única instrução ( bitset ou bitclear ).


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Jagger » 21 Set 2007 10:51

Muito obrigado, Maurício e André. Abraço.
Jagger
Nibble
 
Mensagens: 53
Registrado em: 20 Out 2006 12:39
Localização: Chapecó - SC


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x