Autor Tema: Cómo interrumpir un bucle del Main desde una interrupción?  (Leído 1637 veces)

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

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Cómo interrumpir un bucle del Main desde una interrupción?
« en: 19 de Julio de 2007, 06:54:03 »
Pués eso... tengo en el main una secuencia bastante larga de operaciones que se realizan de forma consecutiva y desearía tener un botón PAUSE que al pulsarlo ejecute en su interrupción asociada algún tipo de sentencia que me pare la secuencia del main en el punto en el que está. Y que al volverlo a pulsar (CONTINUE) siga por donde iva.

He pensado en ir colocando banderas cada cierto número de líneas de código y que al pulsar el botón active el flag y el código se pare ahí, pero no me termina de convencer. Se os ocurre alguna otra forma u estructura?

Mil gracias!!

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Cómo interrumpir un bucle del Main desde una interrupción?
« Respuesta #1 en: 19 de Julio de 2007, 09:08:45 »
Me parece que en el main tenés que ir poniendo puntos en los cuales preguntes por una variable "pausa" y si es true se quede en una función do{ nada...}while pausa. 

NOTA: Aunque si usas un micro que tiene interrupciones con prioridades y pausa y arranque son dos botones diferentes se puede poner el boton de arranque en una interrupción de mayor prioridad para que interrumpa a pausa. siendo pausa() un cilo do{ nada...}while parado. y siendo arranque() parado=0;

Podés poner un botón tipo switch que al presionarse quede hundido (1) y al volver a presionarse se libere (0)...
ahí usas esto en la interupción:

INT EXT
void pausa()
{
delay_ms(50);
do{ nada...}while (input(PIN_B0))
}


« Última modificación: 19 de Julio de 2007, 09:14:49 por Menta »
     

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Cómo interrumpir un bucle del Main desde una interrupción?
« Respuesta #2 en: 19 de Julio de 2007, 14:55:34 »
DarkVect, quieres que se detenga de inmediato? o que se detenga al menos en ciertos puntos?

Si es 'de inmediato' creo que la solución es bastante simple y consiste en activar la interrupción y luego no retornar de ella hasta que vuelva a pulsar la tecla...

Y la opción de detener en ciertos puntos, con un flag auxiliar como te han sugerido y has intuido

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Cómo interrumpir un bucle del Main desde una interrupción?
« Respuesta #3 en: 19 de Julio de 2007, 15:59:45 »
Ok, Maunix. Entonces podría poner un bucle while dentro de la propia interrupción del botón y dejarlo ahí hasta una nueva pulsación. Una pregunta sobre quedarme ahí detenido: el código del Main está claro que no se ejecuta, pero el de interrupción del timer, se ejecutaría?

Lo digo porque con el timer controlo un led que en PAUSA debe parpadear cada medio segundo o así. El PIC será 16F sin prioridad de interrupciones.

Gracias!!

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Cómo interrumpir un bucle del Main desde una interrupción?
« Respuesta #4 en: 20 de Julio de 2007, 08:45:28 »
Ok, Maunix. Entonces podría poner un bucle while dentro de la propia interrupción del botón y dejarlo ahí hasta una nueva pulsación. Una pregunta sobre quedarme ahí detenido: el código del Main está claro que no se ejecuta, pero el de interrupción del timer, se ejecutaría?

Lo digo porque con el timer controlo un led que en PAUSA debe parpadear cada medio segundo o así. El PIC será 16F sin prioridad de interrupciones.

Gracias!!

Dentro del vector de interrupción puedes hacer una función que haga ese loop con el led y que busque la tecla.

Al encontrar la tecla, haces el retorno de interrupción.

Lo que se sigue activando es el flag del timer aunque en esta ocasión el ProgramCounter no volverá a saltar a la posición del vector de interrupción porque el GIE queda deshabilitado.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Cómo interrumpir un bucle del Main desde una interrupción?
« Respuesta #5 en: 20 de Julio de 2007, 18:50:48 »
OK!! Voy a probarlo y os cuento.