collapse

* Links de Robótica

* Posts Recentes

Medir Agua que está no Poço por filjoa
[Ontem às 20:58]


URGENTE - display de 7 segmentos com backpack por helderjsd
[20 de Setembro de 2017, 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[19 de Setembro de 2017, 10:20]


Palavras Cruzadas por Njay
[19 de Setembro de 2017, 02:24]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]

Autor Tópico: While loop  (Lida 1060 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline sanosuke_kursch

  • Mini Robot
  • *
  • Mensagens: 34
While loop
« 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?

Offline VascoP

  • Mini Robot
  • *
  • Mensagens: 66
Re: While loop
« Responder #1 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.

Offline sanosuke_kursch

  • Mini Robot
  • *
  • Mensagens: 34
Re: While loop
« Responder #2 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 ^^

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.390
  • Helpdesk do sitio
Re: While loop
« Responder #3 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.
Avr fanboy

Offline sanosuke_kursch

  • Mini Robot
  • *
  • Mensagens: 34
Re: While loop
« Responder #4 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?