Mejora de código con interrupciones y for

Hola.

Queria pedir consejo para mejorar el código siguiente. Las variables "fallo" y "fin" se inicializan a 0 y se ponen a 1 si sucede algo que debe detener el programa (se obtienen de dos rutinas de interrupción asociadas a los pines 2 y 3 típicos de Arduino Uno). Lo que quiero es que salga del for inmediatamente. Yo lo he hecho como se muestra pero seguro que conoceis alguna manera más correcta:

for (int i = 0; i < 256; i++) 
 {
   if (fallo || fin) break;
   digitalWrite(Motor_1, HIGH);
   digitalWrite(Motor_2, LOW);
   digitalWrite(Motor_3, LOW);
   digitalWrite(Motor_4, LOW);
   delay(20);

   if (fallo || fin) break;
   digitalWrite(Motor_1, LOW);
   digitalWrite(Motor_2, HIGH);
   digitalWrite(Motor_3, LOW);
   digitalWrite(Motor_4, LOW);
   delay(20);

   if (fallo || fin) break; 
   digitalWrite(Motor_1, LOW);
   digitalWrite(Motor_2, LOW);
   digitalWrite(Motor_3, HIGH);
   digitalWrite(Motor_4, LOW);
   delay(20);
 }

Piensa, ...

Si el fallo o el fin suceden al segundo 1 de haber activado un motor, tu programa estará 19 segundos intentando mover ese motor

Todo esto que has hecho esta mal planteado.

Y como no explicas que buscas ni envías todo el código, los lectores hemos de imaginar

Puedes mejorar haciendo una subrutina de apagar todos los motores, con esto te ahorras muchas lineas en el for

La subrutina de las interrupciones ya puede apagar los motores.

Puede que te interese que el contador en vez de declararlo en el for, lo declaras como global y las interrupciones ya lo pueden situar mas allá del limite máximo.

Casi nunca es bueno el uso de delay() y menos si te atreves con interrupciones.

Normalmente si hay una fallo, el programa tiene que apagar todo, avisar y quedar en un bucle sin fin esperando a un operador humano, aunque puede ser que tu definición de fallo sea diferente a lo que significa fallo.

Espero haberte ayudado

jordi3sk97:
Piensa, ...

Si el fallo o el fin suceden al segundo 1 de haber activado un motor, tu programa estará 19 segundos intentando mover ese motor

Todo esto que has hecho esta mal planteado.

Y como no explicas que buscas ni envías todo el código, los lectores hemos de imaginar

Puedes mejorar haciendo una subrutina de apagar todos los motores, con esto te ahorras muchas lineas en el for

La subrutina de las interrupciones ya puede apagar los motores.

Puede que te interese que el contador en vez de declararlo en el for, lo declaras como global y las interrupciones ya lo pueden situar mas allá del limite máximo.

Casi nunca es bueno el uso de delay() y menos si te atreves con interrupciones.

Normalmente si hay una fallo, el programa tiene que apagar todo, avisar y quedar en un bucle sin fin esperando a un operador humano, aunque puede ser que tu definición de fallo sea diferente a lo que significa fallo.

Espero haberte ayudado

Gracias por responder.
Trataré de explicarme mejor debido a que la pregunta quizás es un poco filosófica:
Teniendo en cuenta que gracias a las interrupciones consigo pasar la variable fallo a 1 en cualquier momento del programa, estoy buscando la forma mas elegante posible de salir de un "for".
Dentro del "for" podria haber miles de lineas de código una detrás de otra y durante dicha ejecución del for se podria producir la interrupción comentada. Es por ello que no encuentro una forma elegante de salir de dicho for para llegar, por ejemplo, a un buble sin fin, como comentas.
Como veis yo he distribuido algunos "brakes" por todo el "for" pero muy elegante no me parece... :cold_sweat:

Hola, deberías leer esto:

Personalmente, prefiero un break que un goto, que por cierto, hace más de 30 años que no uso