TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Vangeluz 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 !!!
-
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.
-
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:
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.
-
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:
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.
-
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.
-
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.
-
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:
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.