De volta ao "C"

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

De volta ao "C"

Mensagempor brasilma » 17 Jul 2008 23:23

Desculpem minha "gonorância", estou tentando fazer um or entre uma contante e uma variável local e atribuir o resultado a uma variável Global, porem o compilador está apresentando a linha de erro abaixo, alguém pode me dizer porque?


../AVRGLCD.c:212: error: expected expression before '=' token


#define GLCD_X_ADDR = 0xB8

void glcd_data (uint8_t);

void GLCD_CLEAR (void)
{
uint8_t base_X;
uint8_t base_Y;

glcd_data = GLCD_X_ADDR || base_X; << erro

}

Abraços.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor lucaszampar » 18 Jul 2008 01:59

é operação lógica bit a bit?

tenta:
glcd_data = (GLCD_X_ADDR | base_X)
Avatar do usuário
lucaszampar
Byte
 
Mensagens: 105
Registrado em: 11 Out 2006 22:30
Localização: Limeira - SP

Mensagempor barboza » 18 Jul 2008 07:43

Brasilma!

glcd_data é uma função que recebe um parâmetro e não uma variável global.
E como o amigo disse, or bit a bit é |, se for operação lógica ||.

Neste caso seria:

glcd_data(GLCD_X_ADDR | base_X);



Agora se era pra ser uma variável global, a declaração esta errada.

void glcd_data (uint8_t);
para
uint8_t glcd_data;
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor brasilma » 18 Jul 2008 08:13

Obrigado pela ajuda Lucas e Barboza, sei que é simples para vocês, mas estou aprendendo muito.

Com uma bobeirinha destas aprendi várias coisas.

Com mais testes agora cedo, descobri que o que está causando o problema é a constante "GLCD_X_ADDR", se fizer a operação com outra variável qualquer (com ou sem parenteses) compila sem problemas.

Vou fazer mais algumas experiências, procurar uns exemplos e assim que resolver volto aqui.

Grande Abraço.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor barboza » 18 Jul 2008 08:39

Oi Brasilma,

Vendo novamente seu post e o comentario do problema com a constante, vi que ela foi declarada errada também.

#define GLCD_X_ADDR = 0xB8

Não tem o sinal de igual.


#define GLCD_X_ADDR (0xB8)
Editado pela última vez por barboza em 18 Jul 2008 09:24, em um total de 1 vez.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor xultz » 18 Jul 2008 08:53

Eu achei esquisito isso:
glcd_data = GLCD_X_ADDR || base_X; << erro

Não seria algo do tipo
glcd_data = (GLCD_X_ADDR || base_X) << erro;
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor brasilma » 18 Jul 2008 09:06

Olá Xultz,

Para mim que está começando tudo é esquisito, rs, rs

Porem o compilador aceita com ou sem os parenteses (isto não significa que ele irá executar o que imagino que ele deveria fazer, mas pelo menos erro não dá, rs, rs :D ).

O erro ocorre por causa da constante que estou incluindo na operação GLCD_X_ADDR.

Abraços.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor Maurício » 18 Jul 2008 12:56

Salve, brasilma!

As dicas estão corretas. Ponto e vírgula finaliza um comando no C, então, se a sua expressão tem que deslocar bits pra esquerda, a codificação que o xultz citou é a correta. Se bem que, dependendo das precedências, talvez nem os parênteses sejam necessários. Precisa ver o mapa de precedências.

Seu problema maior é como o barboza citou, sinal de igualdade no DEFINE.

O correto é como ele citou ou então, não precisa nem dos parênteses:

Código: Selecionar todos
#define GLCD_X_ADDR 0xB8


É só tirar o sinal de igual. O espaço em branco, entre a macro e a atribuição, é que define o valor da macro.

Vendo agora, tem mais alguns problemas tb, ehehehehehee

Código: Selecionar todos
#define GLCD_X_ADDR = 0xB8

void glcd_data (uint8_t);  // AQUI VC DEFINE UM PARÂMETRO DE ENTRADA, MAS, NÃO ESPECIFA O NOME DA VARIÁVEL!

void GLCD_CLEAR (void)
{
uint8_t base_X;
uint8_t base_Y;

glcd_data = GLCD_X_ADDR || base_X; << erro

}


E, afinal, glcd_data é uma variável ou é uma função?
Se for uma função, vai devolver algum dado?

Se glcd_data for uma variável, a declaração poderia ser:

Código: Selecionar todos
unsigned char glcd_data;


Quem é a variável global? Diz aí!

Se vc for fazer uma função pra calcular esse parâmetro, e ele for usado em somente um processo, o melhor a fazer é uma função que devolva esse parâmetro, não usar uma variável global.
Vc usa somente dentro da função que utiliza o dado, e depois da função executada, a memória usada é liberada.

[]'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

Re: De volta ao "C"

Mensagempor Maurício » 18 Jul 2008 13:12

brasilma escreveu:
Código: Selecionar todos
glcd_data = GLCD_X_ADDR || base_X;  << erro


Ah! Agora que eu entendí!
Isso daí é pra marcar o lugar em que está dando erro, não é isso? ehehehehehehe

Quando for assim, coloca dupla barra antes, pra gente saber que a partir dalí é um comentário!!! kkkkkkkkkkkkkkkkkk

Código: Selecionar todos
glcd_data = GLCD_X_ADDR || base_X;  // << erro


Esquece do assembler, cara! Mudou a filosofia! ehehehehehehehe
Pra bem melhor!

[]'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 xultz » 18 Jul 2008 13:27

Aaaaaaaaaaaaaaaaaaaaaahhh!!! Agora sim! :)
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor Jorge_Francisco » 18 Jul 2008 15:20

Mas no lugar de || não deveria ser |?
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor Maurício » 18 Jul 2008 22:06

E o Jorge está certo!

No lugar de dupla barra, pra fazer a operação OR, é uma barra só!

[]'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


Voltar para AVR

Quem está online

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

x