collapse

* Posts Recentes

O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Emulador NES em ESP32 por dropes
[10 de Abril de 2024, 15:30]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: While loop  (Lida 2738 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.733
  • 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?