Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Внешнее прерывание INT

Непрочитано 29.12.2016, 12:07  
RECTO
Супер-модератор
 
Регистрация: 09.06.2011
Сообщений: 2,762
Сказал спасибо: 76
Сказали Спасибо 1,840 раз(а) в 668 сообщении(ях)
RECTO на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Сообщение от makakus Посмотреть сообщение
А нажатие нескольких кнопок в общем случае не отслеживается.
Насколько я понял - ТС нужно отслеживать как раз нажатие произвольных комбинаций кнопок, а не только одиночных. Одиночные - они и в первом варианте работают...

Сообщение от Sergey_57 Посмотреть сообщение
Вне прерывания вы можете это сделать.
Например после прерывания вы например его замаскировали (по сценарию)
Читать можете без проблем.
Маскируете вы прерывание или не маскируете - низкий уровень с RB0 никуда не уйдёт, пока нажата любая кнопка на RB1-RB7. Это и не даёт понять - нажата при этом кнопка RB0 или нет?
Реклама:
RECTO вне форума  
Непрочитано 29.12.2016, 12:15  
Alex9797
Почётный гражданин KAZUS.RUN
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Я бы предложил вот такой вариант. И волки сыты, и овцы целы.
Нажатие любой кнопки РВ1...РВ7 подается на вход INT через разделительный конденсатор. Его емкость подбирается такой, чтобы длительность отрицательного импульса была достаточной для генерации прерывания, но не очень большой. Делитель - для того, чтобы компенсировать падение напряжения на диодах, чтобы получить полноценный уровень логического нуля на входе INT.

При нажатии одной или нескольких одновременно кнопок РВ1...РВ7 на входе INT возникает короткий отрицательный импульс. При входе в обработку этого прерывания надо выждать паузу, достаточную для гарантированного окончания этого импульса. После этого можно спокойно анализировать состояние всех восьми кнопок, в любых комбинациях.
Если первой была нажата кнопка РВ0, короткий импульс не возникнет, но все равно генерится прерывание, и после паузы все равно кнопка будет прочитана.
Миниатюры:
Нажмите на изображение для увеличения
Название: INT0.jpg
Просмотров: 0
Размер:	118.1 Кб
ID:	108432  
Alex9797 вне форума  
Сказали "Спасибо" Alex9797
vavan1983 (29.12.2016)
Непрочитано 29.12.2016, 12:35  
sat_art
Вид на жительство
 
Регистрация: 27.11.2007
Сообщений: 434
Сказал спасибо: 20
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
sat_art на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

makakus,
Сообщение от Sergey_57 Посмотреть сообщение
Если возникло прерывание , то внутри тела прерывания вы не можете прочитать RB0-этот вход занят прерыванием.
Это бред.
Как это я не могу прочитать порт?
Другое дело, что если нажата кроме 0 кнопка, то неизвестно состояние кнопки 0.
Просто ТС непонятно и неконкретно описал задачу. Если кроме прота В можно использовать еще какой пин - то проще вывод кнопки 0 соединить с любым портом и его в прерывании подставлять вместо В0.
sat_art вне форума  
Непрочитано 29.12.2016, 13:02  
makakus
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.10.2007
Сообщений: 2,758
Сказал спасибо: 1,100
Сказали Спасибо 1,033 раз(а) в 568 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Сообщение от Alex9797 Посмотреть сообщение
При нажатии одной или нескольких одновременно кнопок РВ1...РВ7 на входе INT возникает короткий отрицательный импульс.
Не, не будет работать. Нажали одну кнопку - прерывание. Через 1 сек. нажимаем ещё одну. Прерывания нет. Приехали.

ТС, как часто бывает, кинул недоопределённую задачу и скрылся в тумане. А мы тут гадаем. Надо состояние кнопок передавать на выход? Зачем вообще контроллер, питание - резистор - (выходной сигнал) - кнопка - земля.
Кнопка (ключ телеграфиста? клавиатура программиста? аварийный грибок станочника?) нажимается за 50-500 мс, можно 20 раз в секунду опрашивать порт? ничего не известно.

Последний раз редактировалось makakus; 29.12.2016 в 13:04.
makakus вне форума  
Сказали "Спасибо" makakus
Alex9797 (29.12.2016)
Непрочитано 29.12.2016, 13:29  
Alex9797
Почётный гражданин KAZUS.RUN
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Сообщение от makakus Посмотреть сообщение
Не, не будет работать. Нажали одну кнопку - прерывание. Через 1 сек. нажимаем ещё одну. Прерывания нет. Приехали.
Блин. А так хорошо все начиналось...

Сообщение от makakus Посмотреть сообщение
20 раз в секунду опрашивать порт
Беспроигрышный вариант.
Alex9797 вне форума  
Непрочитано 29.12.2016, 17:12  
shindax
Прописка
 
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
shindax на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Сообщение от makakus Посмотреть сообщение
...аварийный грибок станочника?) нажимается за 50-500 мс, можно 20 раз в секунду опрашивать порт? ничего не известно.
Аварийный грибок всегда ставился, ставится и будет ставиться непосредственно в разрыв электрической цепи исполнительных механизмов и никак иначе. Анализ и обработка причин этого нажатия - другая песня. Для ТС. Если допускается одновременное нажатие нескольких кнопок и это допускается логикой работы устройства, то такая клавиатура собирается в матрицу и никакие диоды там уже нах не нужны, резисторы в ряды/колонки максимум, что следует установить, остальное уже в руках программиста. Этой песне уже лет 50. Щас полетят вопли про конфликт входов-выходов, про КЗ, и тому подобные бредни возмущённой школоты. Всё это х-ня, для МК это не страшно, достаточно просто подумать. Если речь именно про PIC, то там есть прерывание по изменению состояния входа пина подключенного ко входу RB4-RB7. Вам требуется решить задачу, или отдельно взятую проблему в этой задаче?

Последний раз редактировалось shindax; 29.12.2016 в 17:23.
shindax вне форума  
Непрочитано 29.12.2016, 18:30  
vavan1983
Почётный гражданин KAZUS.RUN
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

makakus, дребезг, да есть такое дело но есть отработанный подход на эту тему на основе таймера и обработки его в прерывании. Если интересно что за фиговина будет могу выложить. Но думаю вас это не заинтерисует.

Alex9797, вот и подход не плохой спасибо бум пробовать но уже после праздников.
vavan1983 вне форума  
Непрочитано 29.12.2016, 18:36  
vavan1983
Почётный гражданин KAZUS.RUN
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Сообщение от makakus Посмотреть сообщение
Не, не будет работать. Нажали одну кнопку - прерывание. Через 1 сек. нажимаем ещё одну. Прерывания нет. Приехали.
Опять же не совсем так.
vavan1983 вне форума  
Непрочитано 29.12.2016, 19:00  
Alex9797
Почётный гражданин KAZUS.RUN
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Сообщение от vavan1983 Посмотреть сообщение
Опять же не совсем так
Да, есть варианты. В первую очередь надо определить понятие "одновременности" нажатия нескольких кнопок. Понятно, что абсолютно одновременных событий не бывает. Тем более, если они вызваны таким медленным способом, как пальцы руки.
Между "одновременными" нажатиями будет некоторый промежуток времени. То есть, после генераци прерывания надо не торопиться делать выводы, а подождать какое-то время - а вдруг будет нажата еще одна, или еще несколько кнопок?
Сколько времени ждать - это определяется или экспериментально, или наоборот, заранее задается разработчиком, а пользователю остается лишь уложиться в отведенное время. Я думаю, что четверти секунды (250мс) будет вполне достаточно, для начала.

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

П.С. Чтобы после выхода из прерывания, вызванного нажатием кнопки, не возникало многократных повторных прерываний, надо перед выходом запретить прерывания по этому входу. А когда таймер отработает заданную паузу, в конце обработки прерывания таймера надо очистить флаг "была нажата какая-то кнопка".
И тут возникает проблемка. Когда разрешить прерывание от кнопок?
Внутри прерывания от таймера - нельзя. Потому что к этому моменту кнопки скорее всего будут нажаты, и тут же произойдет повторный вызов прерывания. Впрочем, если настроить его на срабатывание от переднего фронта, а не от потенциала... Нет, все равно рискованно. Потому что при отпускании может возникать дребезг, и повторное срабатывание произойдет.

Лучший вариант - это опрашивать флаг "была нажата кнопка" в теле главного цикла. И если он установлен - ничего не делать. А если очищен - разрешить прерывание от кнопок.

Последний раз редактировалось Alex9797; 29.12.2016 в 19:15.
Alex9797 вне форума  
Непрочитано 29.12.2016, 19:19  
vavan1983
Почётный гражданин KAZUS.RUN
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Alex9797, вижу маетись вы но не могу не чем помочь к сожалению. Вы итак подсказали хорошо не программно а для программиста это важное решение, решение не программно а в железе.
vavan1983 вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
tdc7200 Alex_golubev Микроконтроллеры, АЦП, память и т.д 5 10.12.2016 13:26
Некорректная работа TMR0 (PIC18F4550) <VenoM> Proteus 4 18.03.2016 22:41
Мега88 внешнее прерывание по низкому уровню E_C_C Proteus 0 06.09.2012 11:47
LPC13xx Внешнее прерывание Sinopteek Микроконтроллеры, АЦП, память и т.д 3 17.02.2012 10:23
Внешнее прерывание на tiny15 livsha Микроконтроллеры, АЦП, память и т.д 8 21.04.2010 01:11


Часовой пояс GMT +4, время: 01:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.