Autor Tema: anti rebote pic 16f876a  (Leído 356 veces)

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

Desconectado RV-BROADCAST

  • PIC10
  • *
  • Mensajes: 6
anti rebote pic 16f876a
« en: 04 de Noviembre de 2020, 23:50:48 »
hola grupo...
estoy usando el programa CC copiler pero al momento de poner pulsadores y simular  tiene rebotes los pulsadores,
por favor si alguno de ustedes me puede apoyar con un anti rebote estoy usando el pic 16f876a
mi proyecto es de que cuando presionas el pulsador 1 sube  los mhz y cuando presionas el pulsador 2 baje los mhz eso muestra en la pantalla lcd, pero en mi caso presiono el pulsador 1 se pone como si le daría varias veces al pulsador.

 
#include <16f876a.h>
#fuses hs, nowdt
# use delay (clock=4M)

#include "lcd_flex.c"
#include <internal_eeprom.c>

#define setfreq input(pin_b0)
#define sobe input(pin_b1)
#define desce input(pin_b2)

#define data  pin_b5
#define clock  pin_b6
#define eneble pin_b7


#define led pin_b4
#define roe pin_b3

b0,b1 y b2 son los tres pulsadores

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 487
Re:anti rebote pic 16f876a
« Respuesta #1 en: 05 de Noviembre de 2020, 12:04:23 »
Yo lo hago por software mediante bucles de espera. Un ejemplo muy superfluo de lo tuyo y considerando que las conexiones de los pulsadores son en pullup sería:

 
Código: C
  1.  
  2. while(1) {     // bucle infinito.  
  3.  
  4.   if (!sobe) {   // Si se pulsa botón de subir.
  5.     mhz++;     // incrementa los megahertzios.
  6.     while(!sobe); // permanece a la espera hasta que se suelte el pulsador.
  7.   }
  8.  
  9.   if (!desce) { // Si se pulsa botón bajar.
  10.     mhz—;       // Baja los megahertzios
  11.     while(!desce);  // espera a que se suelte el pulsador.
  12.   }
  13. }
  14.  

 La pega de este método es que el programa queda congelado mientras no sueltes el pulsador.

 

Desconectado alexhumbertoa

  • PIC10
  • *
  • Mensajes: 49
Re:anti rebote pic 16f876a
« Respuesta #2 en: 06 de Noviembre de 2020, 01:33:40 »
Hola Remi04, tu código tiene sentido pero solo es la mitad del trabajo, ya que solo estas manejando la presión del pulsador, que puede tener rebotes pero también hay que manejar la liberación del pulsador porque cuando sueltas el pulsador también pueden generarse rebotes indeseados, ademas lo que dijiste es cierto, debes crear un algoritmo antibloqueo, es decir que el programa no quede bloqueado si mantienes pulsado el botón.
La protoboard es la mejor amiga del ruido.

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 487
Re:anti rebote pic 16f876a
« Respuesta #3 en: 06 de Noviembre de 2020, 06:04:31 »
Hola Remi04, tu código tiene sentido pero solo es la mitad del trabajo, ya que solo estas manejando la presión del pulsador, que puede tener rebotes pero también hay que manejar la liberación del pulsador porque cuando sueltas el pulsador también pueden generarse rebotes indeseados, ademas lo que dijiste es cierto, debes crear un algoritmo antibloqueo, es decir que el programa no quede bloqueado si mantienes pulsado el botón.

 Hola. En verdad no es la mitad del trabajo, sino una forma de hacerlo que te puede servir en según qué condiciones.

 Evidentemente si no quiero detener el flujo del programa hago ya un algoritmo que compruebe dos cosas:

  1- que la pulsación es firme mediante una iteracción que lo lea durante un tiempo, ejemplo 100 lecturas consecutivas del pulsador a nivel bajo para confirmar que es una pulsación firme. ( esto hay que calcularlo según velocidad cpu y objetivo).  Una vez aceptada la pulsación, ejecutar las instrucciones asociadas al pulsador y marcar mediante una bandera la condición de que el pulsador ha sido pulsador y se han ejecutado las acciones asociadas.

  2- No volver a efectuar ninguna operación con ese pulsador antes de esperar primero a que se haya soltado. El flujo del programa no se detiene, simplemente si está pulsado se comprueba la bandera anterior, y si sigue activa saltamos todas las operaciones asociadas a ese pulsador.   Una vez que se suelta el pulsador, hacemos la misma operación, comprobar que la suelta es firme mediante una iteracción que lo lea varias veces consecutivas.  Una vez que resolvemos que se ha soltado, ejecutamos todas las operaciones asociadas a la suelta del pulsador “si las hubiere” y bajamos la bandera.

  Y eso es todo.

  En según que aplicaciones he utilizado incluso un Timer del pic para realizar este menester.

  Y ya para rematarlo, se puede utilizar también antirebote hardware, pero no es necesario casi nunca.

Desconectado osposto

  • PIC10
  • *
  • Mensajes: 24
Re:anti rebote pic 16f876a
« Respuesta #4 en: 06 de Noviembre de 2020, 12:42:45 »
Buenos días gente. El antirrebote para un pushbutton, sea el que sea, sólo ocupa unos cuantos milisegundos en los que hay que controlar que no se produzca un cambio crítico en el estado que llama a la rutina de antirrebote. En mi caso en particular, los tiempos que utilizo rondan los 80ms por cada vez que es oprimido un botón, como tal. En el caso de un sensor, tipo reed switch, por ejemplo, pueden reducirse estos tiempos en funcion de la necesidad, peeeero hay que ser cuidadoso. Esto va a depender de la necesidad, de la aplicación.

De todos modos, dependiendo también del tamaño de la aplicación (del programa para el micro) existen dos posibilidades: 1) que el cambio en el pin genere una interrupción, para lo que el tratamiento de la misma tendrá su proceso específico (óptimo para procesos largos y complejos), o 2) que el proceso realice el control del pin en cada ciclo, y que al detectar el cambio realice alguna tarea específica.

Pero en cualquiera de los casos, debe darse al evento el tiempo suficiente para asegurarse que no es un roce fallido, una cuestión de ruido o algo extraño asociado al funcionamiento del botón.

En mi caso, lo resuelvo de la siguiente manera (en lenguaje descriptivo):

1) Control estado del botón

2) Si se detecta cambio (boton oprimido): Delay de 40ms para controlar si hay varianza, si en esos 40ms no detecta cambio, vuelve a tomarse 40ms para controlar cambio, y así sucesivamente, hasta que aparezca el cambio (Botón suelto).

3) Devuelve 1 al evento detectado (boton oprimido).

2-a) Si al final de los 40ms detectó cambio, se descarta el proceso

3-a) Devuelve 0 (botón suelto)


Como podrán ver, en este caso, el resultado del estado del botón, se obtiene en el flanco de salida, al finalizar la rutina

Este tiempo de 40ms es el apropiado para un tact switch convencional (en realidad para todos los dispositivos tipo push button), pero puede modificarse.

Es necesario considerar el funcionamiento del botón, el efecto que realiza, pues puede ya sea poner a 0 una pata del micro, o poner un 1 (VDD) en la misma. Para eso se realizan 2 ramas de análisis en función del tipo que se elija.

También podría hacerse una variación (que no le encuentro mucho sentido) para que el cambio se haga en el flanco de entrada, pero eso aparte de complicar el tema, lo transforma en muchísimo más susceptible a errores.

Espero que sirva. Saludos.
No sé lo que quiero, pero lo quiero ya. - Sumo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8004
Re:anti rebote pic 16f876a
« Respuesta #5 en: 06 de Noviembre de 2020, 13:32:52 »
Seamos sinceros.

Para la mayoría de las aplicaciones No es necesario atender a ambas ocurrencias, es decir con solo atender a la primera es mas que suficiente, ya que por demoras del programa etc, tenes de sobre demora para considerarlo rebote o no. A no ser que sea un programa tan corto que realmente no le afecte 10ms de delay.

Atendiendo a todo lo que ustedes quieren:
- No sea bloqueante
- Tenga en cuenta ambos flancos
- ETC lo cual incluye no poner componentes por fuera como anti-rebote (ideal cuando tenes pocos botones)

Lo mas aconsejable es un Timer controlando los puertos por algun cambio. Y que sea dentro de la interrupcion del timer quien controle cuantas "interrupciones" se consideran como valido un estado o no. De esta forma logran todo lo que querian lograr antes. Y ademas lo pueden considerar "programable"

Desconectado Robert76

  • PIC18
  • ****
  • Mensajes: 330
Re:anti rebote pic 16f876a
« Respuesta #6 en: 06 de Noviembre de 2020, 19:40:47 »
Hola, yo en lo personal para lograr un antirebotes por soft.
Lo que hago es leer el pulsador, si la condición es ok, entonces comienzo la cuenta de una variable, con tope en 250 por ejem.
Entonces si la cuenta alcanza 249, se ejecuta la condición que sea.
En caso que el pulsador se libere esa variable vuelve a 0.
Normalmente aplico ésto usando un pequeño delay de 1 o 2ms al final del programa, ésto me sirve para cronograr los tiempos que uso incrementando éstas variables.


 

anything