Arduino Mega: Прерывание не работает? Использовать любой пин для прерывания?

Я использую arduino mega. Я пытаюсь использовать прерывания в одной из моих программ. У меня есть 8 выводов, для которых мне нужно будет сделать отдельные прерывания.

Выводы — 40–47. Эти выводы подключены к концевым выключателям, поэтому, когда концевой выключатель нажат или нет, это будет указано с помощью digitalRead().

#define switch_1 43     // Контакт 43 подключен к Switch 1 (1: X+)
#define switch_2 42     // Контакт 42 подключен к Switch 2 (1: X-)
#define switch_3 41     // Контакт 41 подключен к Switch 3 (1: Y+)
#define switch_4 40     // Контакт 40 подключен к Switch 4 (1: Y-)
#define switch_5 46     // Контакт 46 подключен к Switch 5 (2: FR)
#define switch_6 47     // Контакт 47 подключен к Switch 6 (2: BL)
#define switch_7 45     // Контакт 45 подключен к Switch 7 (2: BR)
#define switch_8 44     // Контакт 44 подключен к коммутатору 8 (2: FL)
int interruptVar = 5;

В моей настройке есть функция:

attachInterrupt(digitalPinToInterrupt(switch_6), tightenStrings1, CHANGE); 

Тогда у меня есть:

void tightenStrings1()
{
  interruptVar = 9;

}

Когда я меняю состояние концевых выключателей, нажимая или отпуская их, эта функция никогда не активируется. Переменная interruptVar по-прежнему равна 5.

Что я делаю не так?

Кроме того, в данном случае проблема не в Serial. Теперь я понимаю, что его использовать не стоит, но это все равно не решает проблему. Кроме того, я пробовал вместо CHANGE использовать RISING или FALLING, но все равно никаких изменений.

У меня такое чувство, что это потому, что используемые мной выводы технически не являются выводами прерывания... есть ли способ сделать их пригодными для использования в качестве выводов прерывания? Мне не разрешено менять используемые выводы, а использование прерывания — лучшее решение для той части кода, над которой я работаю.

, 👍0

Обсуждение

Никогда не используйте Serial в прерывании., @Majenko

Я изменил его, пока вы комментировали, лол. Но проблема не в серийном номере. Есть ли у вас другие предложения, почему это не работает?, @sGlow

ваш стиль программирования непоследователен .... вы объявляете #define switch_6 47, а затем используете attachInterrupt(digitalPinToInterrupt(47), tightStrings1, CHANGE); .... вам следует использовать attachInterrupt(digitalPinToInterrupt(switch_6), tightStrings1, CHANGE); .... имя вывода на самом деле должно быть чем-то вроде switch_BL, @jsotola

Хорошо...спасибо. Я это исправлю. Но опять же, это не указывает на решение. Ребята, у вас есть какие-нибудь идеи, как исправить саму проблему?, @sGlow


1 ответ


0

Конечный выключатель подразумевает, что какая-то механическая вещь замыкает переключатели, что вряд ли требует прерывания, так как это будет довольно медленно с точки зрения электроники. Простого опроса, вероятно, более чем достаточно в верхней части цикла loop() или чего-то подобного.

Вы можете объявить все контакты как INPUT_PULLUP, подключить переключатели так, чтобы они подключались к Gnd при нажатии, а затем выполнить цифровое чтение каждого контакта, чтобы определить его состояние, или поместить все 8 контактов на один порт и выполнить чтение PORTx

например, если результат отличен от 0xFF, то он был закрыт, и вы можете действовать с ним или прочитать его напрямую и действовать, как здесь, например:

switches = PORTL;
if (switches != 0xff){
switch(switches){
case 0b01111111:
//код для переключателя 7
break;
case 0b10111111:
// код для переключателя 6
break;
etc for 0b11011111, 11101111, 11110111, 111111011, 11111101, 111111110
}
}
,