Несколько кнопок на одно прерывание

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Tomasina, 10 дек 2015.

  1. Onkel

    Onkel Гуру

    правда не было, потому что дискуссия разветвилась и ныне мы ветвимся вокруг прерываний и использования прерываний в функциях.
    Да, в даташите на атмегу 328 слова attachInterrupt нет. поэтому я и ответил - я таких слов не знаю. Не знает их и даташит на атмегу328.
     
  2. Vad33

    Vad33 Капитан-оригинал

    Тогда есть куда расти !! :)
    http://arduino.ru/Reference/AttachInterrupt

    Да, и на картинках написано "UNO". т.е. Arduino UNO.
     
  3. Onkel

    Onkel Гуру

    мне достаточно официальных даташитов atmel. Я не использую Ide ардуино. в С обработчики внешних прерываний называются по другому.
    что же до сути - если две библиотеки используют одно прерывание, то каждая библиотека может настроить его по - своему, так что они будут влиять и на результат функций из другой библиотеки не только при частых нажатиях кнопок, но и совсем без кнопок. Вроде бы просто и понятно и никаких "Невидимые прерывания на невидимых проводах?" тут нет, так что и разводить флейм не надо.
     
  4. Vad33

    Vad33 Капитан-оригинал

    Как то странно влезать на форум по ардуино, и не знать основной его инструмент программирования. :)
    Второе, для чего библиотеки должны настраивать внешние (!!) прерывания без подключения
    устройств к контактам для внешних прерываний ? По невидимым проводам подключены устройства ?? :)
    Третье, про переопределение прерываний уже не будем, чтобы совсем не зарыться в тему.
    Ну а про приоритеты уже сказали, главнее только RESET. :)
     
  5. Onkel

    Onkel Гуру

    не, не странно. у меня тут куча благодарностей за помощь от других пользователей, так что ничего странного нет. по крайней мере для тех, кому я помог.
    речь о прерываниях по таймерам.
    по невидимым проводам- вы сами шутите, сами смеетесь. Внешнее прерывание можно вызвать, установив уровень порта программно. Не слышали такого? если у вас прерывание вызывается, например , низким уровнем на portd.2, его можно вызвать командой portd.2=0, ну если до этого конечно порт был в состоянии с высоким уровнем.
     
    Последнее редактирование: 21 дек 2015
  6. Vad33

    Vad33 Капитан-оригинал

    Снобизм - это плохой признак.
    Речь о конкретном вопросе и конкретной схеме реализации.
    А еще можно вогнать в бесконечный цикл и придумать кучу других бесполезных примеров.
    Я заканчиваю писать в этой теме, ибо бессмысленно.
     
  7. Onkel

    Onkel Гуру

    Снобизм- это язвить про "невидимые провода", считая других глупее себя.
    да, о конкретной. Если вы чего-то не поняли, то можно спросить, я не язвить.

    вызов прерывания intx программным путем - обычное дело в программировании микроконтроллеров и не является плохим стилем, а как раз наоборот - предмет исскуства программирования..Поинтересуйтесь.
    Бесконечный цикл- 99% программ для мк уровня атмега содержат бесконечный цикл в теле main(). Даже обычный для ардуины
    void loop()
    {
    .....
    }
    это тот же самый бесконечный цикл , который вы упоминаете в "А еще можно вогнать в бесконечный цикл и придумать кучу других бесполезных примеров." Практически все скетчи (=программы ) для ардуино написаны с использованием бесконечного цикла.
     
    Последнее редактирование: 21 дек 2015
  8. atompost

    atompost Гик

    Уважаемый Tomasina

    А если в Вашем случае использовать мультиплексор? Используя пин 2 соединенный с ногой F на схеме и пины 4, 7, 8 соединенные с ногами A, B, C соответственно, вы можете опрашивать 8 кнопок !

    [​IMG]
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    ну для этой задачи избыточно, у меня всего 3 кнопки, но на будущее отложу схемку ;)
     
  10. atompost

    atompost Гик

    В вашем случае чтобы избавиться от избыточности можно применить "копеечную" микросхемку:
    [​IMG]

    цена ей 10 руб
    http://www.chipdip.ru/product/k561kp1-2000-08/
    микруха не прихотливая
    Время задержки 50 нс(типовое), мощность потребления 0,4 мкВт/вентиль, напряжение питания 3-15 В
     
  11. Tomasina

    Tomasina Сушитель лампочек Модератор

    мультиплексор еще поискать надо, а диоды рядом лежат ;)
     
  12. atompost

    atompost Гик

    Полностью поддерживаю!
     
  13. Alex19

    Alex19 Гуру

    Немного пофлужу (увы Грешен:)).

    Все, что будет написано, это сугубо мое мнение, не имею права кого-то учить в силу своих знаний. Так же и агитировать.

    Мне кажется отказываться от прерываний, нужно только в случае, если Вы не знаете/не хотите знать о них. Других причин не вижу, кроме еще не скольких, они излишни или их не хватает и приходится лавировать. Но по сути Вы отказываетесь от дополнительных возможностей.

    Да и во многих библиотеках Arduino IDE используются те же прерывания, тот же Servo, IR и т.д. И если в проекте встречаются библиотеки которые конкурируют за доступ к одним и тем же ресурсам (прерываниям), либо поиск других библиотек, либо переписывание их, под Ваши нужды.

    Мне кажется, если такой любитель как я (который делит электричество и электронику по толщине дорожки или диаметру кабеля:() может с ними работать, то для Вас atompost,
    Tomasina и ИгорьК это должно быть проще простого. А может Вы просто скромничаете...;)

    В любом случае, это выбор каждого, мое мнение - без них не возможно.
     
  14. Onkel

    Onkel Гуру

    а аргументировать? не в претензии, а просто очень интересно....
     
  15. AlexU

    AlexU Гуру

    Прерывания нужны для обработки асинхронных событий -- нажатие кнопки и есть асинхронное событие. Так же есть и другие, например, прием данных в последовательном порту и т.п. Но сейчас речь идёт о кнопках...
    Предложу свой вариант -- с использованием шифратора. Он не оптимален, элементная база устаревшая (использовал -- то, что нашёл в "загашнике"), но главное суть:
    1. Шифратор кодирует порядковый номер нажатой кнопки в бинарный код;
    2. На отдельной линии генерируется событие нажатия какой-либо кнопки;
    3. Линия "нажатия кнопки" подключается к пинам 2 или 3 ( в Arduino внешнее прерывание);
    4. Линии с бинарным кодом нажатой кнопки подключаются к другим пинам;
    5. в Arduino регистрируется обработчик прерывания нажатия кнопки (на 2 или 3 пине), который считывает код нажатой кнопки.
    Что касается схемы:
    1. J5 разъём для 6 кнопок, замыкаемых на землю (контакт 7) -- можно 7 кнопок, но нужно было 6. На 3 переделать -- "без проблем";
    2. Нажатая кнопка кодируется двоичным кодом на пинах 'Pin#0' .. 'Pin #2' от '001' до '110' (7я кнопка 111). Для 3х кнопок два пина -- 01, 10, 11;
    3. Событие нажатия кнопки регистрируется низким уровнем на 'interrupt Pin', т.е. на этой линии высокий (+5 V) сигнал в нормальном состоянии -- нет нажатых кнопок. При нажатии любой кнопки переходит в низкий сигнал (0 V).
    Схема опробована на Arduino UNO. Дребезг кнопок устраняется подключением конденсаторов 100nF параллельно каждой кнопке и конденсатором C1 на схеме. Если реализация интересна -- могу предоставить код-драйвер "этой клавиатуры" с кольцевым буфером, в котором сохраняются коды нажатых кнопок.
    buttons.jpg
     
  16. Onkel

    Onkel Гуру

    я бы ассиметричное решение предложил - мало портов- бери мегу. у нее 4 уарта и 56 (или около того) портов. Можно всю квартиру кнопками обвесить. а кодить с той же ide ардуины.
     
  17. Tomasina

    Tomasina Сушитель лампочек Модератор

    Вот нафига мне Мега2560 с её 56 портами, если на Mini ещё 5 свободных портов и стоит она 83 руб? :D
     
  18. Onkel

    Onkel Гуру

    так в чем вопрос и зачем тогда топик? на мини можно по любой ноге прерывание отрабатывать, без всяких мультиплексоров. маскируем нужные ноги и вперде.
    а где она 83 руб стоит? у нас сейчас даже сам камень под 80 в опте (по баксу примерно) а тут целая мини?