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

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

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #60 en: 11 de Septiembre de 2022, 09:33:25 »
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.

Hola. No había leído que un código proporcionado, te ha funcionado como querías. Sólo leí tu último comentario y daba la sensación de que buscabas otro código de alguien más, parecía que ninguno te convencía.

Una última cosa que quería aportar es que a pesar que te funciona como esperabas, siempre piensa en que pasaría si suceden cosas absurdas o acciones que un usuario podría hacer (y aunque no lo creas suelen suceder).

Me refiero a que analices los siguientes casos:

¿Qué pasa si presiono al mismo tiempo ambos pulsadores?

¿Qué pasa si presiono SW1 y inmediatamente antes de cumplirse TON presiono SW2?

¿Qué pasa si mantengo presionado SW1 (ó SW2 o ambos a al vez)?

¿Tienes problemas con el rebote mecánico de los pulsadores?

Etc.
« Última modificación: 11 de Septiembre de 2022, 10:06:23 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #61 en: 11 de Septiembre de 2022, 11:42:46 »
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
Buenos días dogflu66.
De acuerdo, voy a hacer lo que propones, ya te cuento cómo me fue.
Muchas gracias!

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #62 en: 11 de Septiembre de 2022, 11:50:55 »
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.

Hola. No había leído que un código proporcionado, te ha funcionado como querías. Sólo leí tu último comentario y daba la sensación de que buscabas otro código de alguien más, parecía que ninguno te convencía.

Una última cosa que quería aportar es que a pesar que te funciona como esperabas, siempre piensa en que pasaría si suceden cosas absurdas o acciones que un usuario podría hacer (y aunque no lo creas suelen suceder).

Me refiero a que analices los siguientes casos:

¿Qué pasa si presiono al mismo tiempo ambos pulsadores?

¿Qué pasa si presiono SW1 y inmediatamente antes de cumplirse TON presiono SW2?

¿Qué pasa si mantengo presionado SW1 (ó SW2 o ambos a al vez)?

¿Tienes problemas con el rebote mecánico de los pulsadores?

Etc.
DominusDRR
No te preocupes.
En cuanto a las cosas absurdas que los usuarios suelen hacer, tienes toda la razón, es algo para tener muy en cuenta, lo tendré presente si tengo alguna novedad, estaré comentando inmediatamente.
Saludos!
Gracias por tu valiosa ayuda.

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #63 en: 11 de Septiembre de 2022, 17:57:03 »
Prueba el código sin usar el timer y las interrupciones a ver si te funciona, por ir descartando.

Estimado amigo dogflu66, ya realicé lo que me recomendaste, pero tampoco funciona.
Qué podrá ser?
Seguiré intentando.
Muchas gracias.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #64 en: 11 de Septiembre de 2022, 18:03:22 »
Prueba el código sin usar el timer y las interrupciones a ver si te funciona, por ir descartando.

Estimado amigo dogflu66, ya realicé lo que me recomendaste, pero tampoco funciona.
Qué podrá ser?
Seguiré intentando.
Muchas gracias.

Deberías compartir el proyecto con ese código para que te ayuden a determinar cual es el error.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #65 en: 11 de Septiembre de 2022, 18:04:45 »
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.

Hola. No había leído que un código proporcionado, te ha funcionado como querías. Sólo leí tu último comentario y daba la sensación de que buscabas otro código de alguien más, parecía que ninguno te convencía.
No hay problema.

Una última cosa que quería aportar es que a pesar que te funciona como esperabas, siempre piensa en que pasaría si suceden cosas absurdas o acciones que un usuario podría hacer (y aunque no lo creas suelen suceder).

Me refiero a que analices los siguientes casos:

¿Qué pasa si presiono al mismo tiempo ambos pulsadores?

¿Qué pasa si presiono SW1 y inmediatamente antes de cumplirse TON presiono SW2?

¿Qué pasa si mantengo presionado SW1 (ó SW2 o ambos a al vez)?

¿Tienes problemas con el rebote mecánico de los pulsadores?

Etc.
Estimado Dominus DRR, tenías razón, he tropezado con un inconveniente en el código y justamente es que al mantener presionado el pulsador, no se activa el LED, sino hasta que se lo suelte.
Gracias por los consejos muy oportunos.
saludos!

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #66 en: 11 de Septiembre de 2022, 18:08:40 »
Prueba el código sin usar el timer y las interrupciones a ver si te funciona, por ir descartando.

Estimado amigo dogflu66, ya realicé lo que me recomendaste, pero tampoco funciona.
Qué podrá ser?
Seguiré intentando.
Muchas gracias.

Deberías compartir el proyecto con ese código para que te ayuden a determinar cual es el error.

Si, ahora lo tengo y entendí que eso es lo primordial, a propósito tal vez sabes tú si está permitido subir archivos de simulación de Proteus?
Muchas gracias!

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #67 en: 11 de Septiembre de 2022, 18:10:02 »
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.

Hola. No había leído que un código proporcionado, te ha funcionado como querías. Sólo leí tu último comentario y daba la sensación de que buscabas otro código de alguien más, parecía que ninguno te convencía.
No hay problema.

Una última cosa que quería aportar es que a pesar que te funciona como esperabas, siempre piensa en que pasaría si suceden cosas absurdas o acciones que un usuario podría hacer (y aunque no lo creas suelen suceder).

Me refiero a que analices los siguientes casos:

¿Qué pasa si presiono al mismo tiempo ambos pulsadores?

¿Qué pasa si presiono SW1 y inmediatamente antes de cumplirse TON presiono SW2?

¿Qué pasa si mantengo presionado SW1 (ó SW2 o ambos a al vez)?

¿Tienes problemas con el rebote mecánico de los pulsadores?

Etc.
Estimado Dominus DRR, tenías razón, he tropezado con un inconveniente en el código y justamente es que al mantener presionado el pulsador, no se activa el LED, sino hasta que se lo suelte.
Gracias por los consejos muy oportunos.
saludos!



Piensa en procesos recurrentes como el ejemplo que escribí, ahí podrías crear une estado para esperar que el usuario suelte el pulsante para empezar los procesos.

Así se diseñan los sistemas con pulsantes o botones. hasta en software, cuando pulsas un botón el ratón del computador, se ejecuta el proceso al soltarlo, no al presionarlo.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #68 en: 11 de Septiembre de 2022, 18:11:22 »
Prueba el código sin usar el timer y las interrupciones a ver si te funciona, por ir descartando.

Estimado amigo dogflu66, ya realicé lo que me recomendaste, pero tampoco funciona.
Qué podrá ser?
Seguiré intentando.
Muchas gracias.

Deberías compartir el proyecto con ese código para que te ayuden a determinar cual es el error.

Si, ahora lo tengo y entendí que eso es lo primordial, a propósito tal vez sabes tú si está permitido subir archivos de simulación de Proteus?
Muchas gracias!

Si, no hay problema en compartir un proyecto, Suelen subirlo a google drive o alguno similar.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #69 en: 11 de Septiembre de 2022, 18:36:34 »
Estimados amigos del foro de Basic par PIC, adjunto envío los archivos necesarios para el proyecto de temporizadores On Delay y Off Delay con el fin poder analizarlo y mejorarlo de ser posible.
El código lo tenemos gracias al compañero Eduardo2 qué es quien nos proporcionó.
En este momento el inconveniente que tiene este temporizador es que si se mantiene presionado el pulsador, el LED no llega a encenderse, sino hasta que el pulsador sea soltado, lo que no sucede con un Timer On Delay real que es lo que se pretende emular.
Ojalá juntos podamos resolverlo.
Saludos a todos!

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #70 en: 11 de Septiembre de 2022, 18:59:31 »
Estimados amigos del foro de Basic par PIC, adjunto envío los archivos necesarios para el proyecto de temporizadores On Delay y Off Delay con el fin poder analizarlo y mejorarlo de ser posible.
El código lo tenemos gracias al compañero Eduardo2 qué es quien nos proporcionó.
En este momento el inconveniente que tiene este temporizador es que si se mantiene presionado el pulsador, el LED no llega a encenderse, sino hasta que el pulsador sea soltado, lo que no sucede con un Timer On Delay real que es lo que se pretende emular.
Ojalá juntos podamos resolverlo.
Saludos a todos!

me he atrevido a modificar el código de don Eduardo2 para usarlo como tarea de estados:

Código: QBasic/QuickBASIC
  1. _1000_ms CON 1*61    ; Conteos para 1seg con interrupciones cada 16.384ms
  2.                 ; T2s : 1*(1000/16.384) = 61
  3.  
  4.  
  5. _2000_ms CON 2*61    ; Conteos para 2seg con interrupciones cada 16.384ms
  6.                 ; T2s : 2*(1000/16.384) = 122
  7.                
  8. Pulsos VAR BYTE  
  9. ContadorPulsos VAR BYTE
  10.  
  11.  
  12. ESPERAR_PRESIONAR_SW1 CON   0
  13. ESPERAR_SOLTAR_SW1 CON      1
  14. CAPTURAR_PULSOS_PARA_TON    2
  15. ESPERAR_TON                 3
  16. ESPERAR_PRESIONAR_SW2 CON   4
  17. ESPERAR_SOLTAR_SW2 CON      5
  18. CAPTURAR_PULSOS_PARA_TOFF   6
  19.  
  20. ...........
  21. Main:
  22.     EstadoTarea = ESPERAR_PRESIONAR_SW' Inicializo EstadoTarea
  23.     LOWLED1' apago el led inicialmente
  24. Lazo:
  25.     SELECT CASE EstadoTarea
  26.         CASE ESPERAR_PRESIONAR_SW1
  27.             IF SW1=0  THEN
  28.                 EstadoTarea = ESPERAR_SOLTAR_SW1
  29.             Endif
  30.         CASE ESPERAR_SOLTAR_SW1            
  31.              IF SW1=1  THEN' espero hasta que dejen de presionar SW1
  32.                 EstadoTarea = CAPTURAR_PULSOS_PARA_TON ' voy al siguiente caso
  33.             Endif
  34.         CASE CAPTURAR_PULSOS_PARA_TON
  35.             ContadorPulsos = Pulsos
  36.             EstadoTarea = ESPERAR_TON
  37.         CASE ESPERAR_TON
  38.             IF ((Pulsos- ContadorPulsos) > _2000_ms) THEN
  39.                 HIGH LED1  
  40.                 EstadoTarea = ESPERAR_PRESIONAR_SW1 CON
  41.                 Endif
  42.         CASE ESPERAR_PRESIONAR_SW2
  43.             IF SW2=0  THEN
  44.                 EstadoTarea = ESPERAR_SOLTAR_SW2
  45.             Endif
  46.         CASE ESPERAR_SOLTAR_SW2            
  47.              IF SW2=1  THEN' espero hasta que dejen de presionar SW12
  48.                 EstadoTarea = CAPTURAR_PULSOS_PARA_TOFF ' voy al siguiente caso
  49.             Endif
  50.         CASE CAPTURAR_PULSOS_PARA_TOFF' Espero que hayan pasado 20 pulsos (20 pulsos x 0.1s = 2 segundos)
  51.             IF ((Pulsos- ContadorPulsos) > _1000_ms) THEN
  52.                 LOWLED' apago el led
  53.                 EstadoTarea = 0' regreso al primer estado
  54.             Endif
  55.     EndSelect
  56. GOTO Lazo:
  57.  
  58.  
  59. interpt:
  60.     'disable    
  61.     Pulsos++;
  62.     INTCON.2 = 0    ' Reset timer interrupt flag
  63.     RESUME
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #71 en: 11 de Septiembre de 2022, 19:08:59 »

Piensa en procesos recurrentes como el ejemplo que escribí, ahí podrías crear une estado para esperar que el usuario suelte el pulsante para empezar los procesos.

Así se diseñan los sistemas con pulsantes o botones. hasta en software, cuando pulsas un botón el ratón del computador, se ejecuta el proceso al soltarlo, no al presionarlo.

Si, es decir se activan por flancos, ya sea de bajada o bien de subida.
En el circuito propuesto es necesario que se active al presionar, no al soltar, osea se debería activar al pasar de "1" a "0" es decir en el flanco de bajada ya que los pulsadores están en modo Pull Up.
Debe haber una manera de hacerlo, en estos momentos estoy haciendo unas pruebas, espero lograrlo.
Saludos!

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #72 en: 11 de Septiembre de 2022, 19:14:59 »

Piensa en procesos recurrentes como el ejemplo que escribí, ahí podrías crear une estado para esperar que el usuario suelte el pulsante para empezar los procesos.

Así se diseñan los sistemas con pulsantes o botones. hasta en software, cuando pulsas un botón el ratón del computador, se ejecuta el proceso al soltarlo, no al presionarlo.

Si, es decir se activan por flancos, ya sea de bajada o bien de subida.
En el circuito propuesto es necesario que se active al presionar, no al soltar, osea se debería activar al pasar de "1" a "0" es decir en el flanco de bajada ya que los pulsadores están en modo Pull Up.
Debe haber una manera de hacerlo, en estos momentos estoy haciendo unas pruebas, espero lograrlo.
Saludos!

Entonces quedaría como lo propuse antes, per aprovechando los cálculos de tiempo y la interrupción de Eduardo2

De esa manera, no importa si te quedas presionado los botones.

Código: QBasic/QuickBASIC
  1. _1000ms CON 1*61    ; Conteos para 1seg con interrupciones cada 16.384ms
  2.                 ; T2s : 1*(1000/16.384) = 61
  3.  
  4.  
  5. _2000ms CON 2*61    ; Conteos para 2seg con interrupciones cada 16.384ms
  6.                 ; T2s : 2*(1000/16.384) = 122
  7.                
  8. Pulsos VAR BYTE  
  9. ContadorPulsos VAR BYTE
  10.  
  11.  
  12. ESPERAR_PRESIONAR_SW1       CON     0
  13. CAPTURAR_PULSOS_PARA_TON    CON     1
  14. ESPERAR_TON                 CON     2
  15. ESPERAR_PRESIONAR_SW2 CON   CON     3
  16. CAPTURAR_PULSOS_PARA_TOFF   CON     4
  17.  
  18. ...........
  19. Main:
  20.     EstadoTarea = ESPERAR_PRESIONAR_SW' Inicializo EstadoTarea
  21.     LOWLED1' apago el led inicialmente
  22. Lazo:
  23.     SELECT CASE EstadoTarea
  24.         CASE ESPERAR_PRESIONAR_SW1
  25.             IF SW1=0  THEN
  26.             EstadoTarea = CAPTURAR_PULSOS_PARA_TON ' voy al siguiente caso
  27.             Endif
  28.         CASE CAPTURAR_PULSOS_PARA_TON
  29.             ContadorPulsos = Pulsos
  30.             EstadoTarea = ESPERAR_TON
  31.         CASE ESPERAR_TON
  32.             IF ((Pulsos- ContadorPulsos) > _2000ms) THEN
  33.                 HIGH LED1  
  34.                 EstadoTarea = ESPERAR_PRESIONAR_SW1
  35.             Endif
  36.         CASE ESPERAR_PRESIONAR_SW2
  37.             IF SW2=0  THEN
  38.                EstadoTarea = CAPTURAR_PULSOS_PARA_TOFF ' voy al siguiente caso
  39.             Endif
  40.         CASE CAPTURAR_PULSOS_PARA_TOFF' Espero que hayan pasado 20 pulsos (20 pulsos x 0.1s = 2 segundos)
  41.             IF ((Pulsos- ContadorPulsos) > _1000ms) THEN
  42.                 LOWLED' apago el led
  43.                 EstadoTarea = ESPERAR_PRESIONAR_SW1 CON' regreso al primer estado
  44.             Endif
  45.     EndSelect
  46. GOTO Lazo:
  47.  
  48.  
  49. interpt:
  50.     'disable    
  51.     Pulsos = Pulsos + 1;
  52.     INTCON.2 = 0    ' Reset timer interrupt flag
  53.     RESUME
« Última modificación: 11 de Septiembre de 2022, 19:19:04 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #73 en: 11 de Septiembre de 2022, 21:21:35 »
Código: [Seleccionar]
Entonces quedaría como lo propuse antes, per aprovechando los cálculos de tiempo y la interrupción de Eduardo2

[/quote]
Saludos DominusDDR.
Una vez más gracias por tu tiempo y esfuerzo para ayudar a construir estos emuladores de retardo en la conexión y desconexión.
He adaptado el código que tan gentilmente brindaste, pero al momento de la simulación, este se comporta de la misma forma que el código proporcionado por Eduardo2, es decir únicamente al soltar SW1 se enciende LED1, de igual manera, solo al soltar SW2 se apaga.
Adjunto el código y el hex para la simulación.
Hasta pronto.

Código:
@ __config _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _WDT_OFF & _PWRTE_OFF

Define OSC 4
CMCON = 7


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


_1000_ms CON 1*6    ; Conteos para 1seg con interrupciones cada 16.384ms
                ; T2s : 1*(1000/16.384) = 61
 
 
_2000_ms CON 2*6    ; Conteos para 2seg con interrupciones cada 16.384ms
                ; T2s : 2*(1000/16.384) = 122
               
Pulsos VAR BYTE 
ContadorPulsos VAR BYTE
EstadoTarea  VAR BYTE

ESPERAR_PRESIONAR_SW1 CON     0
ESPERAR_SOLTAR_SW1 CON        1
CAPTURAR_PULSOS_PARA_TON CON  2
ESPERAR_TON  CON              3
ESPERAR_PRESIONAR_SW2 CON     4
ESPERAR_SOLTAR_SW2 CON        5
CAPTURAR_PULSOS_PARA_TOFF CON 6
ESPERAR_TOFF  CON             7
 
TRISA=%11111111                   
TRISB=%00000000
                 
PORTB=0
LED1 = 0
LED2 = 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
   
   
   On Interrupt GoTo Interrupcion

Main:
    EstadoTarea = ESPERAR_PRESIONAR_SW1' Inicializo EstadoTarea
    LOW LED1' apago el led inicialmente
Lazo:
    SELECT CASE EstadoTarea
        CASE ESPERAR_PRESIONAR_SW1
            IF SW1=0  THEN
                EstadoTarea = ESPERAR_SOLTAR_SW1                 
            Endif
        CASE ESPERAR_SOLTAR_SW1             
             IF SW1=1  THEN' espero hasta que dejen de presionar SW1
                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
                EstadoTarea = ESPERAR_SOLTAR_SW2
            Endif
        CASE ESPERAR_SOLTAR_SW2             
             IF SW2=1  THEN' espero hasta que dejen de presionar SW2
                EstadoTarea = CAPTURAR_PULSOS_PARA_TOFF ' voy al siguiente caso
            Endif
        CASE CAPTURAR_PULSOS_PARA_TOFF' Espero que hayan pasado 20 pulsos (20 pulsos x 0.1s = 2 segundos)
                   
            IF ((Pulsos- ContadorPulsos) > _1000_ms) THEN
                LOW LED1' apago el led
                EstadoTarea = 0' regreso al primer estado                 
            Endif
    END SELECT
GOTO Lazo:
   
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 ++;
toggle LED2
 Pulsos = Pulsos + 1
    endif
   
    INTCON.2 = 0    ' Reset timer interrupt flag           
   
   Resume
   Enable


   End

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #74 en: 11 de Septiembre de 2022, 21:30:57 »

Saludos DominusDDR.
Una vez más gracias por tu tiempo y esfuerzo para ayudar a construir estos emuladores de retardo en la conexión y desconexión.
He adaptado el código que tan gentilmente brindaste, pero al momento de la simulación, este se comporta de la misma forma que el código proporcionado por Eduardo2, es decir únicamente al soltar SW1 se enciende LED1, de igual manera, solo al soltar SW2 se apaga.
Adjunto el código y el hex para la simulación.
Hasta pronto.




Si, ese es así, espera soltar los pulsadores. Por eso en #72 puse el inicial que hice más la interrupción de Eduardo2, ese funciona tan pronto presionas los botones.

Código: QBasic/QuickBASIC
  1. _1000ms CON 1*61    ; Conteos para 1seg con interrupciones cada 16.384ms
  2.                 ; T2s : 1*(1000/16.384) = 61
  3.  
  4.  
  5. _2000ms CON 2*61    ; Conteos para 2seg con interrupciones cada 16.384ms
  6.                 ; T2s : 2*(1000/16.384) = 122
  7.                
  8. Pulsos VAR BYTE  
  9. ContadorPulsos VAR BYTE
  10.  
  11.  
  12. ESPERAR_PRESIONAR_SW1       CON     0
  13. CAPTURAR_PULSOS_PARA_TON    CON     1
  14. ESPERAR_TON                 CON     2
  15. ESPERAR_PRESIONAR_SW2 CON   CON     3
  16. CAPTURAR_PULSOS_PARA_TOFF   CON     4
  17.  
  18. ...........
  19. Main:
  20.     EstadoTarea = ESPERAR_PRESIONAR_SW' Inicializo EstadoTarea
  21.     LOWLED1' apago el led inicialmente
  22. Lazo:
  23.     SELECT CASE EstadoTarea
  24.         CASE ESPERAR_PRESIONAR_SW1
  25.             IF SW1=0  THEN
  26.             EstadoTarea = CAPTURAR_PULSOS_PARA_TON ' voy al siguiente caso
  27.             Endif
  28.         CASE CAPTURAR_PULSOS_PARA_TON
  29.             ContadorPulsos = Pulsos
  30.             EstadoTarea = ESPERAR_TON
  31.         CASE ESPERAR_TON
  32.             IF ((Pulsos- ContadorPulsos) > _2000ms) THEN
  33.                 HIGH LED1  
  34.                 EstadoTarea = ESPERAR_PRESIONAR_SW1
  35.             Endif
  36.         CASE ESPERAR_PRESIONAR_SW2
  37.             IF SW2=0  THEN
  38.                EstadoTarea = CAPTURAR_PULSOS_PARA_TOFF ' voy al siguiente caso
  39.             Endif
  40.         CASE CAPTURAR_PULSOS_PARA_TOFF' Espero que hayan pasado 20 pulsos (20 pulsos x 0.1s = 2 segundos)
  41.             IF ((Pulsos- ContadorPulsos) > _1000ms) THEN
  42.                 LOWLED' apago el led
  43.                 EstadoTarea = ESPERAR_PRESIONAR_SW1 CON' regreso al primer estado
  44.             Endif
  45.     EndSelect
  46. GOTO Lazo:
  47.  
  48.  
  49. interpt:
  50.     'disable    
  51.     Pulsos = Pulsos + 1;
  52.     INTCON.2 = 0    ' Reset timer interrupt flag
  53.     RESUME
« Última modificación: 11 de Septiembre de 2022, 22:10:49 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything