Autor Tema: Anti rebote no funciona correctamente:(  (Leído 2261 veces)

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

Desconectado Moisés Sánchez

  • PIC10
  • *
  • Mensajes: 1
Anti rebote no funciona correctamente:(
« en: 26 de Junio de 2019, 20:37:43 »
Buenas tardes. Llevo varios días diseñando un programa para hacer que 4 displays muestren mi fecha de cumpleaños en los siguientes formatos:  Día/mes    mes/año

El funcionamiento en protoboard debe ser que muestre un formato u otro cambiándolo con un push button. El problema es que cuando presiono el push, va cambiando entre un formato y otro bastante rápido, de tal forma que se queda en el formato en que se deja de presionar el push.

¿Cómo puedo solucionarlo?
Estoy usando un PIC16F8A en lenguaje ensamblador.
Dejo mi código aquí:

;Etiquetas       Directivas      Variables       Comentarios
          #include      P16F84A.INC
          LIST      P=16F84A
          RADIX      HEX
          __config      _XT_OSC & _WDT_OFF & _PWRTE_ON
         
         
         
;area de declarar registros                   
num1          EQU         0x0C          ;2
num2          EQU         0x0D          ;1
num3          EQU         0x0E          ;0
num4          EQU         0x0F          ;7
          cblock      0x12
          endc
;cabecera de datos
          org         0

;Cuerpo del programa
INICIO          bsf         STATUS, 0x05
          movlw      0x10
          movwf      TRISA
          clrf      TRISB
          bcf         STATUS, 0X05
          clrf      num1
          clrf      num2
          clrf      num3
          clrf      num4
;numeros de la fecha         
          movlw      0x3F
          movwf      num1
          movlw      0xFD
          movwf      num2
          movlw      0x06
          movwf      num3
START   
;Display1      
          movf      num3,0
          movwf      PORTB
          bsf         PORTA,0
          call      DELAY1ms
          bcf         PORTA,0
         
;Display2
          movf      num3,0
          movwf      PORTB
          bsf         PORTA,1
          call      DELAY1ms
          bcf         PORTA,1
;Display3
          movf      num2,0
          movwf      PORTB
          bsf         PORTA,2
          call      DELAY1ms
          bcf         PORTA,2
;Display4         
          movf      num1,0
          movwf      PORTB
          bsf         PORTA,3
          call      DELAY1ms
          bcf         PORTA,3
         
          btfss      PORTA,4
          goto      START
          goto      START2
                   
         
START2
;DESPUES DEL BOTON         
;Display1      
          movf      num1,0
          movwf      PORTB
          bsf         TRISA,0
          call      DELAY1ms
          bcf         TRISA,0
      
;Display2
          movf      num1,0
          movwf      PORTB
          bsf         TRISA,1
          call      DELAY1ms
          bcf         TRISA,1
;Display3
          movf      num3,0
          movwf      PORTB
          bsf         TRISA,2
          call      DELAY1ms
          bcf         TRISA,2
;Display4         
          movf      num3,0
          movwf      PORTB
          bsf         TRISA,3
          call      DELAY1ms
          bcf         TRISA,3
         
          btfss      PORTA,4
          goto      START2
          goto      START
         
      
;Adicionales
boton          btfss      PORTA,4
          goto      boton
          goto      antirebote

antirebote       btfss      PORTA,4
          goto      antirebote
          goto      DELAYBOTTON
DELAYBOTTON
          bsf         PORTA,4
          call      DELAYms
          bcf         PORTA,4
          goto      boton
         
;TIME DELAY
          cblock
          DELAY
          DELAY2
          DELAY3
          endc
DELAYms         
          movlw      0XC8            
          movwf      DELAY2      
DELAY_Bms
          movlw      0XFA      
          movwf      DELAY         
DELAY_Cms
          nop             
          decfsz      DELAY,F      
          goto      DELAY_Cms      
          decfsz      DELAY2,F      
          goto      DELAY_Bms    
          return
          cblock
               DELAY1
               DELAY2.1
          endc
   
DELAY1ms         
          movlw      0X06            
          movwf      DELAY2.1      
DELAY_B
          movlw      0XF9      
          movwf      DELAY1         
DELAY_C
          nop             
          decfsz      DELAY1,F      
          goto      DELAY_C      
          decfsz      DELAY2.1,F      
          goto      DELAY_B    
          return
          end

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Anti rebote no funciona correctamente:(
« Respuesta #1 en: 26 de Junio de 2019, 23:13:41 »
Hola, puedes aplicar al menos dos soluciones, una por hardware, es decir añadir algún filtro o FLIP-FLOP R/S(poco práctico) pero funciona,  la otra alternativa es  por software.
Yo utilizo el siguiente criterio.
Cuándo se pulsa un botón, comienza a incrementar una variable, que debe tener un límite máximo, para no seguir contando.
Entonces si dicho valor es > que, aplicó la acción que requiero.
Cuándo el botón se suelta, la variable vuelve a cero.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Anti rebote no funciona correctamente:(
« Respuesta #2 en: 27 de Junio de 2019, 07:00:42 »
Una opcion es la que te dice Robert, la otra es tener una variable con un bit que podamos cambiar para poder identificar si el boton esta presionado o no.... Entonces tu programa seria algo asi:


Esta presionado el boton (boton real)?
NO -> Borro el bit de "boton presionado" en mi variable y salgo, aca es cuando detecto que salio
SI- > continuo
Esta activo el bit de "boton presionado"?
SI -> Salgo , ya que estaba en 1 antes,, eso quiere decir que se sigue presionando
NO -> continuo
Espero un ratito 10ms                       Se repite aca para que el delay no quede arriba y ocurra siempre
Esta presionado el boton real?
NO-> Salgo , ya que fue un rebote
SI -> continuo
Activo el bit de "boton presionado" en mi variable
Cambio la forma de mostrar
Salgo.



PD: No hay ninguna necesidad de usar BCF y BSF sobre tu entrada como lo estas haciendo.


 

anything