реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Новичковое: дребезг кнопок
ReedCat
сообщение Jan 25 2008, 09:48
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 14-01-08
Из: Москва
Пользователь №: 34 069



Приветствую!

Начал пробовать свои силы в работе с FPGA.
Схемотехникой немного занимался, но очень давно (ещё когда PLM были "будущим электроники", а не её настоящим), поэтому сразу стали возникать "вопросы новичка". Буду признателен за разъяснения.

Итак, дано: макетная плата с Spartan-3E, ISE Webpack.
Прогоняю технологическую цепочку, чтобы понять, как "оно" работает, на примитивном тесте: светодиодиками на макетной плате помигать. Мигает. Дальше хочу задействовать имеющуюся кнопку для управления процессом (выключения светодиодика).

Придумывается что-то типа:


reg ONOFF;

...
always @(posegde clk) if ( ~ butt) ONOFF = ~ ONOFF;
...

assign LED = ONOFF & .... ;

И "меня терзают смутные сомнения", придуманная конструкция явно неустойчива к "дребезгу" контактов кнопки.
Какой стандартный ход применяют те, кто уже имеет опыт? Делят такт и опрашивают реже? А что если единственный опрос придётся как раз на время дребезга?


Посоветуйте, пожалуйста.
Go to the top of the page
 
+Quote Post
Liseev
сообщение Jan 25 2008, 10:00
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 99
Регистрация: 27-10-07
Из: СПб
Пользователь №: 31 797



Во-первых частоту clk нужно подобрать такую, чтобы переходные процессы (дребезг) по длительности не превышали ее период, порядка 50 - 100 Гц, во-вторых дабы избежать случайного защелкивания неверного уровня, нужно использовать как минимум 2 регистра, защелкивающие сигнал с разницей по времени в один период clk. Если оба регистра защелкнули одинаковое значение - принимайте новое состояние кнопки
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jan 25 2008, 10:02
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(ReedCat @ Jan 25 2008, 12:48) *
Приветствую!

Итак, дано: макетная плата с Spartan-3E, ISE Webpack.
Прогоняю технологическую цепочку, чтобы понять, как "оно" работает, на примитивном тесте: светодиодиками на макетной плате помигать. Мигает. Дальше хочу задействовать имеющуюся кнопку для управления процессом (выключения светодиодика).

И "меня терзают смутные сомнения", придуманная конструкция явно неустойчива к "дребезгу" контактов кнопки.
Какой стандартный ход применяют те, кто уже имеет опыт? Делят такт и опрашивают реже? А что если единственный опрос придётся как раз на время дребезга?
Посоветуйте, пожалуйста.


1. сдвиговый регистр. сдвигаете сигнал, когда все выходы 1, значит 1. Или реверсивный счетчик. два уровня ниже или равно нижней планке - 0, выше или равно верхней - 1.
2. Таймер. запускается сигналом и блокирует поступление сигнала на время.
3. Микропроцессор...

Про RC-цепочки - забудьте!


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
ReedCat
сообщение Jan 25 2008, 10:18
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 14-01-08
Из: Москва
Пользователь №: 34 069



Цитата(Liseev @ Jan 25 2008, 13:00) *
Во-первых частоту clk нужно подобрать такую, чтобы переходные процессы (дребезг) по длительности не превышали ее период, порядка 50 - 100 Гц,

понятно, делим клок.
Цитата
во-вторых дабы избежать случайного защелкивания неверного уровня, нужно использовать как минимум 2 регистра, защелкивающие сигнал с разницей по времени в один период clk. Если оба регистра защелкнули одинаковое значение - принимайте новое состояние кнопки

и берем два отсчёта.

Спасибо, буду пробовать



Цитата(iosifk @ Jan 25 2008, 13:02) *
1. сдвиговый регистр. сдвигаете сигнал, когда все выходы 1, значит 1.

Не осознал. sad.gif Можно поподробнее.
Цитата
Или реверсивный счетчик. два уровня ниже или равно нижней планке - 0, выше или равно верхней - 1.

Это понял. smile.gif
Цитата
2. Таймер. запускается сигналом и блокирует поступление сигнала на время.

Это тоже понял. Чуть в другом виде правда, стробирование "медленным" клоком. То, что уже порекомендовали.
Цитата
3. Микропроцессор...

Не очень понял. sad.gif Что "микропроцессор"? На прерывание кнопку повесить? Там с дребезгом ещё хуже будет. sad.gif Циклом программным опрашивать?

Цитата
Про RC-цепочки - забудьте!


Хех... Уже забыл smile.gif


Спасибо!
Go to the top of the page
 
+Quote Post
sazh
сообщение Jan 25 2008, 10:24
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(iosifk @ Jan 25 2008, 13:02) *
1. сдвиговый регистр. сдвигаете сигнал, когда все выходы 1, значит 1. Или реверсивный счетчик. два уровня ниже или равно нижней планке - 0, выше или равно верхней - 1.
2. Таймер. запускается сигналом и блокирует поступление сигнала на время.
3. Микропроцессор...

Про RC-цепочки - забудьте!


А если таких кнопок - за 100 будет?
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jan 25 2008, 10:39
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(sazh @ Jan 25 2008, 13:24) *
А если таких кнопок - за 100 будет?

А если кнопок будет много, то их собирают в матрицу и матрицу сканируют. Память, счетчик и сумматор-вычитатель (аккумулятор)...
Делают 100 ячеек памяти для промежуточного результата. На нужном такте читают память и делают инкремент или декремент и результат пишут обратно в память.
Ресурсы:
100 ячеек памяти, счетчик адресов, сумматор-вычитатель, регистр, автомат на несколько состояний...

Как видите, абсолютно ничего сложного....

А простейший фильтр - это сдвиговый регистр, с него все выходы и вход подаются на И, оттуда на S-вход триггера. Также все сигеалы подаются на ИЛИ-НЕ, оттуда на вход К триггера. При всех "1" в сдвиговом регистре, триггер переключится в 1, при всех нулях - в "0"...
Реверсивный счетчик с двумя уровнями - это понятно.

Ну а микроконтроллер - это если он уже есть в проекте. Обработка кнопки программная, как обычно. Просто я всегда представлял, что проект делается не только для обработки одной кнопки...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
ReedCat
сообщение Jan 25 2008, 11:11
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 14-01-08
Из: Москва
Пользователь №: 34 069



Цитата(iosifk @ Jan 25 2008, 13:39) *
Ну а микроконтроллер - это если он уже есть в проекте. Обработка кнопки программная, как обычно. Просто я всегда представлял, что проект делается не только для обработки одной кнопки...


В проекте, конечно, кнопка исчезающе малая деталь. Но нужная иногда. smile.gif

Что же касается микроконтроллера, то пока просветления не могу достичь.
Программно на нем сделать стробирование и/или мажоритарную обработку?
Но это нужно вешать в обработчик таймерного прерывания, которому, обычно, и так есть чем заняться.
Чем это может оказаться лучше решения, если "дребезг" сначала убрать схемно (накладные расходы вроде небольшие?) и уж потом заводить сигнал на порт микроконтроллера для считывания (а попутно еще на линию прерывания, чтобы поллингом его не долбить)?
Go to the top of the page
 
+Quote Post
sazh
сообщение Jan 25 2008, 11:29
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(iosifk @ Jan 25 2008, 13:39) *
Просто я всегда представлял, что проект делается не только для обработки одной кнопки...


У кого как.
Я хотел сказать, что кроме программного подхода есть простой железный.
У Титце и Шенка расписан. стр.359
R_S триггер и два резистора. Правда при наличии трехпозиционной кнопки.
Все таки уверенность должна быть. Что сработает когда надо.

module drebezg /// dff
(
input r_n, //Weak Pull-Up Resistor == on
input s_n, //Weak Pull-Up Resistor == on
output reg out
);

wire clk = 1'b1;

always@ (posedge clk or negedge r_n or negedge s_n)
begin
if (r_n == 1'b0) out <= 1'b0;
else if (s_n == 1'b0) out <= 1'b1;
else out <= 1'b0;
end

endmodule
Go to the top of the page
 
+Quote Post
rv3dll(lex)
сообщение Jan 25 2008, 11:34
Сообщение #9


Полное ничтожество
*****

Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354



--filtrovanije dannih luart
process (Bus2IP_Clk) --filtr po wr_s
begin
if Bus2IP_Clk = '1' and Bus2IP_Clk'event
then
wr_s_del_line <= wr_s & wr_s_del_line(0 to 7);
if wr_s_del_line(1 to 8) = "11111111"
then
wr_s_filtr <= '1';
elsif wr_s_del_line(1 to 8) = "00000000"
then
wr_s_filtr <= '0';
end if;
end if;
end process;
Go to the top of the page
 
+Quote Post
maxfox2k
сообщение Jan 25 2008, 11:48
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 14-09-05
Пользователь №: 8 553



обычно достаточно сканировать 20 - 50 ms интервалами, без всяких дополнительных проверок. смотря что за кнопка.

rc цепочка нужна, если не желаете спалить себе чип электростатикой.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Jan 25 2008, 12:44
Сообщение #11


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Я на железном уровне делал так.
1. Оценивал возможное время дребезга сигнала по максимуму.
2. Делал регистр сдвига (хватает 2-4 сдвигов): на вход данных подавал сигнал, в качестве тактового сигнала использовал некоторую частоту. Она считается Fc<= 1/Tдребезга * Количество_сдвигов
3. Выходы регистра сдвига соединял по И.
Выход И - это сигнал без дребезга.
Что-то типа.
//-----------------------------------------------
always @ (posedge PhaseCLK[0])
begin
tempReg[5:3]<={tempReg[4:3],tempReg[0]};
end

assign temp=tempReg[5]&tempReg[4]&tempReg[3]&tempReg[0];
//--------------------------------------------------
Go to the top of the page
 
+Quote Post
ReedCat
сообщение Jan 26 2008, 11:39
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 14-01-08
Из: Москва
Пользователь №: 34 069



Нашел ликвидатор дребезга в шаблонах стандартных конструкций в ISE.

reg [2:0] <reg_name>;
always @ (posedge <clock>)
<reg_name> <= {<reg_name>[1:0], <input>};
assign <output> = <reg_name>[0] & <reg_name>[1] & !<reg_name>[2];

Буду учить матчасть. 01.gif
Go to the top of the page
 
+Quote Post
essev
сообщение Jan 28 2008, 10:42
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 16-05-07
Пользователь №: 27 757



Цитата(ReedCat @ Jan 25 2008, 12:48) *
Приветствую!

Начал пробовать свои силы в работе с FPGA.
Схемотехникой немного занимался, но очень давно (ещё когда PLM были "будущим электроники", а не её настоящим), поэтому сразу стали возникать "вопросы новичка". Буду признателен за разъяснения.

Итак, дано: макетная плата с Spartan-3E, ISE Webpack.
Прогоняю технологическую цепочку, чтобы понять, как "оно" работает, на примитивном тесте: светодиодиками на макетной плате помигать. Мигает. Дальше хочу задействовать имеющуюся кнопку для управления процессом (выключения светодиодика).

Придумывается что-то типа:
reg ONOFF;

...
always @(posegde clk) if ( ~ butt) ONOFF = ~ ONOFF;
...

assign LED = ONOFF & .... ;

И "меня терзают смутные сомнения", придуманная конструкция явно неустойчива к "дребезгу" контактов кнопки.
Какой стандартный ход применяют те, кто уже имеет опыт? Делят такт и опрашивают реже? А что если единственный опрос придётся как раз на время дребезга?
Посоветуйте, пожалуйста.



Мне кажется, что проще всего привинтить RS триггер к кнопке. Тогда проблем с переключениями не будет.

Описание данной "конструкции" можно взять в книге Белова "Самоучитель по МП технике".
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 06:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01524 секунд с 7
ELECTRONIX ©2004-2016