Duda sobre un anti-rebote

Hola, tengo una duda con este ejercicio "Diseñe un circuito anti-rebote que detecte rebotes de hasta 10 milisegundos de duración. Asuma que su reloj es 40KHz. Su diseño debe contener un divisor de frecuencia." a que se refiere que tenga una duración de 10ms y que puedo hacer con ese reloj. Tengo que implementarlo en VHDL ...
 
Muestra lo que llevas hecho y donde esta la duda.
 
Muestra lo que llevas hecho y donde esta la duda.

Hola, gracias por responderme. Lo que he investigado es que los 40 Khz es mi reloj inicial, y el ejercicio me dice que el anti-rebote detecte hasta 10 ms de duración.

Lo que hice fue:
1. tomar esos 10ms como el periodo de un ciclo de reloj (el cual sería mi nuevo reloj)
2. Hallar la frecuencia de eso que me dio 100 Hz (f = 1/10[ms] )
3. Halle el "modulo" (asi le dicen en mi clase de sistemas digitales) de la forma Reloj_actual/Reloj_nuevo.
es decir 40[kHz]/100[Hz] y eso me da 400 [adimensional] ese valor que me dio lo pasé a binario de tal forma que al implementar el contador del divisor de frecuencia que lleva el anti-rebote solo llegue hasta 400 y cuente un ciclo de reloj.

No sé si me hice entender, soy malo para explicarme y mi duda es ¿Lo que hice estará bien? aun no he implementado, lo empezaré hacer.
 
Hola, supongo por lo que explicas arriba, que se te pide que diseñes un circuito anti rebotes que sea inmune a rebotes de 10ms de período.
El reloj lo utilizas para tener una referencia del Delay que necesitas para lograr los 10ms de inmunidad al rebote.
En mi caso no manejo VHDL pero en C se utiliza un loop utilizando for(;;) para lograr x (equis) tiempo en el mismo estado y luego si ejecutar la acción.
Puedes también volver a comprobar el estado del pulsador por ejemplo para ver si se mantuvo en el mismo estado que hizo que se disparara.

Por ejemplo:
//Genero un delay especifico para la velocidad del micro en tu caso 40Khz por lo que debes calcular cuantos ciclos de reloj son necesarios para generar 10ms de delay
void Delay10ms(void){
for (a=0;a<10;a++){
Delay10KTCYx(10);
}

//Compruebo la entrada y utilizo el delay para evitar falsos disparos por rebotes.
if (Pulsador==1) then{
Delay10ms();
Accion();
}

Espero haberte ayudado.
 
lo que vos decis esta muy mal che, me huele no mas bien me apestá a C18 o XC8.

lo que el compañero queré es implementar en VHDL en un dispositivo logico programable.

lo que se hace es lo siguiente:

un antirrebote puede ser de 2 formas de la manera marrana que es atorar el sistema una cantidad X de tiempo una vez pisado el boton.

y la manera No marrana que es usar una base de tiempo definida, cuando se pisa el boton se va decrementando un contador y cuando este llega a 0 procede a hacer lo que debe hacer.

metodo 1:

pisas el boton , una vez pisado entras en un bucle cerrado puede ser una cuenta, una vez que acaba la cuenta "el boton podra estar rebotando en el proceso", el siguiente paso es hacer lo que se deba hacer ignorando ya el estado del boton.

ejemplo:

1.- inicio.
2.-si no piso boton vuelvo a inicio
3.- si piso boton voy a :

A.- hago una cuenta cerrada ignorando el boton, hasta que acabe mi cuenta.
B.- una vez acabada la cuenta procedo a hacer lo que tenga que hacer, prender unos leds por ejemplo.
C.- terminado lo que tengo que hacer vuelvo a inicio.

como veras en este ejemplo marrano es marrano por el hecho de que mientras hago la cuenta y lo que tenga que hacer estamos solamente enfocados a eso.

metodo 2:

este metodo necesita una base de tiempo definida y estaremos leyendo en este caso el estado del boton todo el tiempo mientras ejecutamos otras tareas "podria ser un PMW , una cuenta , leds que parpadean ,etc" mientras estas tareas pueden estar o no presentes una vez pisado el boton la base de tiempo empezara a decrementarse , si el decremento llega a 0 se podra ejecutar la tarea.

pero si se suelta el boton antes de llegar a 0 el la cuenta se suspende.

simple pero complicado.

ejemplo:

1.-declaramos una base de tiempo que se ejecutara siempre a una frecuencia que se necesite con un contador que decremente todo el tiempo.

2.-inicio
3.- leemos estado del boton si no pisamos cargamos el contador con digamos 255 y volvemos a inicio
4.-si el boton es pisado dejamos que el contador se decremente.
5.- si el contador llega a 0 procede a:

A.- hacer lo que tengamos que hacer ignorando el estado del boton
B.- una vez terminado lo que tengamos que hacer cargamos el contador con digamos 255.
C.- volvemos a inicio


como veras esos algoritmos aunque parescan similares No lo son pues la diferencia esta en que uno atora un proceso y el otro puede dejar que otros procesos continuen.
 
Hola a todos, estoy intentando diseñar un cto antirrebotes, que siga las premisas y el diseño dado ( adjunto imágenes)
el circuito antirrebotes a diseñar, le tengo que llamar debounce_module, y es el que irá instanciado en el kypd_controller que tengo que diseñar despues. Este cto antirrebotes, lo he diseñado como os muestro a continuación ( debounce_module), siguiendo la estructura que me han solicitado y que adjunto a este mensaje. por ejemplo, para decir que la tecla pulsada es la 4, tendríamos para ROW 1101 Y para COL 1110. La funcionalidad del circuito mostrado sería que los biestables realizan función de muestreo y las puertas lógicas la detección si los 4 valores de las salidas son iguales a 1 o iguales a 0. Si son iguales a 1 proporcionan a la salida del sistema secuencial final un nivel alto y si son los 4 iguales a 0, un nivel bajo. Habría que instanciarlo 4 veces, uno para cada una de las filas. En este caso, que muestro he comenzado para una única fila, pero no consigo que me funcione. Se os ocurre algo?
Gracias

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity debounce_module is
port (

RST : in std_logic;
CLK : in std_logic;
ROW_I : in std_logic;
CE : in std_logic;
Q_I : out std_logic);

end entity;
architecture rtl of debounce_module is
signal Q0 ,Q1 ,Q2 ,Q3 : std_logic := '0' ;
begin -- rtl
process ( CLK ) is
begin
if ( CLK 'event and CLK = '1' )
then Q0 <= ROW_I ;
Q1 <= Q0 ;
Q2 <= Q1 ;
Q3 <= Q2 ;
end if ;

end process ;
Q_I <= Q0 and Q1 and ( not Q2 );
Q_I <= Q1 and Q2 and ( not Q3 );
end Behavioral ;

end rtl;





 

Adjuntos

  • cto antirrebotes.JPG
    cto antirrebotes.JPG
    20.9 KB · Visitas: 11
  • teclado hexadecimal.JPG
    teclado hexadecimal.JPG
    22 KB · Visitas: 11
Varias cosas.
1) Formatea el codigo dentro de etiquetas (ayuda aquí).
2) Dinos el lenguaje, microcontrolador y demas que estas usando.
3) Y por ultimo, no entiendo cómo se conecta el teclado con ese circuito y el microcontrolador....
 
Hola a todos, estoy intentando diseñar un circuito antirrebotes, que siga las premisas y el diseño dado ( adjunto imágenes) , el circuito antirrebotes a diseñar, le tengo que llamar debounce_module, y es el que irá instanciado en el kypd_controller que tengo que diseñar despues. Éste circuito antirrebotes, lo he diseñado como os muestro a continuación ( debounce_module), siguiendo la estructura que me han solicitado y que adjunto a éste mensaje , por ejemplo, para decir que la tecla pulsada es la 4, tendríamos para ROW 1101 Y para COL 1110. La funcionalidad del circuito mostrado sería que los biestables realizan función de muestreo y las puertas lógicas la detección si los 4 valores de las salidas son iguales a 1 o iguales a 0.

Si son iguales a 1 proporcionan a la salida del sistema secuencial final un nivel alto y si son los 4 iguales a 0, un nivel bajo. Habría que instanciarlo 4 veces, uno para cada una de las filas. En este caso, que muestro he comenzado para una única fila, pero no consigo que me funcione. Se os ocurre algo?
Gracias

Código:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity debounce_module is
port (

RST : in std_logic;
CLK : in std_logic;
ROW_I : in std_logic;
CE : in std_logic;
Q_I : out std_logic);

end entity;
architecture rtl of debounce_module is
signal Q0 ,Q1 ,Q2 ,Q3 : std_logic := '0' ;
begin -- rtl
process ( CLK ) is
begin
if ( CLK 'event and CLK = '1' )
then Q0 <= ROW_I ;
Q1 <= Q0 ;
Q2 <= Q1 ;
Q3 <= Q2 ;
end if ;

end process ;
Q_I <= Q0 and Q1 and ( not Q2 );
Q_I <= Q1 and Q2 and ( not Q3 );
end Behavioral ;

end rtl;

El lenguaje es VHDL y utilizo el programa Vivado. Se me ha ocurrido que se podría plantear un sistema desplazador, para simular el antirrebotes, pero no se como plantearlo. Adjunto esta vez, con respecto a lo que me decías, el esquema general de conexión y la configuración de las 4 entidades.
En éste caso, lo que suqiero hacer es la configuración de la entidad debounce_module, que es la que tengo que diseñar para el circuito antirrebotes.
 

Adjuntos

  • cto antirrebotes.JPG
    cto antirrebotes.JPG
    20.9 KB · Visitas: 8
  • diseño a realizar.JPG
    diseño a realizar.JPG
    51.2 KB · Visitas: 8
  • esquema general.JPG
    esquema general.JPG
    59.9 KB · Visitas: 7
  • teclado hexadecimal.JPG
    teclado hexadecimal.JPG
    22 KB · Visitas: 6
Por lo que sé, el sistema antirebotes se suele hacer por software. Consiste en asegurarse que la lectura de un pulsador (en tu caso serían todos, por filas) no cambia su estado durante el tiempo que duran los rebotes, entre 1mS y 10mS normalmente, de manera que la lectura del estado (0-1) sea estable. Esto simplifica el hardware y da excelentes resultados.
 
metodo 2:

este metodo necesita una base de tiempo definida y estaremos leyendo en este caso el estado del boton todo el tiempo mientras ejecutamos otras tareas "podria ser un PMW , una cuenta , leds que parpadean ,etc" mientras estas tareas pueden estar o no presentes una vez pisado el boton la base de tiempo empezara a decrementarse , si el decremento llega a 0 se podra ejecutar la tarea.

pero si se suelta el boton antes de llegar a 0 el la cuenta se suspende.

simple pero complicado.

ejemplo:

1.-declaramos una base de tiempo que se ejecutara siempre a una frecuencia que se necesite con un contador que decremente todo el tiempo.

2.-inicio
3.- leemos estado del boton si no pisamos cargamos el contador con digamos 255 y volvemos a inicio
4.-si el boton es pisado dejamos que el contador se decremente.
5.- si el contador llega a 0 procede a:

A.- hacer lo que tengamos que hacer ignorando el estado del boton
B.- una vez terminado lo que tengamos que hacer cargamos el contador con digamos 255.
C.- volvemos a inicio


como veras esos algoritmos aunque parescan similares No lo son pues la diferencia esta en que uno atora un proceso y el otro puede dejar que otros procesos continuen.
Saludos Trilo-Byte.
Me parece genial esa manera de hacer un antirrebotes, más que nada porque ignora el estado del botón.
Soy novato en esto de los microcontroladores, me estoy iniciando en PicBasic Pro.
Si no es mucha molestia, podrías indicar con un ejemplo sencillo, de ser posible en PBP, como se lo implementa, porque no me queda claro eso de declarar una base de tiempo y un contador que decremente.
Gracias de antemano.
Hasta pronto!
 
Se refiere a implementar un contador descendente que solo funciona cuando el botón es presionado, decrementando hasta llegar a 0, luego realiza la tarea del botón y vuelve el contador al numero inicial.
 
Atrás
Arriba