Прерывания. Как преодолеть ограничение в два пина для прерываний

Алексей1983
Offline
Зарегистрирован: 07.04.2019

Добрый день! Я новичок в этом деле от слова "совсем".

В Arduino UNO есть два пина для подключения прерываний. Задача: отловить нажатие одной из 12 кнопок именно в асинхронном режиме через прерывание. Есть ли какие-то готовые решения для этого? Например функция прерывания отлавливает факт нажатия любой из кнопок, а в ее коде считывается напряжение на аналоговом пине, и по его величине определяется номер кнопки.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

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

Алексей1983
Offline
Зарегистрирован: 07.04.2019

Спасибо! Я правильно понял, что это отдельная микросхема?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Алексей1983 пишет:

Спасибо! Я правильно понял, что это отдельная микросхема?

Нет, неправильно. Это в той же самой микросхеме. Вам выше ссылку дали ;)

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Алексей1983 пишет:

Спасибо! Я правильно понял, что это отдельная микросхема?

Ага, 12 микросхем на каждый вывод (
Загуглите уже и даташит откройте - поиск по слову pcint.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Алексей1983 пишет:

Я правильно понял, что это отдельная микросхема?

Нет, это отдельный пузырь тому, кто будет Вам делать :)

Но если хотите отдельную микросхему - их есть у меня: MCP23016 или MCP23S17. До 16-ти кнопок с общим прерыванием. Подойдёт любая. В чём разница между ними - загуглите даташиты и посмотрите.

Green
Offline
Зарегистрирован: 01.10.2015

Алексей1983 пишет:

В Arduino UNO есть два пина для подключения прерываний. Задача: отловить нажатие одной из 12 кнопок именно в асинхронном режиме через прерывание.

С помощью 2х диодов организуете аппаратное ИЛИ на один из пинов прерывания. Т.е., при нажатии любой из 12-ти кнопок (в матрице 3 х 4) получите прерывание. Дальше обычный опрос матрицы.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Green пишет:

С помощью 2х диодов организуете аппаратное ИЛИ на один из пинов прерывания. Т.е., при нажатии любой из 12-ти кнопок (в матрице 3 х 4) получите прерывание. Дальше обычный опрос матрицы.

не учи плахому. 

Green
Offline
Зарегистрирован: 01.10.2015

DetSimen пишет:

не учи плахому. 


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

Onkel
Offline
Зарегистрирован: 22.02.2016

Можно запустить прерывание по любому пину, но для этого нужно напрямую прописать данные в регистры мк. Вот например у меня прерывания по пинам С0-С2 (А0-А2 в Arduino), прописываем в setup
 

  EICRA = 0x00; //  INT0 INT1 Type didn't matter
  EIMSK = 0x00; //       INT0 INT1 disabled

  PCMSK0 = 0x00;
  PCMSK1 = 0x07; // Pin change mask pins C0 C1 C2 ENABLE any change
  PCMSK2 = 0x00;
  PCIFR = 0x02; //PCINT 14-8 Flag   clear
  PCICR = 0x02; //Pins C0 - C5 interruptions enable

когда происходит изменение состояния пинов C0-C2,то вызывается функция - обработчик, она называется

ISR (PCINT1_vect)// pin change interrupt for A0 to A5
{

// Code here
}

 в теле этой функции пишите что нужно сделать,не забывая главное правило написания обработчиков прерывания- "Ударил - убежал", - ф-я должна быть выполнена максимально быстро.
Для прерывания по пинам B или D - соответсвенно пишем маску прерывания в регистры PCMSK0  и PCMSK2, в PCIFR и PCICR выставляем 0 или 2 бит, а функции обработчика будут ISR (PCINT0_vect)  и  ISR (PCINT2_vect). Маска определяет, по каким  пинам будет отработка прерывания. Например если 0x01 - то только по 0, 0х07 - по пинам с 0 до 3 включительно и т.д.

 

Green
Offline
Зарегистрирован: 01.10.2015

Onkel, человек ведь "новичок от слова совсем", а вы его чистейшим Си грузите. Это ж не заказчик! Или... хотя, да...

Алексей1983
Offline
Зарегистрирован: 07.04.2019

Всем спасибо!