Autor Tema: Pulsador doble funcion a los 2 segundos presionados  (Leído 4025 veces)

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

Desconectado Vangeluz

  • PIC12
  • **
  • Mensajes: 74
    • Vangeluzweb
Pulsador doble funcion a los 2 segundos presionados
« en: 06 de Junio de 2012, 16:59:52 »
Hola. queria saber un ejemplo de como hacer un pulsador que al presionarlo normal se dirija a una rutina y si lo presiono por X segundos se dirija a otra rutina.

Por ej lo que tengo es:

; -------------------------- PULSADOR MANTENIDO 2 SEGUNDOS PARA UNA SEGUNDA OPCION ---------------------------


   LIST      P=16F84A
   INCLUDE      <P16F84A.INC>
   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

   CBLOCK  0x0C
   ENDC


; ZONA DE CÓDIGOS ********************************************************************
   
   status                        equ                        3h
   PORTA      equ      5h
   PORTB      equ      6h

      ORG   0
      bsf   status,5
      bsf   PORTA,3
      bcf   status,5

INICIO
      call   LCD_Inicializa         
      movlw   Mensaje2
      call   LCD_Mensaje         


      btfsc   PORTA,3
      goto   INICIO
      call   RETARDO      ; 50ms Y VUELVE

      btfsc   PORTA,3
      goto   INICIO
      call   RETARDO2      ; 50ms Y VUELVE

      btfsc   PORTA,3
      goto   FUNCION
      call   RETARDO2      ; MEDIO SEGUNDO Y VUELVE

      btfsc   PORTA,3
      goto   FUNCION
      call   RETARDO2      ; MEDIO SEGUNDO Y VUELVE
      
      btfsc   PORTA,3
      goto   FUNCION
      call   RETARDO2      ; MEDIO SEGUNDO Y VUELVE

      btfsc   PORTA,3
      goto   FUNCION
      call   RETARDO2      ; MEDIO SEGUNDO Y VUELVE Y COMPLETA 2 SEGUNDOS

; --------------- ENTRA EN PROGRAMACION
PROG               
      call   LCD_Borra         ; Borra la pantalla y se mantiene así durante
      call   Retardo_200ms      ; este tiempo.
      movlw   Mensaje0
      call   LCD_Mensaje      ; ====  PROGRAMACION  ====
      btfsc   PORTA,3
      goto   PROG
      goto   INICIO
      

FUNCION      
      call   LCD_Borra         ; Borra la pantalla y se mantiene así durante
      call   Retardo_200ms         ; este tiempo.
      movlw   Mensaje1
      call   LCD_Mensaje         ; ====  PRIMERA FUNCION  ====
      btfsc   PORTA,3
      goto   FUNCION
      goto   INICIO

RETARDO      
      call   50ms
      Return

RETARDO2      
      call   500ms
      Return

;----------------------------MENSAJES--------------------------
Mensajes
   addwf   PCL,F
Mensaje0                  ; Posición inicial del mensaje 0.
   DT "   Programacion", 0x00
Mensaje1                  ; Posición inicial del mensaje 1.
   DT "  < Atras >  ", 0x00   
Mensaje2                  ; Posición inicial del mensaje 2.
   DT "<  BIENVENIDO  >", 0x00


   INCLUDE  <LCD_4BIT.INC>
   INCLUDE  <LCD_MENS.INC>
   INCLUDE  <RETARDOS.INC>
   
   END

El Pulsador presionado normal va a la rutina FUNCION y si lo presiono por 2 segundos APROX. va a otra rutina llamada PROG  ( Programacion ), Lo que hice fue intentar hacer eso que ven pero fracase, salio cualquier cosa ... desde Ya muchas gracias a quien me da una mano !!!

« Última modificación: 06 de Junio de 2012, 17:16:52 por Vangeluz »
Vangeluz

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: Pulsador doble funcion a los 2 segundos presionados
« Respuesta #1 en: 06 de Junio de 2012, 17:59:15 »
Hola. queria saber un ejemplo de como hacer un pulsador que al presionarlo normal se dirija a una rutina y si lo presiono por X segundos se dirija a otra rutina.

El Pulsador presionado normal va a la rutina FUNCION y si lo presiono por 2 segundos APROX. va a otra rutina llamada PROG  ( Programacion ), Lo que hice fue intentar hacer eso que ven pero fracase, salio cualquier cosa ... desde Ya muchas gracias a quien me da una mano !!!



Lo que yo hago en estos casos es colocar el timer1 a correr y cuando suelten el boton verifico el tiempo que paso y luego si realizo la función que quiero.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Pulsador doble funcion a los 2 segundos presionados
« Respuesta #2 en: 07 de Junio de 2012, 06:49:16 »
Citar
Lo que yo hago en estos casos es colocar el timer1 a correr y cuando suelten el boton verifico el tiempo que paso y luego si realizo la función que quiero.

Pero TMR1 solo temporiza hasta 524.3ms a 4Mhz, esto esta bien para medir tiempos pequeños, de un encoder por ejemplo.

Para un boton que por ejemplo si se pulsa 2seg haga una cosa y si se pulsa mas tiempo haga otra:

Código: [Seleccionar]
btfss  boton    ;esta pulsado?
goto   $-1       ; no sigue chequeando
call     ANTIRREBOTES  ;temporizacion 20ms
btfss   boton     ;confirma que no fueron rebotes
goto   $-4     ;fueron rebotes va a principio
call   DEMORA   ;hacemos una demora de 2seg
btfss   boton    ;pasaron 2seg ¿esta pulsado?
goto  MENOS_2SEG  ;ya se solto, hacemos lo que haya que hacer con menos de 2seg
btfsc  boton   ;vamos a hacer lo que haya que hacer con mas de 2seg
goto  $-1    ; pero esperamos a que se suelte
goto   MAS_2SEG  ;estuvo pulsado mas de 2seg y ya se solto.

Bueno puede que tenga algun fallo ya que no lo verifique en el MPLAB, pero como idea creo que te vale.

Bueno hay mas maneras de hacerlo esta seria una, se podria hacer con desbordes de un TIMER o con temporizaciones mas pequeñas y repetirlas varias veces para no estar tanto tiempo con el procesador sin enterarse de nada, esto ya dependera del resto del programa.
« Última modificación: 07 de Junio de 2012, 07:08:01 por tapi8 »

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: Pulsador doble funcion a los 2 segundos presionados
« Respuesta #3 en: 07 de Junio de 2012, 11:36:39 »
Citar
Lo que yo hago en estos casos es colocar el timer1 a correr y cuando suelten el boton verifico el tiempo que paso y luego si realizo la función que quiero.

Pero TMR1 solo temporiza hasta 524.3ms a 4Mhz, esto esta bien para medir tiempos pequeños, de un encoder por ejemplo.

Para un boton que por ejemplo si se pulsa 2seg haga una cosa y si se pulsa mas tiempo haga otra:

Código: [Seleccionar]
btfss  boton    ;esta pulsado?
goto   $-1       ; no sigue chequeando
call     ANTIRREBOTES  ;temporizacion 20ms
btfss   boton     ;confirma que no fueron rebotes
goto   $-4     ;fueron rebotes va a principio
call   DEMORA   ;hacemos una demora de 2seg
btfss   boton    ;pasaron 2seg ¿esta pulsado?
goto  MENOS_2SEG  ;ya se solto, hacemos lo que haya que hacer con menos de 2seg
btfsc  boton   ;vamos a hacer lo que haya que hacer con mas de 2seg
goto  $-1    ; pero esperamos a que se suelte
goto   MAS_2SEG  ;estuvo pulsado mas de 2seg y ya se solto.

Bueno puede que tenga algun fallo ya que no lo verifique en el MPLAB, pero como idea creo que te vale.

Bueno hay mas maneras de hacerlo esta seria una, se podria hacer con desbordes de un TIMER o con temporizaciones mas pequeñas y repetirlas varias veces para no estar tanto tiempo con el procesador sin enterarse de nada, esto ya dependera del resto del programa.

Hola tapi,

si a eso me refiero, al terminar de soltar el "boton", podría preguntar cuantas veces se interrumpió el timer1 y aplicar su criterio, por ejemplo:

- Si se desbordó menos de 2 veces entonces tiempo fue menor a 1 segundo.
- Si se desbordó mas de 2 veces y menos de 4, se demoró entre 1 y 2 segundos.
.... y así sucesivamente.

El código en ASM se me olvido (tendría que repasar algunos comando y conceptos  :lol:), pero eso es lo que yo aplicaría si lo implementara en CCS, C18 o C30.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Pulsador doble funcion a los 2 segundos presionados
« Respuesta #4 en: 07 de Junio de 2012, 13:47:54 »
Si, contando varios desbordes con un contador, si se hace tambien. Si hay que atender a varias cosas es mejor opcion con un TIMER que por bucle.

Desconectado Vangeluz

  • PIC12
  • **
  • Mensajes: 74
    • Vangeluzweb
Re: Pulsador doble funcion a los 2 segundos presionados
« Respuesta #5 en: 07 de Junio de 2012, 15:47:18 »
Hola. queria saber un ejemplo de como hacer un pulsador que al presionarlo normal se dirija a una rutina y si lo presiono por X segundos se dirija a otra rutina.

El Pulsador presionado normal va a la rutina FUNCION y si lo presiono por 2 segundos APROX. va a otra rutina llamada PROG  ( Programacion ), Lo que hice fue intentar hacer eso que ven pero fracase, salio cualquier cosa ... desde Ya muchas gracias a quien me da una mano !!!



Lo que yo hago en estos casos es colocar el timer1 a correr y cuando suelten el boton verifico el tiempo que paso y luego si realizo la función que quiero.

.


Gracias Fido, primero que nada tratare de entender como trabaja el Timer1, para aplicar tu ejemplo que me compartes.
Vangeluz

Desconectado Vangeluz

  • PIC12
  • **
  • Mensajes: 74
    • Vangeluzweb
Re: Pulsador doble funcion a los 2 segundos presionados
« Respuesta #6 en: 07 de Junio de 2012, 15:50:22 »
Citar
Lo que yo hago en estos casos es colocar el timer1 a correr y cuando suelten el boton verifico el tiempo que paso y luego si realizo la función que quiero.

Pero TMR1 solo temporiza hasta 524.3ms a 4Mhz, esto esta bien para medir tiempos pequeños, de un encoder por ejemplo.

Para un boton que por ejemplo si se pulsa 2seg haga una cosa y si se pulsa mas tiempo haga otra:

Código: [Seleccionar]
btfss  boton    ;esta pulsado?
goto   $-1       ; no sigue chequeando
call     ANTIRREBOTES  ;temporizacion 20ms
btfss   boton     ;confirma que no fueron rebotes
goto   $-4     ;fueron rebotes va a principio
call   DEMORA   ;hacemos una demora de 2seg
btfss   boton    ;pasaron 2seg ¿esta pulsado?
goto  MENOS_2SEG  ;ya se solto, hacemos lo que haya que hacer con menos de 2seg
btfsc  boton   ;vamos a hacer lo que haya que hacer con mas de 2seg
goto  $-1    ; pero esperamos a que se suelte
goto   MAS_2SEG  ;estuvo pulsado mas de 2seg y ya se solto.

Bueno puede que tenga algun fallo ya que no lo verifique en el MPLAB, pero como idea creo que te vale.

Bueno hay mas maneras de hacerlo esta seria una, se podria hacer con desbordes de un TIMER o con temporizaciones mas pequeñas y repetirlas varias veces para no estar tanto tiempo con el procesador sin enterarse de nada, esto ya dependera del resto del programa.
.

Gracias Tapi, probare con esta opcion que me comentas a ver si me sale correctamente, ya que es la mas simple, por lo menos hasta ahora.
Vangeluz