Si ya has visto y probado que el programa piensas que te funciona, voy a intentar explicarte el porque es muy correcto el hacerlo así:
Según está el funcionamiento es secuencial, es decir el micro ejecuta un bloque, cuando termina ese bloque empieza con el segundo, después el tercero y asi sucesivamente.
¿Pero que pasa al llegar a los delays? Exactamente lo mismo, el micro empieza a contar desde 0 hasta los 500msg. Pero esto es lo más importante. Se queda ahí y no hace otra cosa hasta que su cuenta llega al final y esto no es bueno, Te explico, imaginemos un caso real:
Tienes una máquina que hace un determinado proceso (poner en marcha un motr) que cuando recibe un 1 en su entrada y comienza su ciclo de parada, encendiendo y parando un motor. Piensa también que en vez de 500msg. tienes temporizaciones digamos de 1 minuto. Pues el motor se pondría en marcha durante ese minuto se pararía después durante otro minuto y así sucesivamente hasta que la entrada cambiase a nivel bajo.
¿Pero qué sucedería si durante el minuto que está en marcha se produce algún tipo de accidente? ¿Cómo y cuándo se desconectaría el motor? Bien para eso tendríamos la entrada, que en tu programa es RB0 y que podría ser como una parada de emergencia y que cuando se active paré de forma incondicional el motor (más o menos era lo planteado inicialmente en tu programa).
Pues lo que sucedería es que hasta que no trascurriese el 1 minuto de la temporización (tiempo en ON) más el otro tiempo de descanso, no tienes acceso a parar el sistema. Puedes probarlo y veras como es así. Cambia los valores del tiempo en ON a 1 minuto y el tiempo en OFF a 500mg. esto pasa con una de las entradas, pero para la otra pasa lo mismo.
Como se soluciona esto. Fácil, los micros tienen la posibilidad de ejecutar varias cosas a la vez o en 2º plano. Para ello dispone de mecanismos como los “tmr” para realizar temporizaciones; “interrupciones” que son digamos como señales de emergencia que son atendidas de forma prioritaria cuando son llamadas. Por el momento dejemos a un lado los “timers o tmr” y centrémonos en las interrupciones.
Si estas son eventos que son atendidos de forma inmediata ¿no crees que podría ser justo lo que necesitamos para resolver el problema. Bien pues todo micro, dependiendo de su constitución puede tener varias de ellas como: detección de cambio lógico en alguna entrada, fin de la conversión A/D; fin de transmisión o recepción de datos, etc. Eso lo puedes ver en los datasheet del micro que utilices en cada caso.
Como habrás visto en el programa te había asignado a RB0 la acción de resetear las 2 salidas en el momento de detectar si su nivel era un 1. La elección no fue caprichosa, ya que esta entrada tiene la posibilidad de ser configurada para la detección de su cambio de estado en el momento de producirse bien sea por un tránsito de nivel bajo a nivel alto o viceversa.
Bueno pues cambiando un poco el programa podes hacer uso de esta interrupción y tendríamos el caso solucionado de forma que cuando se detecte un paso de nivel bajo a nivel alto, pues la acción a realizar se pase a dejar las salidas a nivel bajo.
Bueno antes de dejarte l programa, te dejo que estudies lo indicado e intentes realizarlo, sino lo consigues me avisas y te adjunto el fichero.
Luego ya veremos el tema de cambiar los interruptores por pulsadores y el uso de manejo de los timers, pero para eso creo que si la versión demo solo te permite el uso de 20 bloques va a ser difícil el poder realzarlo. Lo estudiaré en todo caso.
Espero que hayas entendido la explicación y si no me indicas lo que no entiendas e intento hacerlo mejor.