Como salir de una estructura "for"

Primero que nada un saludo cordial a todos los colegas.

Luego de pasar toda la tarde de solucionar mi problema recurro a este excelente foro.

Mi duda es que no eh podido salir de una estructura "For" dentro de un case, para dar más detalle publico el código fuente

Mi objetivo era hacer una serie de secuencias de luces y que vayan cambiando cuando el pic reciba un pulso bajo. Eh utilizado el Puerto A y B para 13 leds y ya eh habilitado el MCLR y OSC1 y OSC2 como E/S

Al recibir el primer pulso la secuencia se ejecuta pero al recibir el 2do o 3ero o 4to pulso la secuencia del 1ero sigue corriendo. Los siguientes casos a modo de ejemplo solo encienden un led.

PD: Eh recortado las sentencias porque es demasiado largo, pero publico lo necesario

////PIC16F88////

Código:
 void main(){ 
 int i=0;

   setup_oscillator(OSC_8MHZ|OSC_INTRC); 
   set_tris_b(0x00);           	
   set_tris_a(0xE0);
   output_b(0x00);            
   output_a(0x00); 	
  disable_interrupts(GLOBAL); 

  while(true)                       // Bucle infinito. True = 1
    {

if(!input(pin_A7))   
{
delay_ms(30);
switch(i%5){ 

case 0:

for(;;){
output_high(PIN_A0);
delay_ms(80);

output_high(PIN_A0);
output_high(PIN_A1);
delay_ms(80);

output_high(PIN_A0);
output_high(PIN_A1);
output_high(PIN_A2);
delay_ms(80);

output_high(PIN_A0);
output_high(PIN_A1);
output_high(PIN_A2);
output_high(PIN_A3);
delay_ms(80);

.
.
.
output_high(PIN_A0);
output_high(PIN_A1);
output_low(PIN_A2);
delay_ms(80);

output_high(PIN_A0);
output_low(PIN_A1);
delay_ms(80); 
} 
break;

case 1:
output_toggle(pin_b1);
while(!input(pin_A7));	
break;

case 2:
output_toggle(pin_b2);
while(!input(pin_A7));	
break;

case 3:
output_toggle(pin_b3);
while(!input(pin_A7));	
break;

case 4:
output_toggle(pin_b4);
while(!input(pin_A7));	
break;
}
i++;
}
}
}


Espero haya quedado claro y muchas gracias :)
 
Hola. Primero te respondo lo del bucle for. Del bucle for se sale al finalizar la iteracion o rompiendola con un break. Si lo que queres hacer es que ante un pulso bajo en una entrada cambie la secuencia deberias usar interrupciones para alivianar la tarea del micro. En segundo lugar no te convendria utilizar asi la variable i ya que se te va a desbordar. Por ultimo el ciclo for del primer case no iria. Saludos
 
Última edición:
HOla loco91 investigué sobre interrupciones y recogí esta idea :

Si quiero hacer unas 3 secuencias:

Interrupción externa:
{
secuencia++;
secuencia = 3? // pregunta si la secuencia es igual a 3
Si-> secuencia = 0; // si es asi la secuencia regresa a 0
}

Función principal:
{
Inicio:
secuencia = 0?
Si -> Ejecutar rutina 1;
Ir a Inicio;

secuencia = 1?
Si -> Ejecutar rutina 2;
Ir a Inicio;

secuencia = 2?
Si -> Ejecutar rutina 3;
Ir a Inicio;
}

Mi pregunta viene a ser, cómo es que haré la declaración de <secuencia> en "interrupcion externa" y "función principal"
 
Hola. Lo que podes hacer es crear una funcion ejecutarSecuencia() de esta manera.
Código:
void ejecutarSecuencia(int numeroSecuencia){
    switch(numeroSecuencia){
        case 1: ...; break;
        case 2: ...; break;
        case 3: ...; 
    }
}

luego en la funcion de interrupcion
Código:
void interrupcion(){
    if(secuencia==n){   //donde n seria la ultima secuencia
      secuencia=0;   //como la ultima secuencia ya se ejecuto en la interrupcion anterior reinicio variable
    }
    secuencia++;  //cada que se llama a la funcion de interrupcion incremento secuencia
                          //notar que la primera secuencia a ejecutar va a ser la 1
    ejecutarSecuencia(secuencia);//ejecuto la secuencia, como parametro paso el numero de secuencia
    
}

ovbiamente la variable secuencia es una variable global inicializada en 0.
Lo que te quedaria es bloquear las interrupciones mientras se este ejecutando una interrupcion.
 
Última edición:
Atrás
Arriba