TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: DarkVect 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!!
-
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))
}
-
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
-
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!!
-
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
-
OK!! Voy a probarlo y os cuento.