Ejecución de programa alterno

Hola buenos días, tardes o noches según sea, este es mi primer post y me gustaría que me ayudaran respecto a un problema que no puedo darle solución.
Mi trabajo es el siguiente, con un PIC18F4550 estoy controlando unos cilindros mediante un modulo de relevadores y estos siguen una secuencia, hasta aquí todo bien, la secuencia se cumple al pie de la letra, pero mi problema es que tengo un botón en el RB0 que al ser presionado el programa se detiene y cuando el botón de inicio (RA0) se vuelva a presionar el programa comience desde donde se hizo el paro.
Botón de inicio de la secuencia en RA0.
PIC18F4550.
Botón de paro en RB0.
Programación en PIC C Compiler.
Los "CILINDROS" A y C de inicio están encendidos.
CCS C Compiler 08_03_2020 11_10_41 p. m..pngCCS C Compiler 08_03_2020 11_10_47 p. m..pngMEZCLADORA - Proteus 8 Professional - Schematic Capture 08_03_2020 11_11_00 p. m..png
 

capitanp

Miembro irreconocible
usaria la funcion de interrupcion
 
Dentro del while(), lo primero que haces es comprobar si se pulsó el botón de parada. Si es así, pones una variable de paro a verdadero.
Luego compruebas si se pulsó el botón de continuar, si es así, pones la variable de paro a falso.
Finalmente, compruebas el valor de la variable de paro. Si es falsa, ejecutas el resto del código.
 

D@rkbytes

Moderador
En PIC C Compiler de CCS es muy sencillo usar interrupciones.

Ejemplo base:
C:
#include <18F4550.h>
#device HIGH_INTS = TRUE    // Habilitar alta prioridad en interrupciones.
#fuses NOFCMEN, NOIESO, NOVREGEN
#use delay (CRYSTAL = 20 MHz, CLOCK = 20 MHz)

int1 flag_rb0 = 0;

#INT_EXT high    // Dar alta prioridad a la interrupción externa por RB0
void sdi_externa_rb0 (void)
{
    flag_rb0 = 1;    // Indicar que ocurrió una interrupción externa por RB0
}

void main (void)
{
    enable_interrupts(INT_EXT);    // Habilitar interrupción externa por RB0
    ext_int_edge(L_TO_H);        // Activar la interrupción de RB0 por flanco de subida.
    enable_interrupts(GLOBAL);    // Habilitar las interrupciones.
   
    while (TRUE)
    {
        if (flag_rb0)        // Si "flag_rb0" está en 1
        {
            // Código
            flag_rb0 = 0;    // Regresar "flag_rb0" a 0
        }
    }
}
La bandera "flag_rb0" la debes leer dentro de cada rutina y si está en 1 rediriges el programa a la rutina de paro, por ejemplo.
Para saber en qué parte del programa se hizo el paro puedes usar otras banderas que pondrás a 1 cuando se esté ejecutando la rutina y las demás las pones a 0
Al iniciar el programa lees el estado de las banderas y diriges el programa a esa rutina.
 

Arriba