Что такое дребезг думаю,что знают все кто занимается разработками.Но вот как от них избивится вопрос интересный.Вопрос: кто как борется с дребезгом?,допустим я при помощи 2 конденсаторов (один на 0 один на 1) по 0.1 мкф.
Дребезг
Сообщений 1 страница 15 из 15
Поделиться22008-05-15 21:14:06
не поможет, однозначно
Поделиться32008-05-15 21:57:58
а чё программно отработать дребезг, религия не позволяет?
Поделиться42008-05-15 22:08:31
Не то что религия не позволяет,не позволяют пока ещё малы знания.У меня стоит таймер на опрос клавиши на 100милисикунд,и всё равно от простого нажалия пальца
(на контакт....без нажатия клавиши) проц воспринемает как нажатие
Поделиться52008-05-15 22:24:39
В конденсаторах без резика просто нет смысла. От того что ты его рязрядишь 10 раз при дребезге, да ещи и кнопку убьешь разрядами кондера (а там токи уже амперами меряются) никому , а в первую очередь тебе, легче не станет. Обрати внимание на встроенную функцию DEBOUNCE, она как раз программно реализует алгоритм антидребезга.
Отредактировано Skull (2008-05-15 22:25:25)
Поделиться62008-05-16 20:02:37
debounce я никому не советую использовать. Он просто хальтит всю прогу, что не есть гуд.
Мне кажется вообще, товарищ забыл подтянуть порт, и он срабатывает от любой помехи или наводки
соответственно лечится все очень просто, если замыкаем кнопку на ноль, то подтягиваем порт на плюс резистором 3 -100 килоом.
либо поможет такая запись команд.
reset ddrb.1: set portb.1
еще так посоветую
если просто от дребезга спасаемся то
knop alias pinb.1
a=0
do
if knop=0 then
if a=1000 then
gosub на условие выполнения кнопки
a=0
end if
incr a
end if
такая запись по любому спасет от любого дребезга и не будет тормозить основную прогу
Отредактировано Ведущийспециалист (2008-05-16 20:04:10)
Поделиться72008-11-27 16:34:02
ЛЮДИ ДРЕБЕЗГА НЕТ!!!!!!!!!!
Есть многократно повторяющийся цикл, который каждый раз считает что кнопка вновь нажата!
попробуйте следующую прогу.
Принцип работы следующий: В цикле запоминается текущее состояние кнопки и сравнивается с предыдущим циклом. Если в предыдущем цикле кнопка небыла нажата а в этом нажата то одобряем нажатие, если в предыдущем и настоящем цикле нажата, то НЕ одобряем нажатие. Если в текущем не нажата то ставим метку для следующего цикла что кнпка не была нажата.
'при кратковременном нажатии на кнопку выводим на ЖК количество нажатий,.
' при удержании кнопки результаты потихоньку сами прибавляются
'mailton P-a-h-a@yandex.ru
$regfile = "m32def.dat" ' используем ATmega32
$crystal = 8000000 ' частота установленного кварца 8 mHz
$lib "lcd4.lbx" 'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
'указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2 'используем дисплей на 2 строчки по 16 знакомест в каждой
Config Pina.0 = Input 'ставим сюдой кнопку и на землю
Porta.0 = 1
Booton1 Alias Pina.0
Dim Tempbooton1 As Bit
Dim Bootonup As Bit
Dim X As Byte
Dim Y As Byte
Do
If Booton1 = 0 Then ' физическая кнопка нажата?(1) (т.е. на входе логический ноль)
If Tempbooton1 = 0 Then ' и флаг кнопки =0 ?(2)
Bootonup = 1 ' включаем флаг что кнопка нажата(2)
Tempbooton1 = 1 ' включаем флаг кнопки равен 1 (2)
Else ' нет! (2)
Incr Y
If Y > 80 Then ' лучше тут использовать прерывания по таймеру и щетчик этих прерываний а данная задержка привязана к кварцу и "медленности" программы, если надо - подскажу как
Y = 0
Tempbooton1 = 0
End If
Bootonup = 0 ' виртуальная кнопка = 0 ( не нажата)
End If 'конец условия (2)
Else ' нет! (1)
Tempbooton1 = 0 'флаг кнопки = 0
Bootonup = 0 ' виртуальная кнопка н нажата = 0
End If
If Bootonup = 1 Then Incr X 'считываем результат с пина 0 порта А.
If X > 100 Then X = 0 'обнуляем счетчик нажатий при достижении 101
Locate 1 , 4 ' позиция курсора
Lcd "booton" ; X ; " " 'выводим результат преобразования на ЖК
Loop
End
Поделиться82008-11-27 22:31:29
ну наворотил....
Поделиться92009-03-29 03:23:43
Точно наворотил! Сейчас сам удивляюсь))
Вот как в последнем проэкте кнопки подключал:
$regfile = "m8def.dat" ' мега8
$crystal = 8000000
Config Pinc.4 = Input 'конфигурируем порты
set Portc.4 ' включаем внутренний подтягивающий резюк
Dim , X As Byte
Config Debounce = 30 ' я так понимаю что тут задаем время опроса кнопки - 30 милесекунд
' начало основного цикла
Do
Debounce Pinc.4 , 0 , Knopka , Sub ' при замыкании кнопкой пина на землю переходим к подпрограмме обработки события
Loop 'конец основного цикла
End
Knopka: 'обработка кнопки
Incr X
Return ' возвращаемся в основной цикл программы
' при нажатии и удержании кнопки - переменная увеличится на единицу, при следующем нажатии еще на единицу.to Ведущийспециалист. Почему вы считаете "debounce я никому не советую использовать. Он просто хальтит всю прогу, что не есть гуд." ?? Что происходит при использовании этой функции?
Поделиться102011-09-18 00:12:38
А как использовать debounce вместе с if / then / else ?
Пробовал так:
If Debounce Pind.0 = 1 And Debounce Pind.6 = 0 Then ...
,
If Debounce Pind.0 = 1 And Pind.6 = 0 Then ...
,
Debounce If Pind.0 = 1 And Pind.6 = 0 Then ...
,
и так
If Debounce Pind.0 = 0 And Flag = 1 Then...
Баском ругается 
А без debounce ошибок нет, а вот дребезги иногда бывают.
Куда только не вставлял этот debounce - без толку!
Кто подскажет, в чем трабла
Поделиться112011-09-18 08:21:23
Обратимся к хэлпу:
CONFIG DEBOUNCE Action Configures the delay time for the DEBOUNCE statement. Syntax CONFIG DEBOUNCE = time Remarks Time A numeric constant which specifies the delay time in mS. When debounce time is not configured, 25 mS will be used as a default.
Это говорит о том, что можно сделать задержку на нажатие кнопки.
Config Debounce = 10 'время задержки в мс
Вставлять это надо, когда все конфигурируешь.
Куда только не вставлял этот debounce - без толку!
В хелпе:
DEBOUNCE Action Debounce a port pin connected to a switch. Syntax DEBOUNCE Px.y , state , label [ , SUB] Remarks Px.y A port pin like PINB.0 , to examine. State 0 for jumping when PINx.y is low , 1 for jumping when PINx.y is high Label The label to GOTO when the specified state is detected SUB The label to GOSUB when the specified state is detected When you specify the optional parameter SUB, a GOSUB to label is performed instead of a GOTO.
Я делал так:
Config Debounce = 10 'время задержки в мс Config Pina.3 = Input 'настройка пина а3 на вход Set Porta.3 'включить внутренний подтягивающий резистор Vv Alias Pina.3 'КНОПКА ВВОД Debounce Vv , 0 , Temp Temp: Бла-бла... Return
Vv - на этом порту сидит кнопка
0 - это значит, что кнопка замыкает на корпус
Temp - это метка или подпрограмма, которая выполняется при нажатии на кнопку.
Поделиться122011-09-19 13:52:14
спасибо, max!
Попробую сделать по вашему примеру.
Поделиться132012-01-06 16:02:19
Привет всем и всех с наступившим новым годом!
max, сделал по вашему примеру и вроде получилось.
А задача изначальная не решилась 
т.е. LED должен гореть в случае, если Pind.0 = 1 And Pind.6 = 0 Then...
А как решить проблему с дребезгом в подобном выражении?
Debounce PIND.0 , 1 , And PIND.6 = 0 Then...
- не катит 
Я даже пинам присвоил btn1 и btn2
т.е.
Debounce BTN1 , 1 , And BTN2 , 0 , goto ....
- все-равно не катит 
Все то, что после Debounce BTN1 , 1 , компилятор думает, что это метка перехода
Кто скажет, как склеить два условия и решить дребезг
Поделиться142012-01-06 21:32:39
Самое надежное триггер Шмитта + RC цепочка в режиме интегрирования.
Можно использовать MAX6816, MAX6817, MAX6818, очень удобно.
Поделиться152012-01-07 12:37:07
Можно ещё подсчитывать среднеарифметическое значения единицы за какой-то период и если оно больше какой-то величины - срабатывать.)