LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: Tyran em 13 de Agosto de 2009, 16:11

Título: estranho...
Enviado por: Tyran em 13 de Agosto de 2009, 16:11
Código: [Seleccione]
for ( i=0; i<11; i++)
{
      ....

 if (i==10) break;     /* sem isto não sai do ciclo :S */
}

Está-me a acontecer isso, mt estranho...
Título: Re:estranho...
Enviado por: ricardo-reis em 13 de Agosto de 2009, 16:29
tem k saír.. n precisa do break..

mostra mais do código..
Título: Re:estranho...
Enviado por: Tyran em 13 de Agosto de 2009, 16:57
Pois sair devia pois devia, mas não está a sair....

estive a analisar o ficheiro lst mas infelizmente não percebo muito de assembly para avr... vou tentar fazer upload do hexadecimal dado pelo avr studio porque o lst desse está muito bem comentado com o assembly em baixo do c e pelo que estive a ver está a fazer a comparação de saída bem...

o código meto já, instalei o 7 e ainda estou a tentar aceder ao pc... senão passo para um pen lol
Título: Re:estranho...
Enviado por: microbyte em 13 de Agosto de 2009, 17:22
Sim, mostra aí o código todo ;)
Queremos perceber porque dizes que ele não está a saír. O erro pode não estar aí...
Título: Re:estranho...
Enviado por: Tyran em 13 de Agosto de 2009, 17:44
Código: [Seleccione]
uint8_t checkSum;

const char message[] = "TiagoCastro";

uint8_t i;

DDRA |= _BV(6);
for ( i=0; i<11; i++)
{
/* grrr */
RF12_send( message[i]);
checkSum+=message[i];
if (i==10)
break;
}
PORTA |= _BV(6);

Como podem ver tenho um led no pina6 para saber quando sai do for... e sem o if (i==10) break; não sai.
Título: Re:estranho...
Enviado por: ricardo-reis em 13 de Agosto de 2009, 17:47
uh? tão mas tás a programar em k, afinal?

EDIT: de qualquer forma, há uma coisa k n percebo.. tás a somar ao checksum (que é um inteiro) um caracter?? qual é a ideia?

EDIT 2: tenta pôr um delay dps de ligares o tal led.. (não percebo como o tás a fazer, mas deve ter a ver com a linguagem..)
Título: Re:estranho...
Enviado por: TigPT em 13 de Agosto de 2009, 17:59
Também sou da opinião que o ciclo está ok, não estou a ver o que possa estar a causar essa situação.
Título: Re:estranho...
Enviado por: Tyran em 13 de Agosto de 2009, 18:07
Em quê como? Aquilo tá em c...

É igual.... alias não, para ser igual teria de ser unsigned char, aquilo também é só uma soma desde que do outro lado seja feita com os tipos levados em consideração até podia ser feita para bits lol

Mas pois, não percebo o que causará, talvez seja algum bug do gcc...

EDIT: oh afinal estava era a ver o ficheiro lss quando tem de ser no lst lol, vou ver então se noto algo
Título: Re:estranho...
Enviado por: ricardo-reis em 13 de Agosto de 2009, 18:09
já me explicaram k é c arduino com bocados de baixo nível..

já meteste aí o delay dps d'accionar o led, pra ver se ele lá passa ou n?..
Título: Re:estranho...
Enviado por: TigPT em 13 de Agosto de 2009, 18:10
Nada como submeter a questão a quem poderá resolver: http://gcc.gnu.org/ ;)
Título: Re:estranho...
Enviado por: Njay em 13 de Agosto de 2009, 19:23
e se comentares a linha "RF12_send...", e sem o if().. break, já pára?
Título: Re:estranho...
Enviado por: Tyran em 13 de Agosto de 2009, 19:52
Não...

TigPT vou ver isso quando vier de jantar :)

Também não perdi mt tempo por aqui nisto ainda porque estive a fazer as malas lol mas ao fim de jantar vou ver se descubro, tmb so tenho isso pk depois vou uma semanica de férias lol se já tivesse o avr isp ainda podia perder uns minutinhos por dia da próxima semana :P

EDIT: se ficar assim:
Código: [Seleccione]
for ( i=0; i<11; i++)
{
/* grrr */
RF12_send( 'T');
checkSum+='T';
}
funciona, pelo que o problema estará no message ?? mas ele envia bem os caracteres até certo ponto mesmo assim...
Título: Re:estranho...
Enviado por: inmotion.pt em 14 de Agosto de 2009, 05:19
Bom dia TYran

Sem poder afirmar mais, a minha suspeita é que poderá ser problema de memória RAM. O GCC não consegue antecipar quanta memória será utilizada por uma função pelo que se for necessário mais RAM do que a disponível poderá acontecer um override nalgumas posições. É só uma suspeita minha e pode até nem ser esse o caso.

Existe uma rotina para poder determinar o tamanho da RAM que está disponível no micro e se conseguires incluir este código poderá dar uma luz sobre este problema. Se não for, aqui fica uma receita para saber a quantidade de RAM disponível Podes sempre fazer o Hello World com o ciclo for e piscar um LED até completar o ciclo. Se desta forma funcionar é melhor mesmo fazer um report ao ppl do GCC. Espero que ajude :)

Código: [Seleccione]
// taken from http://forum.pololu.com/viewtopic.php?f=10&t=989#p4218
// modified to run on new Arduino IDE.

extern int __bss_end;
extern void *__brkval;

int get_free_memory()
{
  int free_memory;

  if((int)__brkval == 0)
    free_memory = ((int)&free_memory) - ((int)&__bss_end);
  else
    free_memory = ((int)&free_memory) - ((int)__brkval);

  return free_memory;
}

Boas férias se for esse o caso.
Filipe Valpereiro

http://inmotion.pt (http://inmotion.pt)
Título: Re:estranho...
Enviado por: Njay em 14 de Agosto de 2009, 09:26
Mete o teu programa no simulador (AVR Studio da ATMEL, download gratuito) e faz debug passo a passo (abre o ficheiro .ELF), olhando para as variáveis a ver o que tá a acontecer. Esse código só por si não tem nenhum problema.

p.s. "c arduino" não existe, o arduino é programado em C, com uns pózinhos de C++.
Título: Re:estranho...
Enviado por: ricardo-reis em 14 de Agosto de 2009, 12:08
n precisa de existir pra eu lhe chamar c arduino.. é a minha definição pra essa 'mistela' entre c e c++.. tu chamas-lhe pózinhos, eu chamo c arduino.. :P