ATMega32: защита от дребезга контактов (прерывания)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

Сообщение ellioh »

-
Последний раз редактировалось ellioh Сб май 14, 2011 12:48:37, всего редактировалось 2 раза.
Клоподавер упрыгхт
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1596
Зарегистрирован: Вс дек 14, 2008 20:36:47
Откуда: SPb

Сообщение saschai »

http://radiokot.ru/forum/viewtopic.php? ... start=1220
Посмотри, сам мучался, очень изящный ход,
Понятно, что применительно к своему варианту

Код: Выделить всё

Button:

Waitms Debouncetime           ' антидребезг
Toggle Led

While Pind.2 = 0                   ' если кнопка удерживается
Waitms Debouncetime
Wend                                  ' крутимся здесь

Eifr = 64                             ' сбрасываем флаг

Return
Последний раз редактировалось saschai Ср фев 16, 2011 16:54:37, всего редактировалось 2 раза.
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск

Сообщение Rimsky »

Я бы сделал так:
1. Инициализировал прерывания по спаду фронта INT0
2. В обработчике инициализировал таймер защиты от дребезга и запретил прерывание от INT0
3. Далее в цикле после sleep отсчитал временной интервал (обычно около 200 мСек)и пощупал пин на нажатие.
4. Если кнопка нажата, то запускаемся, если нет возращаемся к процедуре инициализации и засыпаем.
Контактная информация:
Открыл глаза
Сообщения: 65
Зарегистрирован: Вс дек 06, 2009 19:18:11
Откуда: Ukrain, Sumy

Сообщение Amator »

ellioh писал(а):Добрый день,
...
Но ясно, что в случае в случае дребезга контактов (а в реальном железе он неизбежен) я насчитаю очень много нажатий на кнопку...
А как-то по-простому тут ведь ничего сделать нельзя?
Самый простой способ - это аппаратный (повесить на ногу int конденсатор).
Если на клетке со слоном увидишь надпись "Буйвол" - не верь глазам своим.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт янв 15, 2010 10:47:05
Откуда: Украина

Сообщение IgorKu »

Amator писал(а):
Самый простой способ - это аппаратный (повесить на ногу int конденсатор).
Подтверждаю. Более того, по-моему чисто программно как не пиши - путевого не получится. Сам изощрялся с енкодером, чего только не выписывал - пока не повесил конденсаторы на контакты по 0.1, нормально не заработало.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

IgorKu писал(а):Сам изощрялся с енкодером, чего только не выписывал - пока не повесил конденсаторы на контакты по 0.1, нормально не заработало.
Аналогично ковырялся с енкодером, тоже в итоге поставил емкость :))) Найти место под маленький конденсатор гораздо проще чем изобретать программный антидребезг.
Реклама
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

Сообщение ellioh »

-
Последний раз редактировалось ellioh Сб май 14, 2011 12:49:15, всего редактировалось 1 раз.
Клоподавер упрыгхт
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

ellioh писал(а):Спасибо, коллеги, я как раз хотел убедиться, что не усложняю проблему. :-)
... думаю прерывание по INT0 не нужно, как и всякие конденсаторы на контактах :) . В конструкциях типа АОН и Spectrum и т.д. опрос по таймеру прекрасно со всем справлялся. Причем несложно учесть одновременное нажатие нескольких клавиш, ввести функцию "автоповтор" при удержании и многое другое. Все что нужно - завести несколько переменных и правильно обрабатывать их состояние.
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

Сообщение ellioh »

-
Последний раз редактировалось ellioh Сб май 14, 2011 12:49:37, всего редактировалось 1 раз.
Клоподавер упрыгхт
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ощущение такое, что никто не в курсе, как борятся с дребезгом по-настоящему... конденсаторы... ё-моё! традиционная борьба с дребезгом, причем ВЕСЬМА эффективная, заключается в проверке через 10-15 миллисекунд уроня на кнопке и сравнения его с тем, кторый породил само событие. то есть, если у вас прерывание настроено на срабатывание по спаду (хотя, если мне память не изменяет, для просыпа лучше использовать срабатывание по низкому уровню), то в обработчике прерывания этого вам надо подождать 10-15 миллисекунд и проверить уровень на пине - если он НИЗКИЙ, то делать свои черные дела, если ВЫСОКИЙ - спать дальше. да, перед тем, как выйти из прерывания, надо сбросить флаг запроса прерывания, так как из-за дребезга он мог установиться повторно.

и всех делов. и никаких кондеров!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Сообщение Murav »

ARV писал(а):то в обработчике прерывания этого вам надо подождать 10-15 миллисекунд
Делать огромную задержку в прерывании?

Хотя идея правильная, только задержку стоит делать на таймере(не важно, аппаратном или программном на основе общего аппаратного) и по его прерыванию уже проверять состояние на входе.
И временную границу дребезга обычно берут не 10-15мс, а 50-100мс.
ARV писал(а):и всех делов. и никаких кондеров!
Кондеры место в прошивке не расходуют, так что в некоторых случаях лучше использовать их.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

Сообщение ellioh »

-
Последний раз редактировалось ellioh Сб май 14, 2011 12:49:57, всего редактировалось 1 раз.
Клоподавер упрыгхт
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

уважаемый, я думаю, что ваши опасения на счет задержек в прерывании и нарушения стиля "по событиям" НАПРАСНЫ. с точки зрения основной программы, которая СПИТ, задержка при пробуждении не играет никакой роли совершенно! из режима "глубокого сна", т.е. при максимальной экономии энергии, МК не в состоянии проснуться даже за 15 мс, поэтому реальное время выхода из прерывания СОВЕРШЕННО БЕЗРАЗЛИЧНО. мне так кажется.

а в вашем подходе есть существенный изъян: вы регистрируете КУЧУ прерываний и анализируете их. а мой вариант - ТОЛЬКО ОДНО ПРЕРЫВАНИЕ и анализ уровня. это намного проще, и, пожалуй, правильнее.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск

Сообщение Rimsky »

В принципе можно использовать пустое прерывание по int (без обработчика) чтобы проснуться, а кнопку опрашивать по таймеру.
Контактная информация:
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

Сообщение ellioh »

-
Последний раз редактировалось ellioh Сб май 14, 2011 12:50:16, всего редактировалось 2 раза.
Клоподавер упрыгхт
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я ж говорил, что имею ввиду режим максимальной экономии, т.е. Power Down... а из Standby пробуждается быстрее, факт.

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

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

Сообщение ellioh »

-
Последний раз редактировалось ellioh Сб май 14, 2011 12:50:38, всего редактировалось 1 раз.
Клоподавер упрыгхт
Открыл глаза
Сообщения: 78
Зарегистрирован: Пн апр 05, 2010 22:30:53

Сообщение lsdy »

Обратите внимание еще на один аппаратный подход
Вложения
дребез.JPG
(110.72 КБ) 1900 скачиваний
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

lsdy писал(а):Обратите внимание еще на один аппаратный подход
а лучше всего использовать магниточувствительные микросхемы и кнопки с магнитами - у них дребезг принципиально отсутствует... ничего, что каждая под 1$ стоит - разве на такие мелочи надо обращать внимание?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»