Pages: [1] 2   Go Down
Author Topic: Problema con && en un do... while  (Read 1580 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tengo el siguiente codigo resumido....

Code:
// Software de Arduino Duemilanove - Control
// Revision 16-07-2011
// Version 1.01
....


....
void loop(){

  //Declaracion de variables
  int cond1 = 0;
   
  int tiempo_inicial = 0;
  int tiempo1_carril1 = 0;
  int tiempo2_carril1 = 0;
  int tiempo3_carril1 = 0;
  int tiempo1_carril2 = 0;
  int tiempo2_carril2 = 0;
  int tiempo3_carril2 = 0;
  int tiempo_actual = 0;
 
  int sensor11 = 0;
  int sensor21 = 0;
  int sensor12 = 0;
  int sensor13 = 0;
  int sensor22 = 0;
  int sensor23 = 0;
 
  digitalWrite(estado , LOW);
 
  //Verificar la señal de inicio desde el Mini
 
  do{
 
    if(digitalRead(inicio) == 1){
   
      cond1 = 1;
     
    }
    else{
   
      cond1 = 0;
     
    }
   
  }while(cond1 == 0);
 
  //Inicio de la cuenta
 
  tiempo_inicial = millis();
 
  //Registro y muestra de tiempos parciales y finales
  do{
 
...

...
    //Tiempo final - Carril 1
    if(digitalRead(final1) == HIGH){
      sensor13 = 1;
      tiempo_actual = millis();
      tiempo3_carril1 = tiempo_actual - tiempo_inicial;
      muestraTiempo(tiempo3_carril1 , 0);
     
    }
    else{
      sensor13 = 0;
    }
   
    //Tiempo final - Carril 2
    if(digitalRead(final2) == HIGH){
      sensor23 = 1;
      tiempo_actual = millis();
      tiempo3_carril2 = tiempo_actual - tiempo_inicial;
      muestraTiempo(tiempo3_carril2 , 1);
     
    }
    else{
      sensor23 = 0;
    }
 
...

...

  }while(sensor13 == 1 && sensor23 == 1 ); //Finaliza bucle cuando ambos autos finalizaron
 
  ROTURA:
 
  delay(30000); //Demora hasta que el sistema queda listo para un nuevo inicio
 
  digitalWrite(estado , HIGH);
 
 
}


}


haciendo pruebas encontre q el && dentro del do.. while no funciona correctamente, funciona mas como un ||

obviamente estoy cambiando la sintaxis a ver si funciona, pero alguien le paso algo similar?

Logged

Foz- Lugo
Offline Offline
Newbie
*
Karma: 0
Posts: 48
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yo pondría entre parentésis los dos términos que compruebas si son iguales a 1 y en medio &&, quedando asi:

while((termino1==1) && (termino2==1));
Logged


Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 721
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,
Falta parte del código, y no lo puedo probar. De todas formas, creo que tienes una llave de cierre de más. ¿Te compila bien?
Code:
void loop()
{
  do{
  }while();
  
  do{
  }while();
  
  ROTURA:
}

} // <-----------------------
« Last Edit: October 03, 2011, 09:32:49 am by curro92 » Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 751
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la declaracion de variables hazla fuera del loop()
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yo pondría entre parentésis los dos términos que compruebas si son iguales a 1 y en medio &&, quedando asi:

while((termino1==1) && (termino2==1));

Lo probe no funciono ... smiley-sad

Hola,
Falta parte del código, y no lo puedo probar. De todas formas, creo que tienes una llave de cierre de más. ¿Te compila bien?
Code:
void loop()
{
  do{
  }while();
  
  do{
  }while();
  
  ROTURA:
}

} // <-----------------------


Si lo compila recorte parte del codigo por meros motivos de espacio, se ve q quedo una llave colgada...

la declaracion de variables hazla fuera del loop()


Esta hecha, pero luego necesito ecesito reiniciar las variables una vez q sale del do while

Gracias por las repsuestas estoy modificando para usar otro condicionador a ver que pasa
Logged

Foz- Lugo
Offline Offline
Newbie
*
Karma: 0
Posts: 48
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tal y como lo tienes deberia funcionar perfectamente, la única explicación que encuentro es que al llegar al while los sensores no esten a 1 y por tanto no se realice el do while, por lo demás me parece que está correcto el código.

PD: He probado un código que hice para Arduino y lo he simulado en ISIS (Proteus) y me funciona perfectamente && dentro del do while. Comprueba mediante consola serie el valor que tiene en cada momento las variables de los sensores, así vas depurando y te ahorras dolores de cabeza.
« Last Edit: October 04, 2011, 05:26:57 am by Regata » Logged


Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

El bucle lo que hace es: si los 2 valores de los sensores son 1 sigo iterando. Saldrá del bucle cuando uno sea 0 y el otro 1 o cuando los dos sean 0.
Si este no es el comportamiento que esperas (e.d. los sensores funcionan con lógica positiva), entonces cambia el bucle por:
while (!(sensor13 == 1 && sensor23 == 1));.

Si la detección la estás haciendo con algún dispositivo mecánico, entonces en posible que tengas problemas de rebotes. Escribe dentro del bucle código para eliminarlos.

Alguna cosilla que puedes simplificar:
do{
  
    if(digitalRead(inicio) == 1){
    
      cond1 = 1;
      
    }
    else{
    
      cond1 = 0;
      
    }
    
  }while(cond1 == 0);


Por: while (digitalRead(inicio) == LOW);

Hay más cosillas que se pueden simplificar.

Espero que sirva de algo.
« Last Edit: October 04, 2011, 05:53:18 pm by fm » Logged

   

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 751
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

despues del while (condicion ) no debes poner ;

haces

Code:
  }while(cond1 == 0);
 
  //Inicio de la cuenta
 

mírate la referencia

http://arduino.cc/en/Reference/While
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No es cierto lo del while. Un while sin llaves, ejecuta la siguiente línea de código dentro del bucle, uno con ; ejecuta un lazo cerrado hasta que se deje de cumplir la condición. Lo que esta usando es un bucle do-while y es perfectamente valido y correcto. Lo que creo es que lo esta usando como los bucles REPEAT-UNTIL de Ada, Pascal, modula2, ...

Por cierto, si estas midiendo tiempos el primer coche tiene ventaja sobre el segundo, no hagas trampas eh? :-)
Logged

   

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 751
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si quieres que la sentencia siguiente sea la unica que haga es

Code:
while(condicion)
hazesto;

si son varias lineas

Code:
while(condicion){
hazesto;
yesto;
tambienesto;
}

aunque la referencia deja claro que lo que hay dentro las llaves es lo que se considera en el while.
[/s]

Rectifico, no me di cuenta que es un do--while, erré en la sentencia
« Last Edit: October 04, 2011, 07:08:24 pm by SrDonGato » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Rectifico, no me di cuenta que es un do--while, erré en la sentencia

exacto.. smiley-grin gracias por tu tiempo igualmente...

Por cierto, si estas midiendo tiempos el primer coche tiene ventaja sobre el segundo, no hagas trampas eh? :-)

Exacto... es así, como piensas que se podría corregir eso, sin poner un modulo extra....
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Puedes minimizarlo pero no evitarlo. Para minimizarlo, puedes tomar el tiempo fuera del "if" y la impresión de tiempos después de las comprobaciones. No puedes hacer nada mas.
Logged

   

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola pido disculpas si este post no sale muy correctamente posicionado, en realidad pretendo dar una respuesta a X_ELE y a fm

Es mi primera participación en el foro y pido anticipadas disculpas por los errores de forma de foro.

En primer lugar.
  No es buen sistema implementar lecturas de pins dentro del programa, lo correcto seria hacer una lectura de pins al inicio de la rutina LOOP y la ultima instruccion de LOOP un volcado de valores a los pins de salida.

Otro comentario

do {
  if(digitalRead(inicio) == 1){
    cond1 = 1;
    } else{
    cond1 = 0;
   }
 }while(cond1 == 0);




es substituible por

  do {} while(digitalRead(inicio));

  A fin de cuentas esto es C

  Por otro lado, es extremadamente peligroso dejar el codigo en un bucle condicional, ya que pueden quedar desatendidas otras partes del sistema con consecuencias reales verdaderamente nefastas.

  Saludos de un nuevo participante.


Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Jacinto54
Un pequeño comentario, el bucle que has reemplazado no hace lo mismo que el original: en tu caso estas saliendo cuando la entrada discreta este a 0, mientras que el código original itera hasta que se ponga a 1. Por lo tanto, el bucle sustitutivo que propuse es equivalente.

Salu2
Logged

   

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola fm

 Tienes razon lo habia puesto mas bien como prueba de concepto, pero tiene facil arreglo

do {} while(!digitalRead(inicio));


Logged

Pages: [1] 2   Go Up
Jump to: