deplen 0 6 февраля, 2013 Опубликовано 6 февраля, 2013 · Жалоба volatile uint32_t count = 1; void PIOINT1_IRQHandler(void) { GPIOIntClear( 1, 9 ); if( count != 7 ) { count++; } else { LPC_GPIO0->MASKED_ACCESS[( 1 << 7 )] = ( 0 << 7 ); count = 1; } } int main(void) { LPC_SYSCON->SYSAHBCLKCTRL |= ( 1 << 6 ); NVIC_EnableIRQ( EINT1_IRQn ); LPC_GPIO0->DIR |= ( 1 << 7 ); // настраиваем PIO0.7 на вывод (светодиод LPCXpresso) GPIOSetDir( 1, 9, 0 ); GPIOSetInterrupt( 1, 9, 0, 0, 0 ); GPIOIntEnable( 1, 9 ); } Есть вот такой код обработки прерывания. Суть его такая: при запуске горит светодоид, но при 7 разовом нажатии на кнопку светодиод должен погаснуть. Но работает как то странно. То 7 раз нажать на кнопку и гаснет, то 6, то 4, то 3. Вобщем разные цифры. В чем я ошибся при кодировании прерывания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 6 февраля, 2013 Опубликовано 6 февраля, 2013 · Жалоба в дребезге контактов? кнопка - это не четкий фронт, она прерывание может и много раз вызвать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackPahan 0 6 февраля, 2013 Опубликовано 6 февраля, 2013 · Жалоба А дребезг контактов как устраняете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 6 февраля, 2013 Опубликовано 6 февраля, 2013 · Жалоба В чем я ошибся при кодировании прерывания? Может виноват дребезг кнопки? Попробуйте выдать сигнал от другого порта lpc11, настроенного на выход. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
deplen 0 6 февраля, 2013 Опубликовано 6 февраля, 2013 · Жалоба Просто задача стоит что бы по последовательности нажатий на кнопку запускать определенную функцию. Тобишь если кнопка такая не стабильная выхода нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 6 февраля, 2013 Опубликовано 6 февраля, 2013 · Жалоба Просто задача стоит что бы по последовательности нажатий на кнопку запускать определенную функцию. Тобишь если кнопка такая не стабильная выхода нет? Проверяйте состояние входа с каким-нибудь периодом (100-500 раз в секунду). Если уровень на входе не меняется заданное количество раз, то состояние входа можно считать устоявшимся. Или вешайте на вход какую-нибудь обвязку(RC-цепочку, триггер и тп). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 6 февраля, 2013 Опубликовано 6 февраля, 2013 · Жалоба это просто. после прерывания считает отсчет и ставите флаг что кнопка нажата, и если оказываетесь в прерывании а флаг стоит просто выходите, сняв прерывание, без отсчета. а в основном цикле снимаете флаг только после того как кнопка была отжата несколько тактов так вы будите реагировать на кнопку 1 раз в те несколько тактов если на кнопку быстро нажимать, или через те тактов после ее отпускания если долго. Подберите число тактов или таймер миллисекунд на 50 - 100 и задача решена. Но в целом это очень стандартная схема, могли для тренировки и сами придумать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvf 1 6 февраля, 2013 Опубликовано 6 февраля, 2013 · Жалоба А разве ноги на вход не имеют Schmitt Trigger? Tогда можно попробовать подцепить к входу емкость на 0.22uF к GND, если нет более жестких требований по помехозащищенности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 3 6 февраля, 2013 Опубликовано 6 февраля, 2013 · Жалоба Триггеров Шмитта как правило нет. Но даже если есть конденсатор здесь очень плохо работает. Нужно ждать стабилизации показаний. Хорошие кнопки прекращают дребезжать за 5 мс, плохие - до 50 мс. Если нужно ловить частые нажатия, то нужно опрашивать кнопку примерно раз в 0.5 - 1 мс и если обнаружено 2 одинаковых состояния подряд, то можно считать что дребезг кончился. Это, правда, относится к хорошим кнопкам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 7 февраля, 2013 Опубликовано 7 февраля, 2013 · Жалоба 0.5мс???? Вы реально способны нажимать на кнопку с частотой 1 кГц??? :smile3046: Значит вы - УНИКУМ! :rolleyes: А обычным людям вполне достаточно ~50Гц частоты сканирования кнопок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 3 7 февраля, 2013 Опубликовано 7 февраля, 2013 · Жалоба 0.5 мс, если Вы внимательно прочитали пост, - это время опроса дребезга. Общее время дребезга все равно будет не менее 5 мс. На два фронта - 10 мс, стало быть максимум скорости, которую можно отжать от кнопки - 100 Гц. И иногда удобно, чтобы кнопка срабатывала быстро и на короткий удар отвечала двумя переходами, а не блокировала его как дребезг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 7 февраля, 2013 Опубликовано 7 февраля, 2013 · Жалоба Опрашиваю кнопки раз в 50 мс. При этом дребезг гасится автоматически если кнопка дребезжит менее 50мс. Если кнопка дребезжит более 50мс ее надо менять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
deplen 0 7 февраля, 2013 Опубликовано 7 февраля, 2013 (изменено) · Жалоба а что делает HYSTERESYS в настройках каждого пина, не триггер ли это? P.S. да и общий вопрос, вешать такой нестабильный фронт как кнопка на прерывание хорошая идея? или проще и надежнее сделать простой опрос пина в цикле? Изменено 7 февраля, 2013 пользователем deplen Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 7 февраля, 2013 Опубликовано 7 февраля, 2013 · Жалоба а что делает HYSTERESYS в настройках каждого пина, не триггер ли это? Хоть бы и триггер, но кнопка всё равно дребезжать будет... P.S. да и общий вопрос, вешать такой нестабильный фронт как кнопка на прерывание хорошая идея? Чего ж хорошего в такой идее. или проще и надежнее сделать простой опрос пина в цикле? Лучше опрос, но не в цикле, а периодически. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 7 февраля, 2013 Опубликовано 7 февраля, 2013 · Жалоба зависит от задачи. Опрос кнопок в цикле частенько приводить к тупящим приложениям. Где надо каждый раз нажимать основательно, и ты каждый раз не уверен нажалось оно или нет... Если главный цикл короткий, и фактически один опрос кнопок и малая индикация можно и полингом, если реакция на кнопки нужна четкая и быстрая, а главный цикл загружен, то прерывание. И нет никакой проблемы в прерываниях на кнопки, просто надо в этом прерывании не тупить. Обработал клик, поставил флаг что кнопка была, и вывалился. Весьма корректное решение... Периодический опрос - потенциально приложения пропускающие клики... да гистерезис не особо поможет, конденсатор на кнопицу и пауза в опросе, ну и хорошая дорогая кнопочка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться