Hola, pues teniendo la base de tiempos disponible, ya tienes el 50% hecho.Robert76, gracias por responder.
Entonces si quieres hacer un retardo a la desconexión, pues en el momento que se produce el evento, enciendes un LED, ahi debes disparar el contador por interrupción, para que cuándo desborde apagues el LED.
En caso de necesitar un retardo a la conexión, debes disparar el contador y (apagar el LED, si es que en condición inicial estaba encendido) al iniciar el evento y luego cuándo desborde, enciendes el LED.
El asunto es que en Picbasic Pro he logrado generar unos pulsos por medio de la interrupción, por desbordamiento del timer en el PIC 16F628A.
He conseguido contar los pulsos llamados Ticks, para hacer segundos y luego decenas de segundos.
Hola, pues teniendo la base de tiempos disponible, ya tienes el 50% hecho.Robert76, gracias por responder.
Entonces si quieres hacer un retardo a la desconexión, pues en el momento que se produce el evento, enciendes un LED, ahi debes disparar el contador por interrupción, para que cuándo desborde apagues el LED.
En caso de necesitar un retardo a la conexión, debes disparar el contador y (apagar el LED, si es que en condición inicial estaba encendido) al iniciar el evento y luego cuándo desborde, enciendes el LED.
Soy muy novato y un poco cabeza dura en el tema de programar microcontroladores.
Bueno te cuento que he avanzado hasta el punto que cuando han transcurrido, digamos dos segundos, entonces se activa una bandera que indica esta situación, pero de ahí no logro avanzar.
La imagen adjunta ilustra lo que voy a describir.
Tengo dos variables varbit, A y B, si estas estas dos se cumplen el led está encendido, pero cuando una de las dos no está presente el led se apaga, pero después de unos segundos.
Mi codigo está así:
A Var Bit
B Var Bit
LED Var Bit
Inicio:
IF A=0 & B=0 THEN LED=1
Bandera de dos segundos=1
ELSE
LED=0
ENDIF
GOTO Inicio
END
Pero el led no se queda encendido por 2 segundos.
No se dónde y en que términos de código iría la bandera que indica que el led debe permanecer encendido por dos segundos.
Esto me está volviendo loco.
Algún ejemplo para guiarme por favor.
Ayuda por favor!
Saludos!
DominusDRR,
Gracias por tu respuesta.
Me recomiendas que utilice select case.
Pero, lo que no me queda claro y es lo más relevante, es cómo y donde utilizar la bandera que indica que han transcurrido los dos segundos.
Agradecimientos a todos los que respondieron, por su tiempo y paciencia.
La animación adjunta ilustra con precisión lo que necesito hacer.
Ojalá alguien pudiera dar una luz sobre este tema en Picbasic Pro, ya que el resto de lenguajes los desconozco totalmente.
Gracias
Saludos!
Se entiende a la perfección lo que buscas.
Pero sube el código que estás usando, sino cuesta avanzar.
Se entiende a la perfección lo que buscas.
Pero sube el código que estás usando, sino cuesta avanzar.
Buenas tardes.
Aquí está:
SW1 Var Bit
SW2 Var Bit
LED1 Var Bit
Inicio:
IF SW1=0 THEN HIGH LED1 ;Al presionar SW1 se enciende el LED
IF SW2=0 THEN LOW LED ;Al presionar SW2 se apaga, pero necesito que lo haga luego de 2
;segundos. No puedo usar PAUSE ni PAUSEUS, porque se el
;programa se queda trabado y no podrá realizar otras acciones.
GOTO Inicio
END
Saludos!
]He conseguido contar los pulsos llamados Ticks, para hacer segundos y luego decenas de segundos.
Agradecimientos a todos los que respondieron, por su tiempo y paciencia.
La animación adjunta ilustra con precisión lo que necesito hacer.
Ojalá alguien pudiera dar una luz sobre este tema en Picbasic Pro, ya que el resto de lenguajes los desconozco totalmente.
Gracias
Saludos!
Si tomas el ejemplo de dogflu66, ya tendrías tu temporizador ONOFF.
Lo que sucede es que no entiendo ese lenguaje de programación.
Por favor, puedes decirme qué lenguaje es ? porque Picbasic Pro no es, verdad?
Saludos!
Agradecimientos a todos los que respondieron, por su tiempo y paciencia.
La animación adjunta ilustra con precisión lo que necesito hacer.
Ojalá alguien pudiera dar una luz sobre este tema en Picbasic Pro, ya que el resto de lenguajes los desconozco totalmente.
Gracias
Saludos!
Si tomas el ejemplo de dogflu66, ya tendrías tu temporizador ONOFF.
Lo que sucede es que no entiendo ese lenguaje de programación.
Por favor, puedes decirme qué lenguaje es ? porque Picbasic Pro no es, verdad?
Saludos!
Bueno, en este momento no me encuentro en casa, pero resumiendo vuelvo a comentar que con el uso de uno de los timers del PIC y por desbordamiento de este, he conseguido pulsos de 100 milisegundos y a partir de estos pude conseguir el retardo de un segundo, en ese momento, la bandera se pone en "1" indicando que ha transcurrido un segundo.Se entiende a la perfección lo que buscas.
Pero sube el código que estás usando, sino cuesta avanzar.
Buenas tardes.
Aquí está:
SW1 Var Bit
SW2 Var Bit
LED1 Var Bit
Inicio:
IF SW1=0 THEN HIGH LED1 ;Al presionar SW1 se enciende el LED
IF SW2=0 THEN LOW LED ;Al presionar SW2 se apaga, pero necesito que lo haga luego de 2
;segundos. No puedo usar PAUSE ni PAUSEUS, porque se el
;programa se queda trabado y no podrá realizar otras acciones.
GOTO Inicio
END
Saludos!
Hombre, lo que te piden es el código que has logrado generar retardos.Citar]He conseguido contar los pulsos llamados Ticks, para hacer segundos y luego decenas de segundos.
Bueno, en este momento no me encuentro en casa, pero resumiendo vuelvo a comentar que con el uso de uno de los timers del PIC y por desbordamiento de este, he conseguido pulsos de 100 milisegundos y a partir de estos pude conseguir el retardo de un segundo, en ese momento, la bandera se pone en "1" indicando que ha transcurrido un segundo.Se entiende a la perfección lo que buscas.
Pero sube el código que estás usando, sino cuesta avanzar.
Buenas tardes.
Aquí está:
SW1 Var Bit
SW2 Var Bit
LED1 Var Bit
Inicio:
IF SW1=0 THEN HIGH LED1 ;Al presionar SW1 se enciende el LED
IF SW2=0 THEN LOW LED ;Al presionar SW2 se apaga, pero necesito que lo haga luego de 2
;segundos. No puedo usar PAUSE ni PAUSEUS, porque se el
;programa se queda trabado y no podrá realizar otras acciones.
GOTO Inicio
END
Saludos!
Hombre, lo que te piden es el código que has logrado generar retardos.Citar]He conseguido contar los pulsos llamados Ticks, para hacer segundos y luego decenas de segundos.
Creo que hasta aquí está claro el asunto del retardo de un segundo.
Lo que no puedo lograr, es donde encajar este retardo para que el led quede prendido un segundo después de haber sido desactivado.
Reitero y me sumo a la petición de Dominus.
Por favor si eres tan amable de subir el código que comentas aquí: :?
" que con el uso de uno de los timers del PIC y por desbordamiento de este, he conseguido pulsos de 100 milisegundos y a partir de estos pude conseguir el retardo de un segundo, en ese momento, la bandera se pone en "1" indicando que ha transcurrido un segundo.
Luego veremos cómo activar/desactivar la salida que deseas!
Reitero y me sumo a la petición de Dominus.
Por favor si eres tan amable de subir el código que comentas aquí: :?
" que con el uso de uno de los timers del PIC y por desbordamiento de este, he conseguido pulsos de 100 milisegundos y a partir de estos pude conseguir el retardo de un segundo, en ese momento, la bandera se pone en "1" indicando que ha transcurrido un segundo.
Luego veremos cómo activar/desactivar la salida que deseas!
Ok.
Aquí está el código:
Encabezado, etc. etc.
On Interrupt Goto interpt
Pulsos VAR BYTE
Segundos VAR BYTE
Bandera_seg VAR BIT
SW1 Var Bit
SW2 Var Bit
LED1 Var Bit
Main:
;En esta parte necesito hacer el retardo
IF SW1=0 THEN HIGH LED1 ;Al presionar SW1 se enciende el LED
IF SW2=0 THEN LOW LED1 ;Al presionar SW2 se apaga, pero necesito que lo haga
luego de 2 sgs
Goto Main
interpt:
Disable
If PIR1.0 = 1 Then
Pulsos=Pulsos+1
If Pulsos = 10 Then
Segundos = Segundos + 1 ; Incrementar los Segundos
Pulsos = 0
EndIf
If Segundos = 2 Then
Segundos = 0
Bandera_seg = 1 ;Tiempo completado.
EndIf
EndIf
resume
enable
END
Mientras el programa haga solo eso y no metas tareas que no puedan suspenderse durante el retardo, usá la instrucción PAUSE y a otra cosa.Eduardo2, gracias por tu intención de ayudar, pero si te fijas en el post #12, en él menciono que no puedo usar PAUSE ni PAUSEUS, porque se el programa se queda trabado y no podrá realizar otras acciones.Código: Text
;En esta parte necesito hacer el retardo IF SW1=0 THEN HIGH LED1 ;Al presionar SW1 se enciende el LED IF SW2=0 THEN PAUSE 2000 LOW LED1 ENDIF
Aquí tienes un ejemplo; cambia lo que necesites e ignora las declaraciones no compatibles, pero el código es muy parecido al de tu lenguaje.dogflu66 Muchas gracias por tu generosidad al compartir ese código, así como por tu tiempo y paciencia.Código: QBasic/QuickBASIC
'Pic16F628A, oscilador interno 4Mhz 'Configuración de fuses #define CONFIG = 0x3f50 Define CLOCK_FREQUENCY = 4 'Oscilador a 4Mhz 'Include "_FuncionesPic16F628A.bas" 'Include "_FunctionesTmrBase.bas" 'Call _setup_oscillator(_osc_4Mhz) PCON.OSCF = 1 'Oscilador interno 4Mhz 'Inicializa Timer1 para generar una interrupción cada 1mSeg. 'Call _setup_timer1(_tmr1_internal, _tmr1_div1) 'Configura TMR1 para 4Mhz T1CON = 0 'Asigna oscilador interno para el tmr1 T1CON.T1CKPS1 = 0 'Asigna el divisor T1CON.T1CKPS0 = 0 'Call _set_timer1(0xfc17) 'Carga contador TMr1 para contar 1mSeg. T1CON.TMR1ON = 0 'Para el contador del TMR1 TMR1H = 0xfc 'Recarga el byte alto TMR1L = 0x17 'Recarga el byte bajo T1CON.TMR1ON = 1 'Activa el contador del TMR1 PIR1.TMR1IF = 0 'Flash dosborde a cero 'Call _timer1(_on) 'Pone en marcha el Tmr1 T1CON.TMR1ON = 1 'Activa el contador del TMR1 'Call _enable_interrupts(_int_timer1) 'Permite las interrupciones por desborde Tmr1 PIE1.TMR1IE = 1 'Permite la interrup. TIMER1 'Call _enable_interrupts(_global) 'Permte las interrupciones globales INTCON.PEIE = 1 'Bit habilita interrupciones perifericos Enable 'INTCON.GIE habilita las interrupciones '************************************************************ AllDigital 'Contadores para generar las bases de tiempos. _contador1 = 0 _contador2 = 0 Main: ';en esta parte necesito hacer el retardo High led1 ';al presionar sw1 se enciende el led _contador1 = 1100 'Carga contador con 1Seg. Endif Low led1 ';al presionar sw2 se apaga, pero necesito que lo haga _contador2 = 2000 'Carga contador con 2Seg. Endif GOTO Main '**************************** ON Interrupt Save SYSTEM 'Guarda calculos intermedios y otros del sistema 'Detecta interrupción Timer1 IF PIR1.TMR1IF = 1 THEN 'Call _set_timer1(0xfc17) 'Recarga registros TMR1 para desborde 1mSeg. y borra PIR1.TMR1IF T1CON.TMR1ON = 0 'Para el contador del TMR1 TMR1H = 0xfc 'Recarga el contador byte alto TMR1L = 0x17 'Recarga el contador byte bajo T1CON.TMR1ON = 1 'Activa el contador del TMR1 PIR1.TMR1IF = 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 '******************************
DominusDRR Agradezco mucho tu ayuda desinteresada.
No soy experto en basic, pero voy a intentarlo, si alguien conoce mejor el código, que me corrija cualquier cosa errónea por favor.
El código que has compartido, se está asumiendo que la interrupción genera correctamente el tiempo que deseas.Código: QBasic/QuickBASIC
Main: PIR1.0 = 0; Apago la interrupción del temporizador Pulsos = 0 Bandera_seg = 0 Segundos = 0; inicializo las variables LOW LED1 ; led apagado Lazo: IF SW1 = 0 THEN; espero a que presionen SW1 HIGH LED1; WHILE SW2=1 EndWhile ; espero hasta que SW2 sea presionado PIR1.0 = 1; Activo la interrupción y el temporizador empieza a funcionar LOW LED1 ; apago el led GOTO Main; reinicio el proceso EndIf GOTO Lazo
DominusDRR Agradezco mucho tu ayuda desinteresada.
No soy experto en basic, pero voy a intentarlo, si alguien conoce mejor el código, que me corrija cualquier cosa errónea por favor.
El código que has compartido, se está asumiendo que la interrupción genera correctamente el tiempo que deseas.Código: QBasic/QuickBASIC
Main: PIR1.0 = 0; Apago la interrupción del temporizador Pulsos = 0 Bandera_seg = 0 Segundos = 0; inicializo las variables LOW LED1 ; led apagado Lazo: IF SW1 = 0 THEN; espero a que presionen SW1 HIGH LED1; WHILE SW2=1 EndWhile ; espero hasta que SW2 sea presionado PIR1.0 = 1; Activo la interrupción y el temporizador empieza a funcionar LOW LED1 ; apago el led GOTO Main; reinicio el proceso EndIf GOTO Lazo
Este también te va a dar problemas porque se queda en lazos infinitos esperando el pulsador o la bandera. (Instrucciones While)
Deberías pensar en multitareas con procesos cooperativoss, y para tu caso no es necesario utilizar interrupciones, solamente un temporizador siempre activo para obtener su valor y generar retardos.
Este también te va a dar problemas porque se queda en lazos infinitos esperando el pulsador o la bandera. (Instrucciones While)
Deberías pensar en multitareas con procesos cooperativoss, y para tu caso no es necesario utilizar interrupciones, solamente un temporizador siempre activo para obtener su valor y generar retardos.
Si, amigo eso también pensé, al ver los While.
Por favor podrías ser más especifico con lo del temporizador siempre activo?
De ser posible un pequeño ejemplo que me guíe sería muy gentil de tu parte.
Saludos!
Con el microcontrolador que tienes y con un temporizador de 16 bits, con su máximo post escalamiento de 8 (asumiendo que el cristal es de 4MHz) me parece que máximo podrías conseguir 0.5 segundos de tiempo.
Por lo tanto necesitarías una variable auxiliar de 16 bits y con el código de don dogflu66, se podría hacer la siguiente parte solamente es para “aumentar” la capacidad del temporizador.Código: QBasic/QuickBASIC
Con esto tienes una variable (sin signo) que puede contar hasta 65.5 segundos
El siguiente paso es comprender la forma errónea de realizar un retardo, como tu mismo lo indicantes se apropia del CPU del microcontrolador y no puedes hacer otros procesos, salvo que sólo sea el único proceso.
(https://pbs.twimg.com/media/FcP_7hFXwAQO0zS?format=jpg&name=medium)
Para evitar un apropiamiento del CPU se puede recurrir a una variable que captura el valor del temporizador (o en este caso, la variable auxiliar) y determinar si se ha determinado que ha transcurrido un tiempo determinado.
(https://pbs.twimg.com/media/FcQALE2WAAAJmrq?format=png&name=900x900)
Un ejemplo para activar y apagar un led sería más o menos así:Código: QBasic/QuickBASIC
DIM Retardo Ad Ushort Main: Low led1 ‘ apago el led Retardo = VariableAuxiliar Lazo: IF ((VariableAuxiliar - Retardo) > 2000) THEN TOGGLE led1 Retardo = VariableAuxiliar’ Vuelvo a capturar un nuevo valor para otro retardo Endif GOTO Lazo
Como puedes ver, sólo se verifica si el IF se cumple, caso contrario podría pasar a realizar otro proceso.
Si comprendes esto, se podría intentar hacer tu proyecto de esta manera.
Si tu dices que te funciona bien el código que has realizado, como dice don dogflu66, debes realizar un conteo mas preciso, digamos milisegundos, pero aceptemos tu código y utilicemos décimas de segundo, entonces tu código de la interrupción quedaría así:Código: QBasic/QuickBASIC
ON Interrupt IF PIR1.0 = 1 THEN Pulsos=Pulsos+1 EndIf
Pulsos se incrementan cada 0.1 segundos (por eso cuando es igual a 10 en tu anterior código, asumes que es 1 segundo.
Nota que nunca deshabilito la interrupción. es decir nunca utilizo Disable, similar a la interrupción de dogflu66
También declara a pulsos como una variable sin signo.
Ahora vamos a tu código:Código: QBasic/QuickBASIC
ON Interrupt GOTO interpt EstadoTarea VAR BYTE Segundos VAR BYTE Bandera_seg VAR BIT SW1 Var Bit SW2 Var Bit LED1 Var Bit Main: EstadoTarea = 0x00;' Inicializo EstadoTarea LOWLED1' apago el led inicialmente Lazo: SELECT CASE EstadoTarea CASE 0 ' en case 0, se espera a que presionen sw1 IF SW1=0 THEN HIGH LED1 'Al presionar SW1 se enciende el LED EstadoTarea = 1' voy al siguiente caso Endif CASE 1' Espero a que presionen el pulsador SW2 para empezar el retardo IF SW2=0 THEN ContadorPulsos = Pulsos' Capturo el valor de pulsos EstadoTarea = 2' voy al siguiente caso Endif CASE 2' Espero que hayan pasado 20 pulsos (20 pulsos x 0.1s = 2 segundos) IF ((Pulsos- ContadorPulsos) > 20) THEN LOWLED' apago el led EstadoTarea = 0' regreso al primer estado Endif EndSelect GOTO Lazo:
Si tu dices que te funciona bien el código que has realizado, como dice don dogflu66, debes realizar un conteo mas preciso, digamos milisegundos, pero aceptemos tu código y utilicemos décimas de segundo, entonces tu código de la interrupción quedaría así:Código: QBasic/QuickBASIC
ON Interrupt IF PIR1.0 = 1 THEN Pulsos=Pulsos+1 EndIf
Pulsos se incrementan cada 0.1 segundos (por eso cuando es igual a 10 en tu anterior código, asumes que es 1 segundo.
Nota que nunca deshabilito la interrupción. es decir nunca utilizo Disable, similar a la interrupción de dogflu66
También declara a pulsos como una variable sin signo.
Ahora vamos a tu código:Código: QBasic/QuickBASIC
ON Interrupt GOTO interpt EstadoTarea VAR BYTE Segundos VAR BYTE Bandera_seg VAR BIT SW1 Var Bit SW2 Var Bit LED1 Var Bit Main: EstadoTarea = 0x00;' Inicializo EstadoTarea LOWLED1' apago el led inicialmente Lazo: SELECT CASE EstadoTarea CASE 0 ' en case 0, se espera a que presionen sw1 IF SW1=0 THEN HIGH LED1 'Al presionar SW1 se enciende el LED EstadoTarea = 1' voy al siguiente caso Endif CASE 1' Espero a que presionen el pulsador SW2 para empezar el retardo IF SW2=0 THEN ContadorPulsos = Pulsos' Capturo el valor de pulsos EstadoTarea = 2' voy al siguiente caso Endif CASE 2' Espero que hayan pasado 20 pulsos (20 pulsos x 0.1s = 2 segundos) IF ((Pulsos- ContadorPulsos) > 20) THEN LOWLED' apago el led EstadoTarea = 0' regreso al primer estado Endif EndSelect GOTO Lazo:
Te salió un código muy elegante ((:-))
Aparte de lo anterior, el código que pusiste antes está como imagen, por lo que no puedo copiarlo y pegarlo en mi IDE.
De todas formas lo he probado y si me funciona, aunque este código solo es un ejemplo y no hace exactamente lo que quieres.
Dogflu66, gracias por estar pendiente con la resolución de este tema.
El código que mencionas que está como imagen, no es si no, el código que tu sugeriste en el post #23 y que yo solo lo adapté a PBP.
Entiendo que pulsas una tecla y pasado un tiempo se actualiza el estado del led.
Una tecla es para activarlo y la otra tecla para apagarlo.
Todo esto sin afectar al flujo del programa.
¿Estoy en lo cierto?.
Si tu dices que te funciona bien el código que has realizado, como dice don dogflu66, debes realizar un conteo mas preciso, digamos milisegundos, pero aceptemos tu código y utilicemos décimas de segundo, entonces tu código de la interrupción quedaría así:
DominusDRR, Soy una persona adulta, y si digo que he logrado obtener retardos por desborde del timer, es porque es así.
No sé por qué tanta desconfianza en mi capacidad para lograr hacer un retardo con el timer del PIC.
Antes de lograrlo tuve que como muchos de ustedes, leer bastante teoría y con pruebas sucesivas y en orden de complejidad aprender a hacerlo.
He buscado mucho sobre los temas de retardos On Delay y Off Delay, pero hay poquísima información sobre el tema en lo que a lenguaje Basic para PICs se refiere, en cambio para lenguaje "C" logré encontrar algo pero como no estoy familiarizado con ese lenguaje, me resulta indescifrable.
Saludos!
DominusDRR, Soy una persona adulta, y si digo que he logrado obtener retardos por desborde del timer, es porque es así.
No sé por qué tanta desconfianza en mi capacidad para lograr hacer un retardo con el timer del PIC.
Saludos!
...
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!
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
............
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
DominusDRR, Soy una persona adulta, y si digo que he logrado obtener retardos por desborde del timer, es porque es así.
No sé por qué tanta desconfianza en mi capacidad para lograr hacer un retardo con el timer del PIC.
Saludos!
No es desconfianza, solamente quería indicar lo que dice dogflu66, se debe contar milisegundos y en función de eso obtener tiempos más grandes como segundos.
Lamento mucho si hubo un mal entendido cultural. También tengo varios años trabajando en sistemas embebidos y comprendo que a veces toma tiempo comprender conceptos nuevos y/o complejos.
Eduardo, muchas gracias por tu aporte, todo suma, dice el dicho, lo voy a analizar detenidamente....
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 adelanteCó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
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!
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!
...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.
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.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.
Te imaginas tener que poner 64 botones con su respectivo LED y resto de código en esa parte?
No hace falta iventarse nada, solo simula en Proteus y listo....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.
Eduardo, muchas gracias por tu aporte, todo suma, dice el dicho, lo voy a analizar detenidamente.
No sé si tú ya lo probaste.CitarEl 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.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.
Te imaginas tener que poner 64 botones con su respectivo LED y resto de código en esa parte?
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.
Tienes razón, faltó comentar lo suficiente en la animación.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.
Bueno este ejemplo hace lo que pedias inicialmente, lo he probado y funciona, otro problema será que lo puedas adaptar a tu lenguaje.Estimado dogflu, agradezco mucho tu tiempo invertido para ayudarme a vencer esta dificultad de los Temporizadores, en verdad es muy amable de tu parte.
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
'Pic16F628A, oscilador interno 4Mhz 'Configuración de fuses #define CONFIG = 0x3f50 Define CLOCK_FREQUENCY = 4 'Oscilador a 4Mhz 'Include "_FuncionesPic16F628A.bas" 'Include "_FunctionesTmrBase.bas" 'Call _setup_oscillator(_osc_4Mhz) PCON.OSCF = 1 'Oscilador interno 4Mhz 'Inicializa Timer1 para generar una interrupción cada 1mSeg. 'Call _setup_timer1(_tmr1_internal, _tmr1_div1) 'Configura TMR1 para 4Mhz T1CON = 0 'Asigna oscilador interno para el tmr1 T1CON.T1CKPS1 = 0 'Asigna el divisor T1CON.T1CKPS0 = 0 'Call _set_timer1(0xfc17) 'Carga contador TMr1 para contar 1mSeg. T1CON.TMR1ON = 0 'Para el contador del TMR1 TMR1H = 0xfc 'Recarga el byte alto TMR1L = 0x17 'Recarga el byte bajo T1CON.TMR1ON = 1 'Activa el contador del TMR1 PIR1.TMR1IF = 0 'Flash dosborde a cero 'Call _timer1(_on) 'Pone en marcha el Tmr1 T1CON.TMR1ON = 1 'Activa el contador del TMR1 'Call _enable_interrupts(_int_timer1) 'Permite las interrupciones por desborde Tmr1 PIE1.TMR1IE = 1 'Permite la interrup. TIMER1 'Call _enable_interrupts(_global) 'Permte las interrupciones globales INTCON.PEIE = 1 'Bit habilita interrupciones perifericos Enable 'INTCON.GIE habilita las interrupciones '************************************************************ AllDigital ConfigPin RB0 = OUTPUT ConfigPin RB1 = OUTPUT ConfigPin RB2 = OUTPUT ConfigPin RA2 = INPUT ConfigPin RA3 = INPUT Symbol led1 = RB0 Symbol led2 = RB1 Symbol sw1 = RA2 Symbol sw2 = RA3 'Contadores para generar las bases de tiempos. _contador1 = 0 _contador2 = 0 'Flag de control flag1 = 0 flag2 = 0 WaitMs 20 Main: 'Temporizador no redisparable, para redisparable quitar flag1 = 0 'Para ser bloqueado por el anterior añadir "and flag2 = 0" _contador1 = 1000 flag1 = 1 ELSE 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" _contador1 = 2000 flag2 = 1 ELSE Low led1 flag2 = 0 Endif Endif IF _contador2 = 0 THEN Toggle RB2 _contador2 = 10 Endif GOTO Main '**************************** ON Interrupt Save SYSTEM 'Guarda calculos intermedios y otros del sistema 'Detecta interrupción Timer1 IF PIR1.TMR1IF = 1 THEN 'Call _set_timer1(0xfc17) 'Recarga registros TMR1 para desborde 1mSeg. y borra PIR1.TMR1IF T1CON.TMR1ON = 0 'Para el contador del TMR1 TMR1H = 0xfc 'Recarga el contador byte alto TMR1L = 0x17 'Recarga el contador byte bajo T1CON.TMR1ON = 1 'Activa el contador del TMR1 PIR1.TMR1IF = 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 '******************************
...
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 adelanteCó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
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.
Prueba el código sin usar el timer y las interrupciones a ver si te funciona, por ir descartando.Buenos días dogflu66.Código: QBasic/QuickBASIC
'Pic16F628A, oscilador interno 4Mhz 'Configuración de fuses #define CONFIG = 0x3f50 Define CLOCK_FREQUENCY = 4 'Oscilador a 4Mhz 'Include "_FuncionesPic16F628A.bas" 'Include "_FunctionesTmrBase.bas" 'Call _setup_oscillator(_osc_4Mhz) PCON.OSCF = 1 'Oscilador interno 4Mhz '************************************************************ AllDigital ConfigPin RB0 = OUTPUT ConfigPin RB1 = OUTPUT ConfigPin RB2 = OUTPUT ConfigPin RA2 = INPUT ConfigPin RA3 = INPUT Symbol led1 = RB0 Symbol led2 = RB1 Symbol sw1 = RA2 Symbol sw2 = RA3 'Contadores para generar las bases de tiempos. _contador1 = 0 _contador2 = 0 'Flag de control flag1 = 0 flag2 = 0 WaitMs 100 Main: 'Temporizador no redisparable, para redisparable quitar flag1 = 0 'Para ser bloqueado por el anterior añadir "and flag2 = 0" _contador1 = 100 '0 flag1 = 1 ELSE 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" _contador1 = 200 '0 flag2 = 1 ELSE Low led1 flag2 = 0 Endif Endif IF _contador2 = 0 THEN Toggle RB2 _contador2 = 10 Endif WaitMs 1 IF _contador1 > 0 THEN _contador1 = _contador1 - 1 '_contador BT IF _contador2 > 0 THEN _contador2 = _contador2 - 1 '_contador BT GOTO Main
DominusDRREs 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.
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.
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.
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.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.
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.
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.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.
Gracias por los consejos muy oportunos.
saludos!
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!
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!
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.
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
[/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.
Estimado amigo, el código que acabé de compartir, es el del post # 72.
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
_1000ms CON 1*61 ; Conteos para 1seg con interrupciones cada 16.384ms ; T2s : 1*(1000/16.384) = 61 _2000ms CON 2*61 ; Conteos para 2seg con interrupciones cada 16.384ms ; T2s : 2*(1000/16.384) = 122 Pulsos VAR BYTE ContadorPulsos VAR BYTE ESPERAR_PRESIONAR_SW1 CON 0 CAPTURAR_PULSOS_PARA_TON CON 1 ESPERAR_TON CON 2 ESPERAR_PRESIONAR_SW2 CON CON 3 CAPTURAR_PULSOS_PARA_TOFF CON 4 ........... Main: EstadoTarea = ESPERAR_PRESIONAR_SW' Inicializo EstadoTarea LOWLED1' apago el led inicialmente Lazo: 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) > _2000ms) THEN HIGH LED1 EstadoTarea = ESPERAR_PRESIONAR_SW1 Endif CASE ESPERAR_PRESIONAR_SW2 IF SW2=0 THEN 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) > _1000ms) THEN LOWLED' apago el led EstadoTarea = ESPERAR_PRESIONAR_SW1 CON' regreso al primer estado Endif EndSelect GOTO Lazo: interpt: 'disable Pulsos = Pulsos + 1; INTCON.2 = 0 ' Reset timer interrupt flag RESUME
Estimado amigo, el código que acabé de compartir, es el del post # 72.
Solo funciona al soltar los botones.
DomunusDRR el post al que te refieres es el #70 y no el #72 como lo mencionas.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.
.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.
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
Interrupcion: Disable '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
Así es como está, yo no noto cuál es la diferencia.
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
Interrupcion: Disable '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
Así es como está, yo no noto cuál es la diferencia.
Entonces vi mal los archivos txt que enviaste en el comprimido.
Gracias Dominus DRR.
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
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 END SELECT END FUNCTION
Y desde el programa principal la puedes llamar:Código: QBasic/QuickBASIC
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:Código: QBasic/QuickBASIC
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:
Gracias Dominus DRR.
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
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 END SELECT END FUNCTION
Y desde el programa principal la puedes llamar:Código: QBasic/QuickBASIC
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:Código: QBasic/QuickBASIC
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:
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?