Autor Tema: Control de tiempo mediante fichas.  (Leído 3843 veces)

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

Desconectado cmdima

  • PIC10
  • *
  • Mensajes: 3
Control de tiempo mediante fichas.
« en: 22 de Marzo de 2015, 09:08:39 »
Hola a todos! estoy bastante complicado con un proyecto y necesito ayuda. Me puse a programar pic con picbasic y cai en un punto donde no encuentro salida.
Si bien es algo simple me esta llevando mucho tiempo y no lo puedo sacar...

Tengo dos pulsadores que cada uno activa una maquina que enciende unas luces por un cierto tiempo. Yo quiero sacar este pulsador y reemplazarlo por reles accionados por un fichin, de esos de video juego.

La idea de lo que quiero hacer con el pic es que cuando ingreso una ficha la primera vez me active el primer pulsador, luego deberia esperar X tiempo, por ejemplo 2 minutos y volver a cero y si despues de que introdujo la primer ficha y antes de que se acabe el tiempo meto otra, se active el otro pulsador.

Suena  facil el tema que lo veo dificil y no encuentro la vuelta con el programa. Programar el pulsador y el accionamiento de la primer salida es facil, se me complica a la hora de hacer la espera.

Probe de mil formas, lo compilo en pbasic y despues lo corro en proteus. me queda de forma secuencial, la espera no existe...

les copio el codigo y espero comentarios...

'INICIALIZACION DE REGISTROS
TRISA=0
TRISB=$FF
PORTA=0

'PROGRAMA
inicio:
    if portb.0=1 then
    goto secuencia
    endif
    goto inicio
    end
secuencia:
    high porta.0
    PAUSE 500
    LOW porta.0
    k=0
    repeat
        k=k+1
        if portb.0=1 then
        goto t12
        endif
    until k=1000
    goto inicio
t12:
    high porta.1
    PAUSE 500
    LOW porta.1
    goto inicio

de verdad que necesito ayuda urgente, esto es importante porque es para un negocio.

Saludos y gracias!
« Última modificación: 23 de Marzo de 2015, 11:42:15 por dogflu66 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: auxilio!
« Respuesta #1 en: 22 de Marzo de 2015, 09:17:40 »
Deberias de empezar a estudiar sobre las interrupciones, de esa forma podrias tener como entrada RB0 y ante un flanco positivo entre a la interrupcion.

La primera vez que entre pondras un flag a 1 , luego cuando entres de nuevo y el flag este puesto a uno significa que "se presiono el segundo pulsador" y en tu programa principal simplemente preguntas por los flags y actuas acorde al mismo

Si quisieras tambien podrias usar una interrupcion con un timer de esa forma tenes un tiempo mas exacto y mayor velocidad de respuesta en las salidas.

Lamentablemente yo no se BASIC asi que no te puedo ayudar mas que de lo que te estoy diciendo
« Última modificación: 23 de Marzo de 2015, 11:44:47 por dogflu66 »

Desconectado cmdima

  • PIC10
  • *
  • Mensajes: 3
Re: auxilio!
« Respuesta #2 en: 22 de Marzo de 2015, 10:36:07 »
Me pondre entonces con las interrupciones...

Como quedaria en ensamblador?

Desconectado jansuini

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 566
Re: auxilio!
« Respuesta #3 en: 22 de Marzo de 2015, 18:20:00 »
Buenas:
No se si interpreté bien tu problema.-
A ver si me explico paso a paso:
1-Cuando inserto una ficha ,una entrada del micro detecta un cambio de estado
2-Con este cambio de estado el micro genera una salida que encenderá un relé durante 2 minutos.-
3-si ,durante estos 2 minutos se detecta un cambio de estado en otra entrada ,se debe activar otra salida.-

Si estamos de acuerdo sobre el funcionamiento ,lo que debés hacer es :
1-una rutina para verificar la inserción de la primera ficha.-
2- Cuando se produce la inserción y se verifica el cambio de estado ,forzas la salida para activar el primer rele
3- ejecutar un FOR-NEXT  que dentro tenga insruciones pause cortas ,que sumadas den el tiempo que necesitas ej: 240 PAUSE de 0,5 segundos ,osea 120 segundos=2 minutos
4-Dentro de este FOR-NEXT ,aparte de la rutina PAUSE debería ir una rutina que verifique el cambio de la otra ficha .Si verifica cambio forzas la salida del otro relé y cuntinúa la rutina de FOR-Next.-

Espero me hayas entendido
Sdos.
Jorge

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: auxilio!
« Respuesta #4 en: 22 de Marzo de 2015, 19:00:45 »
El tema tuyo es que tenes que hacer una animacion + sensar + tener en cuenta el tiempo.

en ASM quedaria algo asi ( aviso, esto esta hecho rapido y tiene muchos comentarios )

org 0x0
   goto config
org 0x4
   goto interrupcion

interrupcion
     ;Salvo contexto ( W , STATUS )
     Pregunto si es el TMR el que se disparo
          Si es el timer  entonces recargo el timer y tengo un contador para contar varias interruciones asi llegar al tiempo exacto, al llegar a la cantidad de veces que entra activo una flag (flagtimer)
     Pregunto si fue por alguna entrada
          Si es por alguna entrada, si es le primer activo un flag (flag_primero) y si es esta en 1 flag_primero y tambien en 0 flagtimer , significa que se presiono nuevamente antes que se termine el tiempo, entonces activo otro flag  (flagsegundo)
     ; Vuelvo a restaurar el contexto
     Salgo

Config
     Aca configuracion de puerto
     Configuracion de interrupciones
     Config de timer
     Activacion de interrupcion global

Inicio
     flagprimero = 1 ?
          SI -> flagsegundo = 1 ?
                        Si -> Hago la animacion de ambos
                   Cierro IF
           NO ->  Hago la animacion de cuando se presiona solo
      Cierro IF
      flagtimer = 1 ?
           SI -> Hago flagprimero igual a 0 y tambien flagsegundo
      Cierro IF
      Aca animacion general
FiN

Desconectado cmdima

  • PIC10
  • *
  • Mensajes: 3
Control de tiempo mediante fichas.
« Respuesta #5 en: 22 de Marzo de 2015, 22:19:45 »
Jansuini, la idea es la siguiente:

1_ meto una ficha, una entrada del micro detecta un cambio de estado
2_ el cambio de estado genera una salida (esta salida accionaría un rele)
3_ espero un tiempo X, por ejemplo 2 o 3 minutos
4_ si durante ese tiempo no detecta que se introduce una nueva ficha, fin del programa
5_ si durante ese tiempo detecta que se introduce una nueva ficha (cambio de estado del mismo pin del punto 1) se detecta un cambio de estado
6_ este otro cambio de estado genera otra salida que accionaría otro rele.

Lo hice con el for, pero llegue al maximo que soporta el programa y por lo qeu puedo ver con el proteus es casi para que funcione hay que introducir las fichas casi al mismo tiempo...

Estoy estudiando de generar una interrupcion mientras espera o cuenta.
« Última modificación: 24 de Marzo de 2015, 07:54:56 por dogflu66 »

Desconectado Daikataro

  • PIC10
  • *
  • Mensajes: 22
Re: Control de tiempo mediante fichas.
« Respuesta #6 en: 25 de Marzo de 2015, 04:34:26 »
Generar una interrupción, particularmente con RB0, sea donde sea es una apuesta segura; una interrupción tiene una altísima jerarquía y el PIC abandonará lo que sea que esté haciendo para atenderle hasta encontrar la línea "resume", de manera que es muy recomendable que efectivamente uses RB0 para detección de fichas. Ahora entrando en materia aquí te dejo un algoritmo sumamente sencillo:

-La interrupción detecta una ficha, es contabilizada y activa una bandera de 1 bit que indica que hay 1 ficha depositada. Usas esa misma bandera para activar la señal (señal = bandera)
-Una subrutina de contador funciona así: si está activada tu bandera llama a la subrutina la cual lo único que hace es esperar 1ms (aprox 994us si REALMENTE te interesa que sean 2 minutos a juro) y posteriormente incrementar un contador. Cada vez que ese contador llegue a 1000 (1s) se reinicia e incrementa a su vez otro contador, el cual llegará por ejemplo hasta 120 (2 min).
-Si ese contador alcanza 120, todo se reinicia a 0 (los dos contadores y se baja la bandera) y empiezas nuevamente. Si ese contador es menor a 120 y se detecta una nueva interrupción, subes una nueva bandera que indica otra ficha depositada.

Un código MUY a grosso modo sería:

loop:
salida1=bandera1
salida2=bandera2
if bandera1=1 then gosub contador
goto loop

contador:
waitms 1
cuenta1 = cuenta1+1
if cuenta1 >= 1000 then
cuenta1=0
cuenta2 = cuenta2+1
endif

if cuenta2>=120 then reinicio todo a cero
return

On interrupt
if bandera1 = 0 then subo bandera1
else subo bandera2
endif
resume

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Control de tiempo mediante fichas.
« Respuesta #7 en: 09 de Junio de 2015, 18:55:11 »
Hola a todos! estoy bastante complicado con un proyecto y necesito ayuda. Me puse a programar pic con picbasic y cai en un punto donde no encuentro salida.
Si bien es algo simple me esta llevando mucho tiempo y no lo puedo sacar...

Tengo dos pulsadores que cada uno activa una maquina que enciende unas luces por un cierto tiempo. Yo quiero sacar este pulsador y reemplazarlo por reles accionados por un fichin, de esos de video juego.

La idea de lo que quiero hacer con el pic es que cuando ingreso una ficha la primera vez me active el primer pulsador, luego deberia esperar X tiempo, por ejemplo 2 minutos y volver a cero y si despues de que introdujo la primer ficha y antes de que se acabe el tiempo meto otra, se active el otro pulsador.

Suena  facil el tema que lo veo dificil y no encuentro la vuelta con el programa. Programar el pulsador y el accionamiento de la primer salida es facil, se me complica a la hora de hacer la espera.
Te vendo la placa ya armado si queres....
Probe de mil formas, lo compilo en pbasic y despues lo corro en proteus. me queda de forma secuencial, la espera no existe...

les copio el codigo y espero comentarios...

'INICIALIZACION DE REGISTROS
TRISA=0
TRISB=$FF
PORTA=0

'PROGRAMA
inicio:
    if portb.0=1 then
    goto secuencia
    endif
    goto inicio
    end
secuencia:
    high porta.0
    PAUSE 500
    LOW porta.0
    k=0
    repeat
        k=k+1
        if portb.0=1 then
        goto t12
        endif
    until k=1000
    goto inicio
t12:
    high porta.1
    PAUSE 500
    LOW porta.1
    goto inicio

de verdad que necesito ayuda urgente, esto es importante porque es para un negocio.

Saludos y gracias!


 

anything