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

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #75 en: 12 de Septiembre de 2022, 00:01:53 »

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
Estimado amigo, el código que acabé de compartir, es el del post # 72.
Solo funciona al soltar los botones.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #76 en: 12 de Septiembre de 2022, 08:54:06 »
Estimado amigo, el código que acabé de compartir, es el del post # 72.
Solo funciona al soltar los botones.

El código en #72 no posee los estados ESPERAR_SOLTAR_SW1 y ESPERAR_SOLTAR_SW2. En cambio cuando en tu comentario de #73, están esos estados que mencioné.

Adjunto una imagen para mejor comprensión.

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 #77 en: 12 de Septiembre de 2022, 11:13:37 »
Estimado amigo, el código que acabé de compartir, es el del post # 72.
Solo funciona al soltar los botones.

El código en #72 no posee los estados ESPERAR_SOLTAR_SW1 y ESPERAR_SOLTAR_SW2. En cambio cuando en tu comentario de #73, están esos estados que mencioné.

Adjunto una imagen para mejor comprensión.
DomunusDRR el post al que te refieres es el #70 y no el #72 como lo mencionas.
Ahora lo voy a probar y te cuento.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #78 en: 12 de Septiembre de 2022, 11:24:59 »
Estimado amigo, el código que acabé de compartir, es el del post # 72.
Solo funciona al soltar los botones.

El código en #72 no posee los estados ESPERAR_SOLTAR_SW1 y ESPERAR_SOLTAR_SW2. En cambio cuando en tu comentario de #73, están esos estados que mencioné.

Adjunto una imagen para mejor comprensión.
.


DomunusDRR el post al que te refieres es el #70 y no el #72 como lo mencionas.
Ahora lo voy a probar y te cuento.
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 #79 en: 13 de Septiembre de 2022, 12:31:13 »
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!

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #80 en: 13 de Septiembre de 2022, 12:44:10 »
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í:

Código: QBasic/QuickBASIC
  1. Interrupcion:
  2.         Disable
  3.        
  4.         IF PIR1.0 = 1 THEN                      ; Ocurrió un desborde del TIMER 1
  5.                     'Call _set_timer1(0xfc17)  'Recarga registros TMR1 para desborde 1mSeg. y borra PIR1.TMR1IF
  6.                 'T1CON.0 = 0  'Para el contador del TMR1
  7.                 'TMR1H = Precarga.HighByte 'Recarga el contador byte alto
  8.                 'TMR1L = Precarga.LowByte  'Recarga el contador byte bajo
  9.                 'T1CON.0 = 1  'Activa el contador del TMR1
  10.                 'PIR1.0 = 0      'Flash dosborde a cero
  11.  
  12.               Pulsos = Pulsos + 1
  13.     endif
  14.    
  15.     INTCON.2 = 0    ' Reset timer interrupt flag            
  16.        
  17.         RESUME
  18.         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í:

Código: QBasic/QuickBASIC
  1. Private FUNCTION TareaTonOff()
  2.   SELECT CASE EstadoTarea
  3.         CASE ESPERAR_PRESIONAR_SW1
  4.             IF SW1=0  THEN
  5.                 EstadoTarea = CAPTURAR_PULSOS_PARA_TON ' voy al siguiente caso
  6.             Endif
  7.         CASE CAPTURAR_PULSOS_PARA_TON
  8.             ContadorPulsos = Pulsos
  9.             EstadoTarea = ESPERAR_TON
  10.         CASE ESPERAR_TON
  11.             IF ((Pulsos- ContadorPulsos) > _2000_ms) THEN
  12.                 HIGH LED1  
  13.                 EstadoTarea = ESPERAR_PRESIONAR_SW2
  14.                 Endif
  15.         CASE ESPERAR_PRESIONAR_SW2
  16.             IF SW2=0  THEN
  17.                 LOW LED1' apago el led
  18.                 EstadoTarea = 0' regreso al primer estado                
  19.             Endif
  20.     END SELECT
  21. END FUNCTION

Y desde el programa principal la puedes llamar:

Código: QBasic/QuickBASIC
  1. Main:
  2.     EstadoTarea = ESPERAR_PRESIONAR_SW1 'Inicializo EstadoTarea
  3.     LOW LED1' apago el led inicialmente
  4. Lazo:
  5.     TareaTonOff()
  6. GOTO Lazo:

Cualquier otro proceso debe ser una tarea y ejecutarse en el alzo principal:

Código: QBasic/QuickBASIC
  1. Main:
  2.     EstadoTarea = ESPERAR_PRESIONAR_SW1 'Inicializo EstadoTarea
  3.     EstadoTarea2 = ESTADO_INICIAL_TAREA2 '
  4.     EstadoTarea3 = ESTADO_INICIAL_TAREA3 '
  5.     ....
  6.     EstadoTareaN = ESTADO_INICIAL_TAREA_N '
  7.     LOW LED1' apago el led inicialmente
  8. Lazo:
  9.     TareaTonOff()
  10.     Tarea2()
  11.     Tarea3()
  12.     .....
  13.     TareaN()
  14. GOTO Lazo:



« Última modificación: 13 de Septiembre de 2022, 16:52:54 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 #81 en: 13 de Septiembre de 2022, 13:46:55 »

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í:

Código: QBasic/QuickBASIC
  1. Interrupcion:
  2.         Disable
  3.        
  4.         IF PIR1.0 = 1 THEN                      ; Ocurrió un desborde del TIMER 1
  5.                     'Call _set_timer1(0xfc17)  'Recarga registros TMR1 para desborde 1mSeg. y borra PIR1.TMR1IF
  6.                 'T1CON.0 = 0  'Para el contador del TMR1
  7.                 'TMR1H = Precarga.HighByte 'Recarga el contador byte alto
  8.                 'TMR1L = Precarga.LowByte  'Recarga el contador byte bajo
  9.                 'T1CON.0 = 1  'Activa el contador del TMR1
  10.                 'PIR1.0 = 0      'Flash dosborde a cero
  11.  
  12.               Pulsos = Pulsos + 1
  13.     endif
  14.    
  15.     INTCON.2 = 0    ' Reset timer interrupt flag            
  16.        
  17.         RESUME
  18.         Enable

Así es como está, yo no noto cuál es la diferencia.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #82 en: 13 de Septiembre de 2022, 13:48:32 »

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í:

Código: QBasic/QuickBASIC
  1. Interrupcion:
  2.         Disable
  3.        
  4.         IF PIR1.0 = 1 THEN                      ; Ocurrió un desborde del TIMER 1
  5.                     'Call _set_timer1(0xfc17)  'Recarga registros TMR1 para desborde 1mSeg. y borra PIR1.TMR1IF
  6.                 'T1CON.0 = 0  'Para el contador del TMR1
  7.                 'TMR1H = Precarga.HighByte 'Recarga el contador byte alto
  8.                 'TMR1L = Precarga.LowByte  'Recarga el contador byte bajo
  9.                 'T1CON.0 = 1  'Activa el contador del TMR1
  10.                 'PIR1.0 = 0      'Flash dosborde a cero
  11.  
  12.               Pulsos = Pulsos + 1
  13.     endif
  14.    
  15.     INTCON.2 = 0    ' Reset timer interrupt flag            
  16.        
  17.         RESUME
  18.         Enable

Así es como está, yo no noto cuál es la diferencia.

Entonces vi mal los archivos txt que enviaste en el comprimido.
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 #83 en: 13 de Septiembre de 2022, 14:00:24 »

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í:

Código: QBasic/QuickBASIC
  1. Interrupcion:
  2.         Disable
  3.        
  4.         IF PIR1.0 = 1 THEN                      ; Ocurrió un desborde del TIMER 1
  5.                     'Call _set_timer1(0xfc17)  'Recarga registros TMR1 para desborde 1mSeg. y borra PIR1.TMR1IF
  6.                 'T1CON.0 = 0  'Para el contador del TMR1
  7.                 'TMR1H = Precarga.HighByte 'Recarga el contador byte alto
  8.                 'TMR1L = Precarga.LowByte  'Recarga el contador byte bajo
  9.                 'T1CON.0 = 1  'Activa el contador del TMR1
  10.                 'PIR1.0 = 0      'Flash dosborde a cero
  11.  
  12.               Pulsos = Pulsos + 1
  13.     endif
  14.    
  15.     INTCON.2 = 0    ' Reset timer interrupt flag            
  16.        
  17.         RESUME
  18.         Enable

Así es como está, yo no noto cuál es la diferencia.

Entonces vi mal los archivos txt que enviaste en el comprimido.

Al estar en archivo de texto, se torna un tanto confuso, tranquilo no hay problema.

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #84 en: 13 de Septiembre de 2022, 14:08:16 »


Ahora que entiendes los conceptos de una tarea en estado, 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 temporizado la puedes poner en una función digamos así:

Código: QBasic/QuickBASIC
  1. Private FUNCTION TareaTonOff()
  2.   SELECT CASE EstadoTarea
  3.         CASE ESPERAR_PRESIONAR_SW1
  4.             IF SW1=0  THEN
  5.                 EstadoTarea = CAPTURAR_PULSOS_PARA_TON ' voy al siguiente caso
  6.             Endif
  7.         CASE CAPTURAR_PULSOS_PARA_TON
  8.             ContadorPulsos = Pulsos
  9.             EstadoTarea = ESPERAR_TON
  10.         CASE ESPERAR_TON
  11.             IF ((Pulsos- ContadorPulsos) > _2000_ms) THEN
  12.                 HIGH LED1  
  13.                 EstadoTarea = ESPERAR_PRESIONAR_SW2
  14.                 Endif
  15.         CASE ESPERAR_PRESIONAR_SW2
  16.             IF SW2=0  THEN
  17.                 LOW LED1' apago el led
  18.                 EstadoTarea = 0' regreso al primer estado                
  19.             Endif
  20.     END SELECT
  21. END FUNCTION

Y desde el programa principal la puedes llamar:

Código: QBasic/QuickBASIC
  1. Main:
  2.     EstadoTarea = ESPERAR_PRESIONAR_SW1 'Inicializo EstadoTarea
  3.     LOW LED1' apago el led inicialmente
  4. Lazo:
  5.     TareaTonOff()
  6. GOTO Lazo:

Cualquier otro proceso debe ser una tarea y ejecutarse en el alzo principal:

Código: QBasic/QuickBASIC
  1. Main:
  2.     EstadoTarea = ESPERAR_PRESIONAR_SW1 'Inicializo EstadoTarea
  3.     EstadoTarea2 = ESTADO_INICIAL_TAREA2 '
  4.     EstadoTarea3 = ESTADO_INICIAL_TAREA3 '
  5.     ....
  6.     EstadoTareaN = ESTADO_INICIAL_TAREA_N '
  7.     LOW LED1' apago el led inicialmente
  8. Lazo:
  9.     TareaTonOff()
  10.     Tarea2()
  11.     Tarea3()
  12.     .....
  13.     TareaN()
  14. GOTO Lazo:
Gracias Dominus DRR.
Me parece genial esta información sobre tarea en estado, espero ponerle en práctica lo antes posible . Alguna sugerencia de dónde puedo encontrar más información y de ser posible ejemplos?

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Time Off Delay (TOF) & Time On Delay (TON)
« Respuesta #85 en: 13 de Septiembre de 2022, 14:13:21 »


Ahora que entiendes los conceptos de una tarea en estado, 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 temporizado la puedes poner en una función digamos así:

Código: QBasic/QuickBASIC
  1. Private FUNCTION TareaTonOff()
  2.   SELECT CASE EstadoTarea
  3.         CASE ESPERAR_PRESIONAR_SW1
  4.             IF SW1=0  THEN
  5.                 EstadoTarea = CAPTURAR_PULSOS_PARA_TON ' voy al siguiente caso
  6.             Endif
  7.         CASE CAPTURAR_PULSOS_PARA_TON
  8.             ContadorPulsos = Pulsos
  9.             EstadoTarea = ESPERAR_TON
  10.         CASE ESPERAR_TON
  11.             IF ((Pulsos- ContadorPulsos) > _2000_ms) THEN
  12.                 HIGH LED1  
  13.                 EstadoTarea = ESPERAR_PRESIONAR_SW2
  14.                 Endif
  15.         CASE ESPERAR_PRESIONAR_SW2
  16.             IF SW2=0  THEN
  17.                 LOW LED1' apago el led
  18.                 EstadoTarea = 0' regreso al primer estado                
  19.             Endif
  20.     END SELECT
  21. END FUNCTION

Y desde el programa principal la puedes llamar:

Código: QBasic/QuickBASIC
  1. Main:
  2.     EstadoTarea = ESPERAR_PRESIONAR_SW1 'Inicializo EstadoTarea
  3.     LOW LED1' apago el led inicialmente
  4. Lazo:
  5.     TareaTonOff()
  6. GOTO Lazo:

Cualquier otro proceso debe ser una tarea y ejecutarse en el alzo principal:

Código: QBasic/QuickBASIC
  1. Main:
  2.     EstadoTarea = ESPERAR_PRESIONAR_SW1 'Inicializo EstadoTarea
  3.     EstadoTarea2 = ESTADO_INICIAL_TAREA2 '
  4.     EstadoTarea3 = ESTADO_INICIAL_TAREA3 '
  5.     ....
  6.     EstadoTareaN = ESTADO_INICIAL_TAREA_N '
  7.     LOW LED1' apago el led inicialmente
  8. Lazo:
  9.     TareaTonOff()
  10.     Tarea2()
  11.     Tarea3()
  12.     .....
  13.     TareaN()
  14. GOTO Lazo:
Gracias Dominus DRR.
Me parece genial esta información sobre tarea en estado, espero ponerle en práctica lo antes posible . Alguna sugerencia de dónde puedo encontrar más información y de ser posible ejemplos?

Es un concepto de programación, hay de diferentes tipos unos más complejos que otros, es el principio para entender RTOs y sistemas operativos.

Con Basic, no se donde habrá tales conceptos:

Los primeros capítulos de este libro te sirvan:

https://leanpub.com/programacionpracticadelmicrocontroladorpic32

O un videito te puede dar algunas ideas: (Desde el minuto 03:18)


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 #86 en: 13 de Septiembre de 2022, 17:41:36 »
Muchas Gracias por la información.
Se hace referencia al lenguaje de programación C, me imagino que es más versátil que otros
Saludos!