LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: sanosuke_kursch em 12 de Outubro de 2010, 02:19

Título: While loop
Enviado por: sanosuke_kursch em 12 de Outubro de 2010, 02:19
Boa noite pessoal o
Estou tendo um problema com um código no meu arduino (além de problemas pra fazer o upload do código).
A idéia é usar uma matriz de leds bicolores pra fazer um jogo de "pega-pega", no  qual o objetivo (um tanto quanto óbvio) é "pegar" um led (verde no caso) que é aceso num ponto aleatério da matrix, com o led controlado pelo usuário (que é vermelho), e depois disso o led verde é mudado pra outro ponto da matrix, mas é aí que está o problema, sempre que o led vermelho cruza com a coluna ou a fileira que está o led verde, este já muda de posição, quando era pra mudar só depois que a coluna e a fileira fossem a mesma dos dois pontos.
O código é esse:
Código: [Seleccione]
int const ROW[8] = {45,43,41,39,37,35,33,31};
int const COLG[8] = {30,32,34,36,38,40,42,44};
int const COLR[8] = {46,48,50,52,53,51,49,47};
int X = A0;
int Y = A1;
int xval;
int yval;
int randx;
int randy;

 void setup()
 {
   for (int thisPin = 0; thisPin < 8; thisPin++)
   {
     pinMode(ROW[thisPin], OUTPUT);
     pinMode(COLG[thisPin], OUTPUT);
     pinMode(COLR[thisPin], OUTPUT);
     digitalWrite(COLG[thisPin], HIGH);
     digitalWrite(COLR[thisPin], HIGH);
   }
 }
 
 void loop()
 {
   randx = random(8);
   randy = random(8);
   xval = analogRead(X);
   yval = analogRead(Y);
   xval = map(xval, 0, 1023, 0, 7);
   yval = map(yval, 0, 1023, 0, 7);
   while(xval != randx && yval != randy)
   {
     xval = analogRead(X);
     yval = analogRead(Y);
     xval = map(xval, 0, 1023, 0, 7);
     yval = map(yval, 0, 1023, 0, 7);
     digitalWrite(ROW[randx], HIGH);
     digitalWrite(COLG[randy], LOW);
     delay(1);
     digitalWrite(ROW[randx], LOW);
     digitalWrite(COLG[randy], HIGH);
     delay(1);
     digitalWrite(ROW[xval], HIGH);
     digitalWrite(COLR[yval], LOW);
     delay(1);
     digitalWrite(ROW[xval], LOW);
     digitalWrite(COLR[yval], HIGH);
     delay(1);
   } 
   digitalWrite(ROW[randx], HIGH);
   digitalWrite(COLG[randy], LOW);
   delay(1);
   digitalWrite(ROW[randx], LOW);
   digitalWrite(COLG[randy], HIGH);
   delay(1);
   digitalWrite(ROW[xval], HIGH);
   digitalWrite(COLR[yval], LOW);
   delay(1);
   digitalWrite(ROW[xval], LOW);
   digitalWrite(COLR[yval], HIGH);
   delay(1);
 }

Eu suspeito que o problema esteja no operador &&, mas não tenho certeza, os meus conhecimentos de C/C++ são muito restritos, portanto estou tendo dificuldades com o debug do código, se alguma alma caridosa puder me dar uma ajuda eu ficaria extremamente grato ^^.

P.S.: Também estou tendo problemas pra fazer o upload do código pro arduino, dependendo do programa que estiver correndo nele, eu tenho que fazer o reset da placa manualmente, e torcer pra acertar o timing, senão eu não consigo fazer o upload do código, o erro é esse:
avrdude: stk500_recv(): programmer is not responding
e eu estou usando o ubuntu 10.04 aqui, alguma idéia?
Título: Re: While loop
Enviado por: VascoP em 12 de Outubro de 2010, 07:33
Enquanto xval for diferente de randx e yval diferente de randy o while é executado. Basta um ser igual para a tua condição falhar. Se queres que ele apenas não execute no caso de ambas as igualdades se verificarem o correcto é dizer, enquanto ou xval for diferente de randx ou yval for diferente de randy. Operador || portanto.

Quanto ao programador, não sei.
Título: Re: While loop
Enviado por: sanosuke_kursch em 12 de Outubro de 2010, 12:44
Operador || portanto.

Pois é, resolveu, o estranho é que segundo a referência do próprio site do arduino o operador era &&.
Citar
&& (logical and)
True only if both operands are true, e.g.

Que misterioso...
Anyway, muito obrigado pelo esclarecimento ^^
Título: Re: While loop
Enviado por: senso em 12 de Outubro de 2010, 13:07
Porque um AND é o mesmo que uma multiplicação por isso quando um dos valores passa a 0, 0*1 é 0 e portanto o while deixa de ser executado, estas coisas da lógica por vezes são estranhas mas são mesmo assim.
Título: Re: While loop
Enviado por: sanosuke_kursch em 12 de Outubro de 2010, 13:21
Pois é, já vi que vou ter que estudar mais C++.
Bom, aproveitando o tópico e mudando de assunto, alguém conhece uma escola chamada Formabase? Andei dando uma olhada no site deles e vi que eles tem curso de C++, alguém sabe se a escola e o curso são bons?