Go Down

Topic: Problema con && en un do... while (Read 1 time) previous topic - next topic

X-ELE

Tengo el siguiente codigo resumido....

Code: [Select]

// 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?


Regata

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));
Visita: http://www.tallerarduino.com

curro92

#2
Oct 03, 2011, 04:30 pm Last Edit: Oct 03, 2011, 04:32 pm by curro92 Reason: 1
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: [Select]

void loop()
{
 do{
 }while();
 
 do{
 }while();
 
 ROTURA:
}

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


SrDonGato

la declaracion de variables hazla fuera del loop()

X-ELE


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 ... :(


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: [Select]

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

Regata

#5
Oct 04, 2011, 12:03 pm Last Edit: Oct 04, 2011, 12:26 pm by Regata Reason: 1
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.
Visita: http://www.tallerarduino.com

fm

#6
Oct 04, 2011, 11:57 pm Last Edit: Oct 05, 2011, 12:53 am by fm Reason: 1
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.
   

SrDonGato

despues del while (condicion ) no debes poner ;

haces

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


mírate la referencia

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

fm

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? :-)
   

SrDonGato

#9
Oct 05, 2011, 02:05 am Last Edit: Oct 05, 2011, 02:08 am by SrDonGato Reason: 1
si quieres que la sentencia siguiente sea la unica que haga es

Code: [Select]

while(condicion)
hazesto;


si son varias lineas

Code: [Select]

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

X-ELE


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


exacto.. :D 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....

fm

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.
   

Jacinto54

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.



fm

@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
   

Jacinto54

Hola fm

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

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



Go Up