Autor Tema: Salir de bucles con interrupcion externa  (Leído 3371 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Tosbar

  • PIC10
  • *
  • Mensajes: 17
Salir de bucles con interrupcion externa
« en: 25 de Junio de 2009, 19:27:22 »
Que tal comunidad. Mucho me han ayudado en muchas ocasiones leyendo en los diferentes hilos del foro, lo cual les agradezco mucho. Sin embargo, esta vez no encuentro la forma.

Utilizo el 12F629. Estoy haciendo un programa que realiza diferentes secuencias. Estas secuencias las realizo con bucles para disminuir el codigo. Lo que quiero hacer es que mediante un boton vaya cambiando de seuencias.

Mediante una interrupción externa incremento una variable "secuencia".  El pseudo codigo sería algo así:

Código: [Seleccionar]
//EN LA INTERRUPCION EXTERNA INCREMENTO LA VARIABLE SECUENCIA
#INT_EXT
void boton(){
secuencia++; //Pongo el codigo simplificado aunque hay que poner antirrebotes y limite de secuencias.
}

void main(){
do{
 secuencias();
}while(true);
}

//ESTA SERIA LA SELECCIÓN DE LA SECUENCIA
void secuencias(){
switch(secuencia){
case 1:
SECUENCIA 1 CON BUCLES ANIDADOS
break;

case 2:
SECUENCIA 2 CON BUCLES ANIDADOS
break;

.
.
.

case n:
SECUENCIA N CON BUCLES ANIDADOS
break;
}
}

Esto ya lo tengo programado incluso armado en fierros (circuitos), las funciones corren bien, digamos que funciona "a medias". Porque debido a que las secuencias involucran bucles anidados, el programa "no se da cuenta" de que ya se incremento la variable secuencia. Y no es hasta que termina el bucle hasta que "se da cuenta" y entonces va a la siguiente secuencia.

Lo que yo busco es que independientemente donde este el programa, al presionar el boton, se interrumpa la secuencia que se este ejecutando. Es decir que se rompan los bucles que tengan que romperse y se vaya a la siguiente secuencia. Sin esperar a que termine la secuencia actual.

Tambien intente dentro de la interrupción vovler a llamar la funcion así:
Código: [Seleccionar]
#INT_EXT
void boton(){
secuencia++; //Pongo el codigo simplificado aunque hay que poner antirrebotes y limite de secuencias.
secuencias();
}
Pero tampoco lo he logrado. Espero puedan ayudarme, gracias de antemano. Saludos.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Salir de bucles con interrupcion externa
« Respuesta #1 en: 25 de Junio de 2009, 22:05:58 »
Coloca uno de los bucles, para ver si se puede utilizar alguna variable para escapar de ellos, o solo crea las secuencias con código no bloqueante, ósea solo con if.
No contesto mensajes privados, las consultas en el foro

Desconectado Tosbar

  • PIC10
  • *
  • Mensajes: 17
Re: Salir de bucles con interrupcion externa
« Respuesta #2 en: 26 de Junio de 2009, 12:17:07 »
Antes que nada, agradezco a Suky el atender mi pregunta.

Les comento mis avances y la solución que le di al problema.

En la interrupcion externa active una variable "presionado" que me indica cuando el boton fue presionado, además, incremento la variable de las secuencias. Ahora bien, dentro de los bucles (si es anidado en el mas interno para que se "de cuenta" mas rapido) checo "presionado". Si fue presionado entonces hago un "return()" esto rompe el bucle porque me saca inevitablemente de la función de la secuencias y regresa al main(). Pero dado que en el main() se vuelve a llamar a la funcion de las secuencias, y como ya fue cambiada la variable "secuencia", va a la siguiente secuencia  :mrgreen:.

Espero que alguien mas le sirva, saludos.

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: Salir de bucles con interrupcion externa
« Respuesta #3 en: 26 de Junio de 2009, 16:53:11 »
Antes que nada, agradezco a Suky el atender mi pregunta.

Les comento mis avances y la solución que le di al problema.

En la interrupcion externa active una variable "presionado" que me indica cuando el boton fue presionado, además, incremento la variable de las secuencias. Ahora bien, dentro de los bucles (si es anidado en el mas interno para que se "de cuenta" mas rapido) checo "presionado". Si fue presionado entonces hago un "return()" esto rompe el bucle porque me saca inevitablemente de la función de la secuencias y regresa al main(). Pero dado que en el main() se vuelve a llamar a la funcion de las secuencias, y como ya fue cambiada la variable "secuencia", va a la siguiente secuencia  :mrgreen:.

Espero que alguien mas le sirva, saludos.

muy bien resuelto! aunque si quieres salir de un bucle tendrias que colocar if(presionado==1) break; y automaticamente se sale del bucle...

no se porque tambien he tenido problemas manejando las interrupciones externas (B4-B7) en el 16f877a.... y me ha tocado hacer lo mismo que hace tosbar..

Desconectado Tosbar

  • PIC10
  • *
  • Mensajes: 17
Re: Salir de bucles con interrupcion externa
« Respuesta #4 en: 27 de Junio de 2009, 11:07:30 »
Citar
muy bien resuelto! aunque si quieres salir de un bucle tendrias que colocar if(presionado==1) break; y automaticamente se sale del bucle...

no se porque tambien he tenido problemas manejando las interrupciones externas (B4-B7) en el 16f877a.... y me ha tocado hacer lo mismo que hace tosbar..

Efectivamente fidodido18 se peude usar "break;" pero si es un bucle anidado el "break;" nos sacaria del bucle interno pero caeriamos al externo, y tendiramos que poner en ese externo nuevamente "if(presionado==1) break;". Por eso es que opté por usar return();, en el mas interno, porque de esta forma "rapidamente" nos saca por completo de la función.

Saludos  :)


 

anything