Если программировать микроконтроллер клавиатуры, то, наверное, такой способ не годится, но у меня частный случай, происходят некоторые процессы (чтение данных из UART, запись из на SD-карту) и мне надо иметь возможность передать пару-тройку команд (закрыть файл, остановить запись, выждать паузу для замены карты в разъеме), то хотелось бы одну кнопку поставить и ей одной как-то правильно кликать. Не уверен, но думаю, что, в принципе, для примера с SD-картой, можно выдернуть из UART-а девайс, скриптом отловить это событие и если Serial.read -1, то закрыть файл (сбросить буферы) и проделать нужные действия, то есть, обойтись без кнопки вообще.
Но мне интересна идея одной кнопки. И еще беспокоит, не повлияет ли такая обработка кликов на процесс синхронизации данных при записи их на SD-карту из loop? Я еще ничего не кодил и не тестил, плата придет через неделю-две, хотелось бы заранее изучить информацию. Но тут получается:, другой его поправляет и сообщает, что встроенные на то и нужны, а третий предоставляет код, который не читается и вообще писать такое стыдно жаде на первом курсе института: bool b=0; bool s=0; unsigned long d=0. Nkk пишет: Я еще ничего не кодил и не тестил, плата придет через неделю-две, хотелось бы заранее изучить информацию.
Служит для защиты от ложных импульсов при переключении контактов. Для подавления дребезга от кнопки с одной группой контактов могут применяться схемы, приведенные на рис. Число срабатываний и их продолжительность зависит. Возникшего в связи с дребезгом.
Но тут получается:, другой его поправляет и сообщает, что встроенные на то и нужны, а третий предоставляет код, который не читается и вообще писать такое стыдно жаде на первом курсе института: bool b=0; bool s=0; unsigned long d=0; О кнопках на форуме написаны 'вагон и маленькая тележка'. Если аппаратная часть больше интересует, можете прочесть 'Сагу о кнопках', если программная - 'Титановый велосипед.' Да и в других темах эти вопросы часто поднимались, включая варианты с использованием прерываний и таймеров. За неделю-две вполне можно освоить.
При этом нужно учитывать, что форум не учебник. Каждый может высказываться в силу своих как убеждений, так и заблуждений. Нужно осмысленно подходить, фильтровать.
Button: Waitms Debouncetime ' антидребезг Toggle Led While Pind.2 = 0 ' если кнопка удерживается Waitms Debouncetime Wend ' крутимся здесь Eifr = 64 ' сбрасываем флаг Return Автор: Rimsky Ср фев 16, 2011 17:52:00 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) Я бы сделал так: 1. Инициализировал прерывания по спаду фронта INT0 2.
В обработчике инициализировал таймер защиты от дребезга и запретил прерывание от INT0 3. Далее в цикле после sleep отсчитал временной интервал (обычно около 200 мСек)и пощупал пин на нажатие. Если кнопка нажата, то запускаемся, если нет возращаемся к процедуре инициализации и засыпаем. Автор: Amator Ср фев 16, 2011 18:01:07 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания). Сам изощрялся с енкодером, чего только не выписывал - пока не повесил конденсаторы на контакты по 0.1, нормально не заработало.
Аналогично ковырялся с енкодером, тоже в итоге поставил емкость Найти место под маленький конденсатор гораздо проще чем изобретать программный антидребезг. Автор: ellioh Ср фев 16, 2011 19:12:20 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) - Автор: ChipKiller Ср фев 16, 2011 20:24:39 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания). Спасибо, коллеги, я как раз хотел убедиться, что не усложняю проблему.
Думаю прерывание по INT0 не нужно, как и всякие конденсаторы на контактах. В конструкциях типа АОН и Spectrum и т.д. Опрос по таймеру прекрасно со всем справлялся. Причем несложно учесть одновременное нажатие нескольких клавиш, ввести функцию 'автоповтор' при удержании и многое другое. Все что нужно - завести несколько переменных и правильно обрабатывать их состояние. Автор: ellioh Ср фев 16, 2011 20:38:46 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) - Автор: ARV Ср фев 16, 2011 21:30:09 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) ощущение такое, что никто не в курсе, как борятся с дребезгом по-настоящему.
Традиционная борьба с дребезгом, причем ВЕСЬМА эффективная, заключается в проверке через 10-15 миллисекунд уроня на кнопке и сравнения его с тем, кторый породил само событие. То есть, если у вас прерывание настроено на срабатывание по спаду (хотя, если мне память не изменяет, для просыпа лучше использовать срабатывание по низкому уровню), то в обработчике прерывания этого вам надо подождать 10-15 миллисекунд и проверить уровень на пине - если он НИЗКИЙ, то делать свои черные дела, если ВЫСОКИЙ - спать дальше. Да, перед тем, как выйти из прерывания, надо сбросить флаг запроса прерывания, так как из-за дребезга он мог установиться повторно. И всех делов.
И никаких кондеров! Автор: Murav Ср фев 16, 2011 23:35:06 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания). И всех делов. И никаких кондеров! Кондеры место в прошивке не расходуют, так что в некоторых случаях лучше использовать их. Автор: ARV Чт фев 17, 2011 00:05:54 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) если прерывание используется только для пробуждения - почему бы в нем не сделать огромную задержку?
Проснется девайс на 15 мс позже или раньше - это роли не сыграет. Если я не ошибаюсь, в среднем дребезг маломощных контактов длится около 10 мс, так что 100 - это явно с большим запасом.
Автор: ellioh Чт фев 17, 2011 01:51:43 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) - Автор: ARV Чт фев 17, 2011 02:07:25 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) уважаемый, я думаю, что ваши опасения на счет задержек в прерывании и нарушения стиля 'по событиям' НАПРАСНЫ. С точки зрения основной программы, которая СПИТ, задержка при пробуждении не играет никакой роли совершенно! Из режима 'глубокого сна', т.е. При максимальной экономии энергии, МК не в состоянии проснуться даже за 15 мс, поэтому реальное время выхода из прерывания СОВЕРШЕННО БЕЗРАЗЛИЧНО. Мне так кажется.
А в вашем подходе есть существенный изъян: вы регистрируете КУЧУ прерываний и анализируете их. А мой вариант - ТОЛЬКО ОДНО ПРЕРЫВАНИЕ и анализ уровня. Это намного проще, и, пожалуй, правильнее.
Автор: Rimsky Чт фев 17, 2011 05:34:29 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) В принципе можно использовать пустое прерывание по int (без обработчика) чтобы проснуться, а кнопку опрашивать по таймеру. Автор: ellioh Чт фев 17, 2011 12:08:56 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) - Автор: ARV Чт фев 17, 2011 12:35:25 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) я ж говорил, что имею ввиду режим максимальной экономии, т.е.
А из Standby пробуждается быстрее, факт. В общем, мое дело - уведомить о способе, а будете вы им пользоваться или нет - дело ваше. Автор: ellioh Чт фев 17, 2011 12:42:43 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) - Автор: lsdy Пт фев 18, 2011 15:23:50 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания) Обратите внимание еще на один аппаратный подход Вложения: 110.72 KiB Скачиваний: 1139 Автор: ARV Пт фев 18, 2011 15:45:36 Заголовок сообщения: Re: ATMega32: защита от дребезга контактов (прерывания).