Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Дребезг


Дребезг

Сообщений 1 страница 15 из 15

1

Что такое дребезг думаю,что знают все кто занимается разработками.Но вот как от них избивится вопрос интересный.Вопрос: кто как борется с дребезгом?,допустим я при помощи 2 конденсаторов (один на 0 один на 1) по 0.1 мкф.

0

2

не поможет, однозначно

0

3

а чё программно отработать дребезг, религия не позволяет?

0

4

Не то что религия не позволяет,не позволяют пока ещё малы знания.У меня стоит таймер на опрос клавиши на 100милисикунд,и всё равно от простого нажалия пальца

(на контакт....без нажатия клавиши) проц воспринемает как нажатие

0

5

В конденсаторах без резика просто нет смысла. От того что ты его рязрядишь 10 раз при дребезге, да ещи и кнопку убьешь разрядами кондера (а там токи уже амперами меряются) никому , а в первую очередь тебе, легче не станет. Обрати внимание на встроенную функцию DEBOUNCE, она как раз программно реализует алгоритм антидребезга.

Отредактировано Skull (2008-05-15 22:25:25)

0

6

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)

+1

7

ЛЮДИ ДРЕБЕЗГА НЕТ!!!!!!!!!!
Есть многократно повторяющийся цикл, который каждый раз считает что кнопка вновь нажата!
попробуйте следующую прогу.
Принцип работы следующий: В цикле запоминается текущее состояние кнопки и сравнивается с предыдущим циклом. Если в предыдущем цикле кнопка небыла нажата а в этом нажата то одобряем нажатие, если в предыдущем и настоящем цикле нажата, то НЕ одобряем нажатие. Если в текущем не нажата то ставим метку для следующего цикла что кнпка не была нажата.

'при кратковременном нажатии на кнопку выводим  на ЖК  количество нажатий,.
' при удержании кнопки результаты потихоньку сами прибавляются
'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

0

8

ну наворотил....

0

9

Точно наворотил! Сейчас сам удивляюсь))

Вот как в последнем проэкте кнопки подключал:

Код:
$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  я никому не советую использовать. Он просто хальтит всю прогу, что не есть гуд." ?? Что происходит при использовании этой функции?

0

10

А как использовать 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 - без толку!
Кто подскажет, в чем трабла

0

11

Обратимся к хэлпу:

Код:
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                                        'время задержки в мс

Вставлять это надо, когда все конфигурируешь.

ma35tr0 написал(а):

Куда только не вставлял этот 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 - это метка или подпрограмма, которая выполняется при нажатии на кнопку.

0

12

спасибо, max!
Попробую сделать по вашему примеру.

0

13

Привет всем и всех с наступившим новым годом!

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 , компилятор думает, что это метка перехода  %-)

Кто скажет, как склеить два условия и решить дребезг

0

14

Самое надежное триггер Шмитта + RC цепочка в режиме интегрирования.
Можно использовать MAX6816, MAX6817, MAX6818, очень удобно.

0

15

Можно ещё подсчитывать среднеарифметическое значения единицы за какой-то период и если оно больше какой-то величины - срабатывать.)

0


Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Дребезг