Прерывания. Как преодолеть ограничение в два пина для прерываний
- Войдите на сайт для отправки комментариев
Вс, 07/04/2019 - 21:04
Добрый день! Я новичок в этом деле от слова "совсем".
В Arduino UNO есть два пина для подключения прерываний. Задача: отловить нажатие одной из 12 кнопок именно в асинхронном режиме через прерывание. Есть ли какие-то готовые решения для этого? Например функция прерывания отлавливает факт нажатия любой из кнопок, а в ее коде считывается напряжение на аналоговом пине, и по его величине определяется номер кнопки.
Для этого есть прерывания PCINT, там пинов больше. Смысл именно такой - срабатывает прерывание, потом нужно считать пины PCINT и узнать, на какой из них пришел сигнал.
Спасибо! Я правильно понял, что это отдельная микросхема?
Спасибо! Я правильно понял, что это отдельная микросхема?
Нет, неправильно. Это в той же самой микросхеме. Вам выше ссылку дали ;)
Спасибо! Я правильно понял, что это отдельная микросхема?
Ага, 12 микросхем на каждый вывод (
Загуглите уже и даташит откройте - поиск по слову pcint.
Я правильно понял, что это отдельная микросхема?
Нет, это отдельный пузырь тому, кто будет Вам делать :)
Но если хотите отдельную микросхему - их есть у меня: MCP23016 или MCP23S17. До 16-ти кнопок с общим прерыванием. Подойдёт любая. В чём разница между ними - загуглите даташиты и посмотрите.
В Arduino UNO есть два пина для подключения прерываний. Задача: отловить нажатие одной из 12 кнопок именно в асинхронном режиме через прерывание.
С помощью 2х диодов организуете аппаратное ИЛИ на один из пинов прерывания. Т.е., при нажатии любой из 12-ти кнопок (в матрице 3 х 4) получите прерывание. Дальше обычный опрос матрицы.
С помощью 2х диодов организуете аппаратное ИЛИ на один из пинов прерывания. Т.е., при нажатии любой из 12-ти кнопок (в матрице 3 х 4) получите прерывание. Дальше обычный опрос матрицы.
не учи плахому.
не учи плахому.
Так может человек проснуться хочет от любой кнопки. Почему бы и нет.)
Иначе, нафига все эти извращения.)
Можно запустить прерывание по любому пину, но для этого нужно напрямую прописать данные в регистры мк. Вот например у меня прерывания по пинам С0-С2 (А0-А2 в Arduino), прописываем в setup
когда происходит изменение состояния пинов C0-C2,то вызывается функция - обработчик, она называется
в теле этой функции пишите что нужно сделать,не забывая главное правило написания обработчиков прерывания- "Ударил - убежал", - ф-я должна быть выполнена максимально быстро.
Для прерывания по пинам B или D - соответсвенно пишем маску прерывания в регистры PCMSK0 и PCMSK2, в PCIFR и PCICR выставляем 0 или 2 бит, а функции обработчика будут ISR (PCINT0_vect) и ISR (PCINT2_vect). Маска определяет, по каким пинам будет отработка прерывания. Например если 0x01 - то только по 0, 0х07 - по пинам с 0 до 3 включительно и т.д.
Onkel, человек ведь "новичок от слова совсем", а вы его чистейшим Си грузите. Это ж не заказчик! Или... хотя, да...
Всем спасибо!