Внешнее прерывание INT
29.12.2016, 12:07
|
|
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,762
Сказал спасибо: 76
Сказали Спасибо 1,840 раз(а) в 668 сообщении(ях)
|
Re: Внешнее прерывание INT
Сообщение от makakus
|
|
А нажатие нескольких кнопок в общем случае не отслеживается.
|
Насколько я понял - ТС нужно отслеживать как раз нажатие произвольных комбинаций кнопок, а не только одиночных. Одиночные - они и в первом варианте работают...
Сообщение от Sergey_57
|
Вне прерывания вы можете это сделать.
Например после прерывания вы например его замаскировали (по сценарию)
Читать можете без проблем.
|
Маскируете вы прерывание или не маскируете - низкий уровень с RB0 никуда не уйдёт, пока нажата любая кнопка на RB1-RB7. Это и не даёт понять - нажата при этом кнопка RB0 или нет?
|
|
|
|
29.12.2016, 12:15
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
|
Re: Внешнее прерывание INT
Я бы предложил вот такой вариант. И волки сыты, и овцы целы.
Нажатие любой кнопки РВ1...РВ7 подается на вход INT через разделительный конденсатор. Его емкость подбирается такой, чтобы длительность отрицательного импульса была достаточной для генерации прерывания, но не очень большой. Делитель - для того, чтобы компенсировать падение напряжения на диодах, чтобы получить полноценный уровень логического нуля на входе INT.
При нажатии одной или нескольких одновременно кнопок РВ1...РВ7 на входе INT возникает короткий отрицательный импульс. При входе в обработку этого прерывания надо выждать паузу, достаточную для гарантированного окончания этого импульса. После этого можно спокойно анализировать состояние всех восьми кнопок, в любых комбинациях.
Если первой была нажата кнопка РВ0, короткий импульс не возникнет, но все равно генерится прерывание, и после паузы все равно кнопка будет прочитана.
|
|
|
|
Сказали "Спасибо" Alex9797
|
|
|
29.12.2016, 12:35
|
|
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 434
Сказал спасибо: 20
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Внешнее прерывание INT
makakus,
Сообщение от Sergey_57
|
|
Если возникло прерывание , то внутри тела прерывания вы не можете прочитать RB0-этот вход занят прерыванием.
|
Это бред.
Как это я не могу прочитать порт?
Другое дело, что если нажата кроме 0 кнопка, то неизвестно состояние кнопки 0.
Просто ТС непонятно и неконкретно описал задачу. Если кроме прота В можно использовать еще какой пин - то проще вывод кнопки 0 соединить с любым портом и его в прерывании подставлять вместо В0.
|
|
|
|
29.12.2016, 13:02
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.10.2007
Сообщений: 2,758
Сказал спасибо: 1,100
Сказали Спасибо 1,033 раз(а) в 568 сообщении(ях)
|
Re: Внешнее прерывание INT
Сообщение от Alex9797
|
|
При нажатии одной или нескольких одновременно кнопок РВ1...РВ7 на входе INT возникает короткий отрицательный импульс.
|
Не, не будет работать. Нажали одну кнопку - прерывание. Через 1 сек. нажимаем ещё одну. Прерывания нет. Приехали.
ТС, как часто бывает, кинул недоопределённую задачу и скрылся в тумане. А мы тут гадаем. Надо состояние кнопок передавать на выход? Зачем вообще контроллер, питание - резистор - (выходной сигнал) - кнопка - земля.
Кнопка (ключ телеграфиста? клавиатура программиста? аварийный грибок станочника?) нажимается за 50-500 мс, можно 20 раз в секунду опрашивать порт? ничего не известно.
Последний раз редактировалось makakus; 29.12.2016 в 13:04.
|
|
|
|
Сказали "Спасибо" makakus
|
|
|
29.12.2016, 13:29
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
|
Re: Внешнее прерывание INT
Сообщение от makakus
|
|
Не, не будет работать. Нажали одну кнопку - прерывание. Через 1 сек. нажимаем ещё одну. Прерывания нет. Приехали.
|
Блин. А так хорошо все начиналось...
Сообщение от makakus
|
|
20 раз в секунду опрашивать порт
|
Беспроигрышный вариант.
|
|
|
|
29.12.2016, 17:12
|
|
|
Прописка
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
|
Re: Внешнее прерывание INT
Сообщение от makakus
|
|
...аварийный грибок станочника?) нажимается за 50-500 мс, можно 20 раз в секунду опрашивать порт? ничего не известно.
|
Аварийный грибок всегда ставился, ставится и будет ставиться непосредственно в разрыв электрической цепи исполнительных механизмов и никак иначе. Анализ и обработка причин этого нажатия - другая песня. Для ТС. Если допускается одновременное нажатие нескольких кнопок и это допускается логикой работы устройства, то такая клавиатура собирается в матрицу и никакие диоды там уже нах не нужны, резисторы в ряды/колонки максимум, что следует установить, остальное уже в руках программиста. Этой песне уже лет 50. Щас полетят вопли про конфликт входов-выходов, про КЗ, и тому подобные бредни возмущённой школоты. Всё это х-ня, для МК это не страшно, достаточно просто подумать. Если речь именно про PIC, то там есть прерывание по изменению состояния входа пина подключенного ко входу RB4-RB7. Вам требуется решить задачу, или отдельно взятую проблему в этой задаче?
Последний раз редактировалось shindax; 29.12.2016 в 17:23.
|
|
|
|
29.12.2016, 18:30
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Внешнее прерывание INT
makakus, дребезг, да есть такое дело но есть отработанный подход на эту тему на основе таймера и обработки его в прерывании. Если интересно что за фиговина будет могу выложить. Но думаю вас это не заинтерисует.
Alex9797, вот и подход не плохой спасибо бум пробовать но уже после праздников.
|
|
|
|
29.12.2016, 18:36
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Внешнее прерывание INT
Сообщение от makakus
|
|
Не, не будет работать. Нажали одну кнопку - прерывание. Через 1 сек. нажимаем ещё одну. Прерывания нет. Приехали.
|
Опять же не совсем так.
|
|
|
|
29.12.2016, 19:00
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
|
Re: Внешнее прерывание INT
Сообщение от vavan1983
|
|
Опять же не совсем так
|
Да, есть варианты. В первую очередь надо определить понятие "одновременности" нажатия нескольких кнопок. Понятно, что абсолютно одновременных событий не бывает. Тем более, если они вызваны таким медленным способом, как пальцы руки.
Между "одновременными" нажатиями будет некоторый промежуток времени. То есть, после генераци прерывания надо не торопиться делать выводы, а подождать какое-то время - а вдруг будет нажата еще одна, или еще несколько кнопок?
Сколько времени ждать - это определяется или экспериментально, или наоборот, заранее задается разработчиком, а пользователю остается лишь уложиться в отведенное время. Я думаю, что четверти секунды (250мс) будет вполне достаточно, для начала.
Другая проблема - что отрабатывать такую длинную паузу внутри прерывания - не кошерно. Поэтому, как вариант, в прерывании можно установить флажок, показывающий, что было нажатие кнопок, а потом запустить таймер на желаемую длительность, и быстренько выйти из прерывания. И уже в обработке прерывания от таймера, отработавшего заданную паузу, читаем порт с кнопками, и делаем выводы из их состояния. При этом все проблемы с дребезгом нас не волнуют, они к этому моменту остались далеко позади.
П.С. Чтобы после выхода из прерывания, вызванного нажатием кнопки, не возникало многократных повторных прерываний, надо перед выходом запретить прерывания по этому входу. А когда таймер отработает заданную паузу, в конце обработки прерывания таймера надо очистить флаг "была нажата какая-то кнопка".
И тут возникает проблемка. Когда разрешить прерывание от кнопок?
Внутри прерывания от таймера - нельзя. Потому что к этому моменту кнопки скорее всего будут нажаты, и тут же произойдет повторный вызов прерывания. Впрочем, если настроить его на срабатывание от переднего фронта, а не от потенциала... Нет, все равно рискованно. Потому что при отпускании может возникать дребезг, и повторное срабатывание произойдет.
Лучший вариант - это опрашивать флаг "была нажата кнопка" в теле главного цикла. И если он установлен - ничего не делать. А если очищен - разрешить прерывание от кнопок.
Последний раз редактировалось Alex9797; 29.12.2016 в 19:15.
|
|
|
|
29.12.2016, 19:19
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Внешнее прерывание INT
Alex9797, вижу маетись вы но не могу не чем помочь к сожалению. Вы итак подсказали хорошо не программно а для программиста это важное решение, решение не программно а в железе.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:48.
|
|