Дребезг кнопки. - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Дребезг кнопки. (программное решение без задержки.)
Дребезг кнопки.
dimitriy-bc Дата: Вс, 16.11.2014, 13:45  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 190
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Всем доброго времени суток. Как можно обойти дребезг кнопки без использования DelayMS. Явно должны быть красивые решения, но мне в голову что-то ничего не приходит. Может у кого-то есть готовые решения? Буду признателен за помощь.
ЯНДЕКС Дата: 16.11.2014
anatol Дата: Вс, 16.11.2014, 16:59  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 535
Репутация: 13   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Это как подумать... Если фиксировать нажатие - то кнопка или нажата или...
Если фиксировать повторные нажатия, то без ожидания (пусть и созданного при выполнении нужной подпрограммы) - не обойтись
dimitriy-bc Дата: Вс, 16.11.2014, 18:02  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 190
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

В счетчике нужно набирать число включения реле.
mikhail09p Дата: Вс, 16.11.2014, 19:20  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

ak1:

If ENTER = 1 Then ENTER_bit = 0                               ' пока нажата кнопка ENTER, бит ENTER_bit = 0
Print At 1, 1, "AK1 USTANOVLEN ?"                         ' выводим...
Print At 2, 1, "AK1=", Dec akk1, " +1-0 ENTER"        ' выводим...
DelayMS 50                                                              ' можно без задержки
If PLUS = 0 Then akk1 = 1                                            ' опрос ещё кнопки PLUS
If MINUS = 0 Then akk1 = 0                                           ' опрос ещё кнопки MINUS
If ENTER = 0 And ENTER_bit = 0 Then ENTER_bit = 1: GoTo ak2   ' и если кнопку ENTER ещё не
'отпустили то GoTo ak1; если отпустили, то   ENTER = 0 And ENTER_bit = 0 и программа GoTo ak2
GoTo ak1                                                                                                                                                                                                         ' а ENTER_bit = 1 для того, чтобы  задержатся в следующем пункте меню

как-то так  wacko

Сообщение отредактировал mikhail09p - Вс, 16.11.2014, 19:29
ADMIN Дата: Пн, 17.11.2014, 02:48  |                                                                                                                Сообщение # 5
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1097
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Для таких случаев лучше использовать прерывание по фронту импульса.
MiXaS Дата: Вт, 18.11.2014, 21:12  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 613
Репутация: 26   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Если не очень часто спрашиваете, можно поставить конденсатор неполярный параллельно контактам кнопки емкостью около 10н–100н.
terrarus Дата: Пт, 21.11.2014, 16:17  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Лично я давно уже использую для опроса кнопок или переключателей например на 2-12 положений аналоговые входы в режиме АЦП. АЦП следует использовать  в 10-битном режиме. Кнопки подключают при их нажатии разные сопротивления к земле.
например:
1. Вход RA0 подтягиваю к +5В резистором 1,1 кОм.
2. кнопки одним выводом подключаются к земле.
3.  вторыми выводами через резисторы ко входу  RA0.
При использовании  разных резисторов получаются  разные коды в пределах естественно от 0 до 1023.
Такой прием полностью устраняет дребезг контактов кнопок и позволяет оставшиеся цифровые входа использовать для выходных сигналов.
Вот в одной из разработок на 18F452:
1. RA0 в режиме АЦП используется для оцифровки сигнала переменного резистора который является задатчиком для задания скорости асинхронного двигателя токарного суппорта   станка (Координаты Х - продольного и Y-поперечного движения суппорта)
2. RA1 в режиме АЦП  используется для оцифровки сигнала переменного резистора который является задатчиком для задания скорости вращения асинхронного двигателя Шпинделя.
3. RA2 в режиме АЦП  используется для оцифровки сигналов от двух кнопок "Шпиндель Пуск" и "Шпиндель Стоп"
4. RA3 в режиме АЦП  используется для оцифровки сигналов от джойстика "X:ВЛЕВО", X:ВПРАВО", Y:ВПЕРЕД. Y:НАЗАД.
5. RA4 - кнопка джойстика "БЫСТРО"
6. RA5 -  в режиме АЦП  используется для оцифровки сигналов от двух кнопок "УСТАНОВКА Х в 0" и "УСТАНОВКА Y в 0". Эти копки предназначены для работы измерительной системы станка на координатах X и Y.
7. RE0 -  в режиме АЦП  используется для оцифровки сигналов от четырех концевиков - "ЛевКонцевик", "ПравКонцевик", "ПереднКонцевик", "ЗаднКонцевик".
Остальные выводы работают как цифровые входы или выходы.


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал terrarus - Пт, 21.11.2014, 16:18
dimitriy-bc Дата: Сб, 22.11.2014, 00:08  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 190
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Всем доброго времени суток и спасибо за участие в моем вопросе. Мне нужно доработать счетчик разработанный лет десять назад еще на асме для 84а. Поэтому вариант с АЦП отпадает. Использование интегрирующих цепочек тоже не годится т.к. пины работают как с кнопками так и с семи сегментным индикатором. Пока буду использовать DelayMS, но если появится время и не пропадет желание то попробую что-то сообразить и выложу свои фантазии.
mikhail09p Дата: Сб, 22.11.2014, 00:39  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Асм - это хорошо! По своей работе связан  с ним крепко, но знаю плохо, как это ни парадоксально... Учусь.
Но, когда было необходимо, перевёл код Асемблера на Протон измерителя ЕСR и ёмкости. В частности.  Жизнь заставит... Так что, если нужно, то счётчик Ваш пишется как душе угодно - главное - желание и необходимость.
ADMIN, наваять статью измерителя ЕСR и ёмкости на Протоне?
dimitriy-bc Дата: Сб, 22.11.2014, 00:52  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 190
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Цитата mikhail09p ()
Но, когда было необходимо, перевёл код Асемблера на Протон

Так в Протоне и фантазирую. Про асм вспоминаю как страшный сон  wacko biggrin

Сообщение отредактировал dimitriy-bc - Сб, 22.11.2014, 00:53
terrarus Дата: Сб, 22.11.2014, 10:17  |                                                                                                                Сообщение # 11
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 542
Репутация: 16   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Pic16F84A можно достаточно быстро заменить на Pic16F83A или Pic16F86A. Естественно придется написать новую программу на ассемблере или Протоне.
Если же оставить Pic16F84A то нужно освободить у него выводы RB4-RB7 и использовать прерывания по изменению сигналов на этих входах.
Любая доработка неизбежно приведет к тому, что придется писать свою программу либо на асм либо на другом языке более высокого уровня, например Протоне или Баскоме.


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
xvovanx Дата: Сб, 22.11.2014, 13:20  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 247
Репутация: 12   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата terrarus ()
я давно уже использую для опроса кнопок или переключателей... аналоговые входы в режиме АЦП
А я если честно отказался от этого. Со временем контакты кнопок окисляются (особенно на улице или в неотапливаемом помещении) и возникают ошибочные срабатывания другой кнопки (не той что нажал) из-за паразитного сопротивления окисла . В частности пришлось переписать прогу в автоматике управления распашных ворот sad . Если не хватает ног, то использую диоды (перевожу с двоичный код)

Сообщение отредактировал xvovanx - Сб, 22.11.2014, 13:22
demanik Дата: Чт, 27.11.2014, 11:25  |                                                                                                                Сообщение # 13
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Часть темы о ESR метре перенесена.
http://www.picbasic.ru/forum/5-1633-1


Попробуй всё и вся... может быть пол...

Форум Picbasic.ru » Программирование МК » Proton PicBasic » Дребезг кнопки. (программное решение без задержки.)
Страница 1 из 11
Поиск: