Autor Tema: Time Off Delay (TOF) & Time On Delay (TON)  (Leído 7867 veces)

0 Usuarios y 6 Visitantes están viendo este tema.

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #45 en: 10 de Septiembre de 2022, 16:30:32 »
...
Bien como he mencionado en el título de este tema, son dos  tareas:
1.-  On Delay, es decir, presiono el botón rápidamente una sola vez y después de unos segundos (1, 2 o n segundos) se enciende el LED.
2.- Off Delay, es decir, es decir presiono el botón rápidamente una sola vez y transcurridos  (1, 2 o n segundos) el LED que estaba encendido, se apaga.
Saludos!

Habiendo leido que no podías usar PAUSE ;) , una manera de hacerlo es mediante una interrupción periódica que maneje contadores descendentes que al llegar a 0 ejecuten lo que corresponda.
Cuando se utilizan períodos de 1ms, 10ms etc , la cuenta inicial son el número de milisegiundos, centésimas de segundos etc. Pero cuando no lo es no pasa nada porque lo que se introduce es el número de períodos.

Por ejemplo:
Declaro un par de contadores para los contadores y las cuentas para 1,2 segundos (o mas)
Código: [Seleccionar]
T1s CON 1*61    ; Conteos para 1seg con interrupciones cada 16.384ms
                ; T2s : 1*(1000/16.384) = 61
T1 VAR WORD     ; Variable que lleva el conteo

T2s CON 2*61    ; Conteos para 2seg con interrupciones cada 16.384ms
                ; T2s : 2*(1000/16.384) = 122
T2 VAR WORD     ; Variable que lleva el conteo

Y mas adelante
Código: [Seleccionar]
............
Main:
    IF SW1=0  THEN T1=T1s  ;Con T1>0 se dispara el conteo
                           ;La cuenta es descendente y en 0 activa el led
   
    IF SW2=0  THEN T2=T2s  ;Con T2>0 se dispara el conteo
                           ;La cuenta es descendente y en 0 desactiva el led
    Goto Main
 
interpt: 
    disable   
   
    if T1>0 then               
        T1 = T1-1
        if T1=0 then HIgh LED1
    endif
   
    if T2>0 then               
        T2 = T2-1
        if T2=0 then LOW LED1
    endif
   
    INTCON.2 = 0    ' Reset timer interrupt flag
    resume
Eduardo, muchas gracias por tu aporte, todo suma, dice el dicho, lo voy a analizar detenidamente.
No sé si tú ya lo probaste.
El inconveniente, es que en la subrutina de interupción no se debe colocar más código del necesario, para no interferir con la precisión de la temporización.
Te imaginas tener que poner 64 botones con su respectivo LED y resto de código en esa parte?
Saludos cordiales!

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #46 en: 10 de Septiembre de 2022, 16:33:01 »
No había leído que necesitabas un ON delay al presionar SW1, en el caso que ocupes mi código, se necesita un estado adicional a la tarea

Pero si ese es el título del tema!

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #47 en: 10 de Septiembre de 2022, 16:41:50 »
No había leído que necesitabas un ON delay al presionar SW1, en el caso que ocupes mi código, se necesita un estado adicional a la tarea

Pero si ese es el título del tema!

La animación que pusiste da la sensación de eso, ya que cuando presionas el pulsador SW1, el LED se enciende inmediatamente, solo se notaba retardo al pagarlo, es decir parecía sólo un TOFF.

Asumí que querías implementar eso primero y luego hacer el TON.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Conectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #48 en: 10 de Septiembre de 2022, 17:02:57 »
...
Eduardo, muchas gracias por tu aporte, todo suma, dice el dicho, lo voy a analizar detenidamente.
No sé si tú ya lo probaste.
De probarlo debía ser inventándome un hardware con algún micro y el resto del software, porque el hilo ya tiene 3 páginas y todavía no fuiste capaz de subir un código compilable (aunque funcione mal) y recién hace pocos mensajes dijiste que micro usabas.  Algo que deberías haber hecho en el 1er mensaje.

Citar
El inconveniente, es que en la subrutina de interupción no se debe colocar más código del necesario, para no interferir con la precisión de la temporización.
Te imaginas tener que poner 64 botones con su respectivo LED y resto de código en esa parte?
A ver, cuando se tienen 2,3...10 botones y solo se activa desactiva un led el procedimiento es obviamente diferente que cuando se tienen 64 botones que activan rutinas complejas.
Sería bueno que explique bien lo que tenés y querés hacer en lugar de escribir lo mínimo y dar detalles gradualmente.

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #49 en: 10 de Septiembre de 2022, 17:08:29 »
...
Eduardo, muchas gracias por tu aporte, todo suma, dice el dicho, lo voy a analizar detenidamente.
No sé si tú ya lo probaste.
De probarlo debía ser inventándome un hardware con algún micro y el resto del software, porque el hilo ya tiene 3 páginas y todavía no fuiste capaz de subir un código compilable (aunque funcione mal) y recién hace pocos mensajes dijiste que micro usabas.  Algo que deberías haber hecho en el 1er mensaje.

Citar
El inconveniente, es que en la subrutina de interupción no se debe colocar más código del necesario, para no interferir con la precisión de la temporización.
Te imaginas tener que poner 64 botones con su respectivo LED y resto de código en esa parte?
A ver, cuando se tienen 2,3...10 botones y solo se activa desactiva un led el procedimiento es obviamente diferente que cuando se tienen 64 botones que activan rutinas complejas.
Sería bueno que explique bien lo que tenés y querés hacer en lugar de escribir lo mínimo y dar detalles gradualmente.
No hace falta iventarse nada, solo simula en Proteus y listo.

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #50 en: 10 de Septiembre de 2022, 17:12:46 »
No había leído que necesitabas un ON delay al presionar SW1, en el caso que ocupes mi código, se necesita un estado adicional a la tarea

Pero si ese es el título del tema!

La animación que pusiste da la sensación de eso, ya que cuando presionas el pulsador SW1, el LED se enciende inmediatamente, solo se notaba retardo al pagarlo, es decir parecía sólo un TOFF.

Asumí que querías implementar eso primero y luego hacer el TON.
Tienes razón, faltó comentar lo suficiente en la animación.
Si, en realidad lo que busco es implementar con el PIC es los dos tipos de retardo, retardo en la conexión y retardo en la desconexión.
Gracias por tu ayuda y paciencia.
Saludos!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #51 en: 10 de Septiembre de 2022, 18:18:29 »
Bueno este ejemplo hace lo que pedias inicialmente, lo he probado y funciona, otro problema será que lo puedas adaptar a tu lenguaje.
Y si necesitas controlar grandes cantidades de led el software como el hardware cambian. Pero bueno, por algo hay que comenzar.
Te dejo el código completo:

Código: QBasic/QuickBASIC
  1. 'Pic16F628A, oscilador interno 4Mhz
  2. 'Configuración de fuses
  3. #define CONFIG = 0x3f50
  4. Define CLOCK_FREQUENCY = 4  'Oscilador a 4Mhz
  5. 'Include "_FuncionesPic16F628A.bas"
  6. 'Include "_FunctionesTmrBase.bas"
  7. 'Call _setup_oscillator(_osc_4Mhz)
  8. PCON.OSCF = 1  'Oscilador interno 4Mhz
  9. 'Inicializa Timer1 para generar una interrupción cada 1mSeg.
  10. 'Call _setup_timer1(_tmr1_internal, _tmr1_div1)  'Configura TMR1 para 4Mhz
  11. T1CON = 0  'Asigna oscilador interno para el tmr1
  12. T1CON.T1CKPS1 = 0  'Asigna el divisor
  13. T1CON.T1CKPS0 = 0
  14. 'Call _set_timer1(0xfc17)  'Carga contador TMr1 para contar 1mSeg.
  15. T1CON.TMR1ON = 0  'Para el contador del TMR1
  16. TMR1H = 0xfc  'Recarga el byte alto
  17. TMR1L = 0x17  'Recarga el byte bajo
  18. T1CON.TMR1ON = 1  'Activa el contador del TMR1
  19. PIR1.TMR1IF = 0  'Flash dosborde a cero
  20. 'Call _timer1(_on)  'Pone en marcha el Tmr1
  21. T1CON.TMR1ON = 1  'Activa el contador del TMR1
  22. 'Call _enable_interrupts(_int_timer1)  'Permite las interrupciones por desborde Tmr1
  23. PIE1.TMR1IE = 1  'Permite la interrup. TIMER1
  24. 'Call _enable_interrupts(_global)  'Permte las interrupciones globales
  25. INTCON.PEIE = 1  'Bit habilita interrupciones perifericos
  26. Enable  'INTCON.GIE habilita las interrupciones
  27. '************************************************************
  28. AllDigital
  29. ConfigPin RB0 = OUTPUT
  30. ConfigPin RB1 = OUTPUT
  31. ConfigPin RB2 = OUTPUT
  32. ConfigPin RA2 = INPUT
  33. ConfigPin RA3 = INPUT
  34. Symbol led1 = RB0
  35. Symbol led2 = RB1
  36. Symbol sw1 = RA2
  37. Symbol sw2 = RA3
  38.  
  39. 'Contadores para generar las bases de tiempos.
  40. DIM _contador1 AS LONG
  41. DIM _contador2 AS LONG
  42. _contador1 = 0
  43. _contador2 = 0
  44. 'Flag de control
  45. DIM flag1 AS Bit
  46. DIM flag2 AS Bit
  47. flag1 = 0
  48. flag2 = 0
  49. WaitMs 20
  50. Main:
  51.  
  52.         'Temporizador no redisparable, para redisparable quitar flag1 = 0
  53.         'Para ser bloqueado por el anterior añadir "and flag2 = 0"
  54.         IF sw1 = 0 AND flag1 = 0 THEN
  55.                 _contador1 = 1000
  56.                 flag1 = 1
  57.         ELSE
  58.                 IF _contador1 = 0 AND flag1 = 1 THEN
  59.                         High led1
  60.                         flag1 = 0
  61.                 Endif
  62.         Endif
  63.         'Temporizador no redisparable, para redisparable quitar flag2 = 0
  64.         'Para ser bloqueado por el anterior añadir "and flag1 = 0"
  65.         IF sw2 = 0 AND flag2 = 0 THEN
  66.                 _contador1 = 2000
  67.                 flag2 = 1
  68.         ELSE
  69.                 IF _contador1 = 0 AND flag2 = 1 THEN
  70.                         Low led1
  71.                         flag2 = 0
  72.                 Endif
  73.         Endif
  74.        
  75.         IF _contador2 = 0 THEN
  76.                 Toggle RB2
  77.                 _contador2 = 10
  78.         Endif
  79.        
  80. GOTO Main
  81. END                                              
  82. '****************************
  83. ON Interrupt
  84.         Save SYSTEM  'Guarda calculos intermedios y otros del sistema
  85.         'Detecta interrupción Timer1
  86.         IF PIR1.TMR1IF = 1 THEN
  87.                 'Call _set_timer1(0xfc17)  'Recarga registros TMR1 para desborde 1mSeg. y borra PIR1.TMR1IF
  88.                 T1CON.TMR1ON = 0  'Para el contador del TMR1
  89.                 TMR1H = 0xfc  'Recarga el contador byte alto
  90.                 TMR1L = 0x17  'Recarga el contador byte bajo
  91.                 T1CON.TMR1ON = 1  'Activa el contador del TMR1
  92.                 PIR1.TMR1IF = 0  'Flash dosborde a cero
  93.                 IF _contador1 > 0 THEN _contador1 = _contador1 - 1  '_contador BT
  94.                 IF _contador2 > 0 THEN _contador2 = _contador2 - 1  '_contador BT
  95.         Endif
  96. RESUME                                            
  97. '******************************
Saludos desde Granada, España.

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #52 en: 10 de Septiembre de 2022, 19:15:38 »
Estimados amigos, pido disculpas si no puse la información suficiente para tratar este tema.
A manera de rectificación quiero indicar que el PIC que estoy utilizando es el 16F628A.
El código que indiqué anteriormente es una adaptación del código que tan gentilmente me proporcionó dogflu66 y que yo lo adapté al PBP, lo subí en formato de imagen pensando que era más práctico a la hora de visualizarlo, a continuación lo pongo en formato de texto.

Código:

@ __config _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _WDT_OFF &

_PWRTE_OFF

Define OSC 4
CMCON = 7
 
Precarga    Var Word         
_contador1  Var Word
_contador2  Var Word                           

   
Symbol LED1 = PORTB.0
Symbol LED2 = PORTB.1
Symbol SW1 = PORTA.2
Symbol SW2 = PORTA.3

TRISA=%11111111                   
TRISB=%00000000
                 
PORTB=0
LED1 = 0
LED2 = 0
_contador1 = 0
_contador2 = 0               
   
   T1CON = %00111101         
   Precarga = 53036           'para obtener desbordes de 100ms         
   TMR1H = Precarga.HighByte  'Precargar el byte alto   
   TMR1L = Precarga.LowByte   'Precargar el byte bajo   
   PIE1.0 = 1               'Habilita la interrupción por

desborde       
   INTCON = %11000000         'Habilita interrupciones globales y periféricas
   
   
   On Interrupt GoTo Interrupcion

Inicio:
        
        IF sw1 = 0 AND _contador1 = 0 THEN
                High led1 
                _contador1 = 1100  'Carga contador con 1Seg.
        Endif
 
        IF sw2 = 0 AND _contador2 = 0 THEN
                Low led1  ;
                _contador2 = 2000  'Carga contador con 2Seg.
        Endif
   
GoTo   Inicio:
   
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
                IF _contador1 > 0 THEN _contador1 = _contador1 - 1  '_contador BT
                IF _contador2 > 0 THEN _contador2 = _contador2 - 1  '_contador BT   

         
                            
   EndIf
   
   Resume
   Enable


   End

Grcias por su comprensión.
Saludos!

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #53 en: 10 de Septiembre de 2022, 19:23:59 »
dogflu66 y Eduardo2 , muchas gracias por los códigos proporcionados, en pocos momentos los voy a probar y estaré comentando los resultados.
Gracias nuevamente,
Sinceramente,
Okapi

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #54 en: 10 de Septiembre de 2022, 20:09:10 »
Bueno este ejemplo hace lo que pedias inicialmente, lo he probado y funciona, otro problema será que lo puedas adaptar a tu lenguaje.
Y si necesitas controlar grandes cantidades de led el software como el hardware cambian. Pero bueno, por algo hay que comenzar.
Te dejo el código completo:

Código: QBasic/QuickBASIC
  1. 'Pic16F628A, oscilador interno 4Mhz
  2. 'Configuración de fuses
  3. #define CONFIG = 0x3f50
  4. Define CLOCK_FREQUENCY = 4  'Oscilador a 4Mhz
  5. 'Include "_FuncionesPic16F628A.bas"
  6. 'Include "_FunctionesTmrBase.bas"
  7. 'Call _setup_oscillator(_osc_4Mhz)
  8. PCON.OSCF = 1  'Oscilador interno 4Mhz
  9. 'Inicializa Timer1 para generar una interrupción cada 1mSeg.
  10. 'Call _setup_timer1(_tmr1_internal, _tmr1_div1)  'Configura TMR1 para 4Mhz
  11. T1CON = 0  'Asigna oscilador interno para el tmr1
  12. T1CON.T1CKPS1 = 0  'Asigna el divisor
  13. T1CON.T1CKPS0 = 0
  14. 'Call _set_timer1(0xfc17)  'Carga contador TMr1 para contar 1mSeg.
  15. T1CON.TMR1ON = 0  'Para el contador del TMR1
  16. TMR1H = 0xfc  'Recarga el byte alto
  17. TMR1L = 0x17  'Recarga el byte bajo
  18. T1CON.TMR1ON = 1  'Activa el contador del TMR1
  19. PIR1.TMR1IF = 0  'Flash dosborde a cero
  20. 'Call _timer1(_on)  'Pone en marcha el Tmr1
  21. T1CON.TMR1ON = 1  'Activa el contador del TMR1
  22. 'Call _enable_interrupts(_int_timer1)  'Permite las interrupciones por desborde Tmr1
  23. PIE1.TMR1IE = 1  'Permite la interrup. TIMER1
  24. 'Call _enable_interrupts(_global)  'Permte las interrupciones globales
  25. INTCON.PEIE = 1  'Bit habilita interrupciones perifericos
  26. Enable  'INTCON.GIE habilita las interrupciones
  27. '************************************************************
  28. AllDigital
  29. ConfigPin RB0 = OUTPUT
  30. ConfigPin RB1 = OUTPUT
  31. ConfigPin RB2 = OUTPUT
  32. ConfigPin RA2 = INPUT
  33. ConfigPin RA3 = INPUT
  34. Symbol led1 = RB0
  35. Symbol led2 = RB1
  36. Symbol sw1 = RA2
  37. Symbol sw2 = RA3
  38.  
  39. 'Contadores para generar las bases de tiempos.
  40. DIM _contador1 AS LONG
  41. DIM _contador2 AS LONG
  42. _contador1 = 0
  43. _contador2 = 0
  44. 'Flag de control
  45. DIM flag1 AS Bit
  46. DIM flag2 AS Bit
  47. flag1 = 0
  48. flag2 = 0
  49. WaitMs 20
  50. Main:
  51.  
  52.         'Temporizador no redisparable, para redisparable quitar flag1 = 0
  53.         'Para ser bloqueado por el anterior añadir "and flag2 = 0"
  54.         IF sw1 = 0 AND flag1 = 0 THEN
  55.                 _contador1 = 1000
  56.                 flag1 = 1
  57.         ELSE
  58.                 IF _contador1 = 0 AND flag1 = 1 THEN
  59.                         High led1
  60.                         flag1 = 0
  61.                 Endif
  62.         Endif
  63.         'Temporizador no redisparable, para redisparable quitar flag2 = 0
  64.         'Para ser bloqueado por el anterior añadir "and flag1 = 0"
  65.         IF sw2 = 0 AND flag2 = 0 THEN
  66.                 _contador1 = 2000
  67.                 flag2 = 1
  68.         ELSE
  69.                 IF _contador1 = 0 AND flag2 = 1 THEN
  70.                         Low led1
  71.                         flag2 = 0
  72.                 Endif
  73.         Endif
  74.        
  75.         IF _contador2 = 0 THEN
  76.                 Toggle RB2
  77.                 _contador2 = 10
  78.         Endif
  79.        
  80. GOTO Main
  81. END                                              
  82. '****************************
  83. ON Interrupt
  84.         Save SYSTEM  'Guarda calculos intermedios y otros del sistema
  85.         'Detecta interrupción Timer1
  86.         IF PIR1.TMR1IF = 1 THEN
  87.                 'Call _set_timer1(0xfc17)  'Recarga registros TMR1 para desborde 1mSeg. y borra PIR1.TMR1IF
  88.                 T1CON.TMR1ON = 0  'Para el contador del TMR1
  89.                 TMR1H = 0xfc  'Recarga el contador byte alto
  90.                 TMR1L = 0x17  'Recarga el contador byte bajo
  91.                 T1CON.TMR1ON = 1  'Activa el contador del TMR1
  92.                 PIR1.TMR1IF = 0  'Flash dosborde a cero
  93.                 IF _contador1 > 0 THEN _contador1 = _contador1 - 1  '_contador BT
  94.                 IF _contador2 > 0 THEN _contador2 = _contador2 - 1  '_contador BT
  95.         Endif
  96. RESUME                                            
  97. '******************************
Estimado dogflu, agradezco mucho tu tiempo invertido para ayudarme a vencer esta dificultad de los Temporizadores, en verdad es muy amable de tu parte.
Te comento que he adaptado a PBP el código que enviaste, lo revisé de arriba hacia abajo, para ver si cometí algún error, pero todo está correcto, sin embargo solo funciona la parte que dice toggle RB2 que en PBP es toggle portb.2, el resto no trabaja, es decir, presiono SW1 y no enciende el led.
habilité y des-habilité el ENABLE de la rutina de interrupción, y tampoco funcionó.
No tengo duda de que con el lenguaje que tu usas funcione, pero hay algún detallito que le hace falta a PBP para que funcione.
Por si acaso, adjunto el código en formato de texto.
Gran saludo!

Código:

@ __config _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _WDT_OFF & _PWRTE_OFF
;*******************************************************************************
Define OSC 4
CMCON = 7
Precarga   Var Word         
_contador1  Var Word
_contador2   Var Word               
flag1   Var Bit   
flag2   Var Bit   
flag1 = 0
flag2 = 0
pAUSE 20         
TRISA=%11111111                   
TRISB=%00000000
Symbol LED1 = PORTB.0
Symbol LED2 = PORTB.1
Symbol SW1 = PORTA.2
Symbol SW2 = PORTA.3
                 
PORTB=0
LED1 = 0
LED2 = 0
_contador1 = 0
_contador2 = 0               
   
   T1CON = %00111101         
   Precarga = 40536         
   TMR1H = Precarga.HighByte  'Precargar el byte alto   
   TMR1L = Precarga.LowByte   'Precargar el byte bajo   
   PIE1.0 = 1               'Habilita la interrupción por desborde       
   INTCON = %11000000         'Habilita interrupciones globales y periféricas
   
   'Completado = 0            ; bandera en 0
   
   On Interrupt GoTo Interrupcion

Inicio:
        
        'Temporizador no redisparable, para redisparable quitar flag1 = 0
        'Para ser bloqueado por el anterior añadir "and flag2 = 0"
        IF sw1 = 0 AND flag1 = 0 THEN
                _contador1 = 1000
                flag1 = 1
        ELSE
                IF _contador1 = 0 AND flag1 = 1 THEN
                        High led1
                        flag1 = 0
                Endif
        Endif
        'Temporizador no redisparable, para redisparable quitar flag2 = 0
        'Para ser bloqueado por el anterior añadir "and flag1 = 0"
        IF sw2 = 0 AND flag2 = 0 THEN
                _contador1 = 2000
                flag2 = 1
        ELSE
                IF _contador1 = 0 AND flag2 = 1 THEN
                        Low led1
                        flag2 = 0
                Endif
        Endif
       
        IF _contador2 = 0 THEN
                Toggle PORTB.2
                _contador2 = 10
        Endif   
GoTo   Inicio:
   
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
                IF _contador1 > 0 THEN _contador1 = _contador1 - 1  '_contador BT
                IF _contador2 > 0 THEN _contador2 = _contador2 - 1  '_contador BT             
                 
                               
   EndIf
   
   Resume
   'Enable


   End

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #55 en: 10 de Septiembre de 2022, 21:16:56 »
...
Bien como he mencionado en el título de este tema, son dos  tareas:
1.-  On Delay, es decir, presiono el botón rápidamente una sola vez y después de unos segundos (1, 2 o n segundos) se enciende el LED.
2.- Off Delay, es decir, es decir presiono el botón rápidamente una sola vez y transcurridos  (1, 2 o n segundos) el LED que estaba encendido, se apaga.
Saludos!

Habiendo leido que no podías usar PAUSE ;) , una manera de hacerlo es mediante una interrupción periódica que maneje contadores descendentes que al llegar a 0 ejecuten lo que corresponda.
Cuando se utilizan períodos de 1ms, 10ms etc , la cuenta inicial son el número de milisegiundos, centésimas de segundos etc. Pero cuando no lo es no pasa nada porque lo que se introduce es el número de períodos.

Por ejemplo:
Declaro un par de contadores para los contadores y las cuentas para 1,2 segundos (o mas)
Código: [Seleccionar]
T1s CON 1*61    ; Conteos para 1seg con interrupciones cada 16.384ms
                ; T2s : 1*(1000/16.384) = 61
T1 VAR WORD     ; Variable que lleva el conteo

T2s CON 2*61    ; Conteos para 2seg con interrupciones cada 16.384ms
                ; T2s : 2*(1000/16.384) = 122
T2 VAR WORD     ; Variable que lleva el conteo

Y mas adelante
Código: [Seleccionar]
............
Main:
    IF SW1=0  THEN T1=T1s  ;Con T1>0 se dispara el conteo
                           ;La cuenta es descendente y en 0 activa el led
   
    IF SW2=0  THEN T2=T2s  ;Con T2>0 se dispara el conteo
                           ;La cuenta es descendente y en 0 desactiva el led
    Goto Main
 
interpt: 
    disable   
   
    if T1>0 then               
        T1 = T1-1
        if T1=0 then HIgh LED1
    endif
   
    if T2>0 then               
        T2 = T2-1
        if T2=0 then LOW LED1
    endif
   
    INTCON.2 = 0    ' Reset timer interrupt flag
    resume

Eduardo 2, acabo de probar  tu código y  si funciona según lo especificado.
Es muy ingeniosa tu solución ((:-)) ((:-)) ((:-)).
Me resta agradecerte mucho, mucho, mucho, por tu generosidad al compartir tus conocimientos, invertir tu valioso tiempo y sobre todo por la paciencia para con este inexperto.
Ahora voy a buscar la manera de dejar lo mínimo del código posible en la subrutina de interrupción.
Nuevamente muchas gracias.
Mi saludo cordial!

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #56 en: 10 de Septiembre de 2022, 21:23:51 »
dogflu66, DominusDRR  y Eduardo2 , nuevamente un millón de gracias por su tiempo, dedicación y paciencia en la resolución de este problema que para expertos como ustedes se transformó en un reto.
De verdad muchas gracias!

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #57 en: 10 de Septiembre de 2022, 21:28:56 »
Amigos del foro, sé que en programación hay muchas maneras de resolver un  mismo problema, por tal motivo si alguien tiene otra solución o quiere aportar algo más sobre el tema, bienvenido sea.
Gracias anticipadas!
Saludos!

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #58 en: 10 de Septiembre de 2022, 23:36:21 »
Amigos del foro, sé que en programación hay muchas maneras de resolver un  mismo problema, por tal motivo si alguien tiene otra solución o quiere aportar algo más sobre el tema, bienvenido sea.
Gracias anticipadas!
Saludos!

Es que si nunca pruebas ninguno de los ejemplos que te ha proporcionado, o si los pruebas pero no muestras el error que generan al compilarlos o intentar simularlos, ningún ejemplo te va ser de utilidad.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #59 en: 11 de Septiembre de 2022, 08:02:52 »
Prueba el código sin usar el timer y las interrupciones a ver si te funciona, por ir descartando.

Código: QBasic/QuickBASIC
  1. 'Pic16F628A, oscilador interno 4Mhz
  2. 'Configuración de fuses
  3. #define CONFIG = 0x3f50
  4. Define CLOCK_FREQUENCY = 4  'Oscilador a 4Mhz
  5. 'Include "_FuncionesPic16F628A.bas"
  6. 'Include "_FunctionesTmrBase.bas"
  7. 'Call _setup_oscillator(_osc_4Mhz)
  8. PCON.OSCF = 1  'Oscilador interno 4Mhz
  9. '************************************************************
  10. AllDigital
  11. ConfigPin RB0 = OUTPUT
  12. ConfigPin RB1 = OUTPUT
  13. ConfigPin RB2 = OUTPUT
  14. ConfigPin RA2 = INPUT
  15. ConfigPin RA3 = INPUT
  16. Symbol led1 = RB0
  17. Symbol led2 = RB1
  18. Symbol sw1 = RA2
  19. Symbol sw2 = RA3
  20.  
  21. 'Contadores para generar las bases de tiempos.
  22. DIM _contador1 AS LONG
  23. DIM _contador2 AS LONG
  24. _contador1 = 0
  25. _contador2 = 0
  26. 'Flag de control
  27. DIM flag1 AS Bit
  28. DIM flag2 AS Bit
  29. flag1 = 0
  30. flag2 = 0
  31. WaitMs 100
  32. Main:
  33.  
  34.         'Temporizador no redisparable, para redisparable quitar flag1 = 0
  35.         'Para ser bloqueado por el anterior añadir "and flag2 = 0"
  36.         IF sw1 = 0 AND flag1 = 0 THEN
  37.                 _contador1 = 100  '0
  38.                 flag1 = 1
  39.         ELSE
  40.                 IF _contador1 = 0 AND flag1 = 1 THEN
  41.                         High led1
  42.                         flag1 = 0
  43.                 Endif
  44.         Endif
  45.         'Temporizador no redisparable, para redisparable quitar flag2 = 0
  46.         'Para ser bloqueado por el anterior añadir "and flag1 = 0"
  47.         IF sw2 = 0 AND flag2 = 0 THEN
  48.                 _contador1 = 200  '0
  49.                 flag2 = 1
  50.         ELSE
  51.                 IF _contador1 = 0 AND flag2 = 1 THEN
  52.                         Low led1
  53.                         flag2 = 0
  54.                 Endif
  55.         Endif
  56.        
  57.         IF _contador2 = 0 THEN
  58.                 Toggle RB2
  59.                 _contador2 = 10
  60.         Endif
  61.        
  62.         WaitMs 1
  63.         IF _contador1 > 0 THEN _contador1 = _contador1 - 1  '_contador BT
  64.         IF _contador2 > 0 THEN _contador2 = _contador2 - 1  '_contador BT
  65.  
  66.        
  67. GOTO Main
Saludos desde Granada, España.