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, но все равно никаких изменений.
У меня такое чувство, что это потому, что используемые мной выводы технически не являются выводами прерывания... есть ли способ сделать их пригодными для использования в качестве выводов прерывания? Мне не разрешено менять используемые выводы, а использование прерывания — лучшее решение для той части кода, над которой я работаю.
@sGlow, 👍0
Обсуждение1 ответ
Конечный выключатель подразумевает, что какая-то механическая вещь замыкает переключатели, что вряд ли требует прерывания, так как это будет довольно медленно с точки зрения электроники. Простого опроса, вероятно, более чем достаточно в верхней части цикла 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
}
}
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
Никогда не используйте Serial в прерывании., @Majenko
Я изменил его, пока вы комментировали, лол. Но проблема не в серийном номере. Есть ли у вас другие предложения, почему это не работает?, @sGlow
ваш стиль программирования непоследователен .... вы объявляете
#define switch_6 47
, а затем используетеattachInterrupt(digitalPinToInterrupt(47), tightStrings1, CHANGE);
.... вам следует использоватьattachInterrupt(digitalPinToInterrupt(switch_6), tightStrings1, CHANGE);
.... имя вывода на самом деле должно быть чем-то вродеswitch_BL
, @jsotolaХорошо...спасибо. Я это исправлю. Но опять же, это не указывает на решение. Ребята, у вас есть какие-нибудь идеи, как исправить саму проблему?, @sGlow