Espero que todos se encuentren muy bien.
Gracias Dominus Drr por proporcionar el código para los temporizadores.
He realizado las pruebas correspondiente y funciona.
Únicamente hice unas pequeñísimas modificaciones para que emule lo mejor posible a los TON y TOF reales.
Nuevamente gracias a DominusDRR y a dogflu66 así como también a Eduardo2 que aportaron tiempo e ingenio para vencer este desafío.
De todas maneras, si alguien tiene otra solución o quiere aportar algo más, bienvenido sea.
A continuación adjunto los archivos del temporizador On Delay y Off Delay.
Saludos cordiales!
Pienso que la interrupción sólo debería incrementar los pulsos, el resto del código creo que está demás, debería ser sólo así:
Interrupcion:
Disable
IF PIR1.0
= 1 THEN ; Ocurrió un desborde del
TIMER 1 'Call _set_timer1(0xfc17) 'Recarga registros TMR1 para desborde 1mSeg. y borra PIR1.TMR1IF
'T1CON.0 = 0 'Para el contador del TMR1
'TMR1H = Precarga.HighByte 'Recarga el contador byte alto
'TMR1L = Precarga.LowByte 'Recarga el contador byte bajo
'T1CON.0 = 1 'Activa el contador del TMR1
'PIR1.0 = 0 'Flash dosborde a cero
Pulsos = Pulsos + 1
endif
INTCON.2 = 0 ' Reset timer interrupt flag
RESUME
Enable
Ahora que entiendes los conceptos de una tarea en estados, cualquier otro proceso puedes hacerlo de esa manera, y cada a uno sería independiente del otro, con poca o nula interferencia.
Todo lo que hace tu tarea de temporizador On OFF la puedes poner en una función digamos así:
Private FUNCTION TareaTonOff()
SELECT CASE EstadoTarea
CASE ESPERAR_PRESIONAR_SW1
IF SW1=0 THEN
EstadoTarea = CAPTURAR_PULSOS_PARA_TON ' voy al siguiente caso
Endif
CASE CAPTURAR_PULSOS_PARA_TON
ContadorPulsos = Pulsos
EstadoTarea = ESPERAR_TON
CASE ESPERAR_TON
IF ((Pulsos- ContadorPulsos) > _2000_ms) THEN
HIGH LED1
EstadoTarea = ESPERAR_PRESIONAR_SW2
Endif
CASE ESPERAR_PRESIONAR_SW2
IF SW2=0 THEN
LOW LED1' apago el led
EstadoTarea = 0' regreso al primer estado
Endif
Y desde el programa principal la puedes llamar:
Main:
EstadoTarea = ESPERAR_PRESIONAR_SW1 'Inicializo EstadoTarea
LOW LED1' apago el led inicialmente
Lazo:
TareaTonOff()
GOTO Lazo:
Cualquier otro proceso debe ser una tarea y ejecutarse en el alzo principal:
Main:
EstadoTarea = ESPERAR_PRESIONAR_SW1 'Inicializo EstadoTarea
EstadoTarea2 = ESTADO_INICIAL_TAREA2 '
EstadoTarea3 = ESTADO_INICIAL_TAREA3 '
....
EstadoTareaN = ESTADO_INICIAL_TAREA_N '
LOW LED1' apago el led inicialmente
Lazo:
TareaTonOff()
Tarea2()
Tarea3()
.....
TareaN()
GOTO Lazo: