ajuda em macro para C.

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

ajuda em macro para C.

Mensagempor ffcprog » 22 Dez 2008 09:04

Meus caros, existem alguns fontes dos compiladores mikroe, que utilizam os comandos Set_bit e clear_bit.
Porêm no mikroC, estes comandos não existem.

Eu estou desde 6°F pensando em uma forma de criar uma macro para o compilador entender, mais não estou conseguindo..

Seria +/- isto aqui.

#define set_bit(param1,param2) (param1 | ( 1 << param2))

Set_bit = param1 OR 1 << * param2.

Set_bit(LATD,7) =
LATD | (1 << 7).

é possivel isto em C ?
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Re: ajuda em macro para C.

Mensagempor Rodrigo_P_A » 22 Dez 2008 09:15

ffcprog escreveu:Meus caros, existem alguns fontes dos compiladores mikroe, que utilizam os comandos Set_bit e clear_bit.
Porêm no mikroC, estes comandos não existem.

Eu estou desde 6°F pensando em uma forma de criar uma macro para o compilador entender, mais não estou conseguindo..

Seria +/- isto aqui.

#define set_bit(param1,param2) (param1 | ( 1 << param2))

Set_bit = param1 OR 1 << * param2.

Set_bit(LATD,7) =
LATD | (1 << 7).

é possivel isto em C ?


é, mas não do jeito que vc quer

olhe eu faço assim:

#define test_bit(var, bit) ((var) & (1 <<(bit)))
#define set_bit(var, bit) ((var) |= (1 << (bit)))
#define clear_bit(var, bit) ((var) &= ~(1 << (bit)))
#define BIT(n) (1 << (n))


para usar, exemplo:

char n;

if ( test_bit(n,6) ) { // testo o bit 6 da variável n
// se o bit for 1, zero
clear_bit(n,6);
} else {
// se o bit for 0, eu seto
set_bit ( n,6 );
}


essa macro faz as operações lógicas .
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor ffcprog » 22 Dez 2008 09:34

Bem eu estava no caminho correto então..
#define set_bit(param1,param2) (param1 |= ( 1 << param2))
#define clr_bit(param1,param2) (param1 &= ~( 1 << param2))

Estava faltando apenas o "~" para complemente em 255 & "0 para bit"

Muito obrigado Rodrigo.

Vlw
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor ffcprog » 23 Dez 2008 10:57

Amigos, boa tarde.
Ja perguntei isto antes, e não consegui me explicar por isto não consegui a ajuda que eu esperava.
Agora eu tenho a aplicação necessaria para que eu possa entender.
Struct e union.

Observe o array.
char dados_out[4];

descritivo.
dados_out[0]; = id
dados_out[1]; = buttons
dados_out[2]; = ad1
dados_out[3]; = ad2

buttons deve ter uma struct para acesso apenas aos bits 5,6,7.

sctruct{
esquerda : 1 ;
direita : 1 ;
stop : 1 ;
sem_uso : 5 ;
}selecao;

Pergunta.

Como utilizar o union de forma a acessar apenas o byte 1 da array?

Sei que eu poderia simplesmente.
char data;
data.FX ...
...
dados_out[1] = data;

Mais eu gostaria de aprender a utilizar o union por causa da organização e economia de ram..

Obrigado.

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor chipselect » 23 Dez 2008 12:00

Não pode ser assim?


typedef struct{
unsigned char esquerda : 1 ;
unsigned char direita : 1 ;
unsigned char stop : 1 ;
unsigned char sem_uso : 5 ;
}TSelecao;

typedef union {
TSelecao selecao;
unsigned char raw;
} TPrimeiroByte;

typedef struct {
TPrimeiroByte primeiroByte;
unsigned char demaisBytes[2];
} TDado;

//uso
...
TDado variavel;
variavel.primeiroByte.selecao.esquerda = 1;
variavel.primeiroByte.raw =0xff;
variavel.demaisBytes[0] = 0xff;
variavel.demaisBytes[1] = 0xff;

Testa e vê se funciona da forma que vc quer...
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor RobL » 26 Dez 2008 14:28

Veja nesse exemplo uma estrutura está definida dentro de uma uniao. Na memória prevelece o maior número de bits usado na uniao.
Código: Selecionar todos
union controle
{
   unsigned int Flag
   sctruct{
   esquerda : 1 ;
   direita : 1 ;
   stop : 1 ;
   sem_uso : 5 ;
   }selecao;
}controle;

acesso (uso):

...ptr->controle.selecao.esquerda
...ptr->controle.selecao.stop

como um todo:

...ptr->controle.flag = 0 (atua sobre o byte como um todo)

Desta forma ocupará somente um byte (com somente 8 bits).
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56


Voltar para PIC

Quem está online

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

x