Pull to refresh

Comments 31

Я бы не стал смешивать логигу антидребезга и счетчика, а разнес их на 2 отдельных модуля.


Модуль «Антидребезг» «врезается» в дребезжащую линию, давая на выходе чистый сигнал. А все остальные модули продолжают ловить фронт, как делали это раньше:
if (old_D = '0') and (D = '1') then
А я бы вообще не стал смешивать логику и антидребезг. Есть специальные буферные микросхемы для аппаратного решения проблемы.
А если у нас уже готовая стандартная плата, такая как Spartan-3E Starter Kit, то выкручиваться лучше не аппаратно, чтобы не было уже лишних делатей.
тем более не будете же вы вешать «специальные буферные микросхемы» на каждый используемый вывод ПЛИС
такие микросхемы обычно ставятся на кнопки reset. Ни один производитель серьезных девкитов не пожалеет 10 центов на такой девайс.
ключ «reset circuit».

PS Хорошо, что пишете стать, спасибо.
Зачем на все выводы? только на выводы подключенные к кнопкам и это специальная микросхема не нужна, хватит старинного дедовского способа, КОНДЕНСАТОРА.

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

Особенно плохо это будет влиять на герконовые контакты: при таком раскладе они просто приварятся друг к другу.
Но ведь можно впаять резистор! Там будет достаточно буквально единиц ом.
Мы с вами говорим о тактовых кнопках, обычных тактовых кнопках, если вы мне покажите случай где тактовая кнопка сломалась не от механического воздействия я от электрического при АДЕКВАТНЫХ значениях конденсатора то я съем свою шляпу.

В случае с герконовыми контактами, то вы наверное говорите о реле, там применяются совсем другие методы. Если покажите тактовую кнопку с герконовыми контактами то я буду благодарен.

и я полностью согласен с AlexanderG
На старых древних компьютерах были клавиатуры с такими кнопками.

И, хорошо, конденсаторы-резисторы решают проблему. И если Вам доставляет удовольствие, или же просто не лень сидеть с паяльником и заморачиваться с железом и детальками, нежели просто написать аккуратно код и так же аккуратно решить эту проблему, то я ничего против не имею.

В статье я описал как решить данную проблему на ПЛИС программно. Пользоваться этим способом или припаивать RC к каждой ножке — выбор лично Ваш.
Защита от антидребезга с помощью конденсатора это миф, который идёт от не понимания физических процессов происходящих при коммутации.
Люди покупаются на триггер Шмидта с конденсатором на входе, но по сути это расширитель импульсов. Самый примитивный и без гарантий, потому что параллельно с конденсатором всегда есть паразитная индуктивность и при первом же прерывании происходят автоколебания (хотя бы пара периодов) на частоте резонанса и такой формирователь на 5-10 переключений даёт один сдвоенный или строенный импульс.
Самый надёжный и правильный способ борьбы с антидребезгом это переключающий контакт с RS тригерром на входе.
Размеры конденсатора и Индуктивности вы как теоретик явно не учитывали? да колебания будут но их заметит не всякий АЦП, что уж говорить про 2 статических уровня 0 и 1? или вы считаете что колебания буду с размахом в Uпитания/2?
Размеры конденсатора и Индуктивности вы как теоретик явно не учитывали?
При чём тут размер? На колебания впервую очередь влияет добротность паразитного контура. Дребезг контактов это задача возбуждения колебаний в длинной линии с распределёнными параметрами где, L и С имеют погонные значения.

да колебания будут но их заметит не всякий АЦП
По каким критериям вы различаете «всякий» и «не всякий АЦП»? Ни на одном КБ такой антидребезг с конденсатором не примут.

или вы считаете что колебания буду с размахом в Uпитания/2
Я вас опять удивлю. Амплитуда зависит от добротности паразитного контура и может превысить питание в несколько раз.
с конденсатором замечена следующая вещь была — при нажатии кнопки дребезга нет — все ровно, а при отжатии — вот что получается — конденсатор заряжен до напряжения ПИТАНИЯ U(это следует из того что в момент замыкания кнопки через подтяжечный резистор и конденсатор тока нет, следовательно напряжения на концах резистора равны), а напряжение подтяжки у нас меньше напряжения питания — поэтому при отпускании кнопки у нас будет импульс от напряжения подтяжки до напряжения питания, пока конденсатор разряжается через входное сопротивление пина — при частоте опроса 50МгЦ ПЛИС Altera Cyclone III это интерпретировала как еще одно нажатие кнопки — устранил путем понижения частоты опроса кнопки до 380 Гц
сейчас только что пришла идея — можно просто подобрать частоту опроса так, чтобы период ее был больше времени дребезга — допустим 50 мс, то есть частота опроса 20Гц и дребезг просто не будем видеть, а нажатие кнопки все равно минимум 120-130 мс длится(человеческая реакция) — поэтому за время удержания у нас гарантированно 2 опроса состояния — допустим нам не повезло и первый опрос попал на тот момент, когда кнопка дребезжала и был высокий уровень — не беда — второй опрос гарантированно будет низкий уровень
Один раз мой друг, электронщик, попросил меня помочь ему написать маленькую программку на атмел, которая считала количество нажатий кнопки и в зависимости от этого выдавала нужный сигнал на выходе. Тогда столкнулся в первый раз с дребезгом контактов и героически начал его решать программно. На это мой друг просто впаял конденсатор к кнопке и проблема решилась сама собой. Не знаю, на сколько это было правильное решение, скорее всего оно может глючить в некоторых ситуациях, но тогда на практике оно помогло, что сэкономило пару десятков байт драгоценной памяти attiny13. Тогда это было оправдано.
Вполне себе нормальное решение. Главное емкость подобрать.
А с учетом наличия SMD-кондеров это сэкономит память и такты внутри контроллера и не займет много места на плате.
А еще можно просто считывать значение кнопки раз в 0.25 секунды. Криво, но работает. Возможно, когданибудь глюкнет, но вероятность мала.
ну ту в принципе есть шанс, что мы считаем именно в момент иголки на графике и получим ложный результат, хотя, наверняка, лучше чем ничего.
Это лучше, чем искать фронт по 50-80Мгц сигналу (для спартанов-виртексов). Но хуже честного антидребезга, который приведен в посте.
также рекомендуется еще вход с кнопки пропускать через два триггера предварительно, для избавления от возможной метастабильности (существует несущественная, но вероятность попадания нажатия кнопки в момент setup\hold у триггера даже после логического элемента).

а здесь пожалуй лучшая реализация, из тех что я видел.

Верно.
Не
old_btn <= btn;
if (old_btn = '0') and (btn = '1') then

А
old_btn2 <= old_btn;
old_btn <= btn;
if (old2_btn = '0') and (old_btn = '1') then

Приведенный в посте вариант будет работать только тогда, когда btn переключается по синхроимпульсу.
Если btn асинхронный сигнал, то нужно использовать конструкцию, которую я привел.
Я когда-то делал уход от дребезга просто таким образом, что при нажатии кнопки ставил флаг и не читал клавиатуру 300 мс. В среднем длительность нажатия кнопки — 100 мс, период нажатия — 500 мс, но в отличие от метода с ожиданием отпускания, тут возможен вариант с тем, что можно плавно двигаться по меню просто держа кнопку.
Господа и дамы, будьте любезны, напишите кто-нибудь статью о микропроцессорах на VHDL/Verilog для ПЛИС. Есть несколько вопросов и хотелось бы задать их в комментариях соответствующей статье. По-жа-луй-ста!

А не проще зарегистрироваться на electronix.ru/forum/ и там задать свой вопрос?
Там как раз обитаются ПЛИСоводы, которые пишут свои процессоры.
ждем статью от whiteTigr про написание процессора на VHDL =) (выдаю все его секреты хе-хе)
А что есть простота? Мне вот проще сделать так как я написал, ибо я (и не только я) так делаю уже давно и это работает. Для Вас, возможно, Ваш метод будет проще.
Only those users with full accounts are able to leave comments. Log in, please.