Смущен тем, как 2 моих прерывания запускаются только с 1 контакта?
У меня есть следующий код, который использует прерывания для установки флага, указывающего, должен ли выполняться последовательный ввод-вывод для обновления моего ПК о конкретном вводе вывода. Поэтому у меня есть прерывания на контактах 2 и 3.
Я использую 13-й контакт Arduino в качестве выхода и каждые 2 секунды посылаю импульс. На моем arduino у меня есть 1 провод, идущий от 13 к контакту 3. Примечание: я вообще ничего не вставил в контакт 2.
Каким-то образом я получаю следующие данные каждые 2 секунды:
Контакт 2
Контакт 3
Как работает прерывание для вывода 2??
boolean serialCommsQueue1 = false;
boolean serialCommsQueue2 = false;
void setup()
{
pinMode(2, INPUT);
pinMode(3, INPUT);
attachInterrupt(digitalPinToInterrupt(2), pin2Fired, RISING);
attachInterrupt(digitalPinToInterrupt(3), pin3Fired, RISING);
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH); // включает цифровой вывод 13
delay(1000); // ждем секунду
digitalWrite(13, LOW); // отключает цифровой вывод 13
delay(1000); // ждем секунду
if (serialCommsQueue1)
{
serialCommsQueue1 = false;
Serial.println("Pin 2");
}
if (serialCommsQueue2)
{
serialCommsQueue2 = false;
Serial.println("Pin 3");
}
}
void pin2Fired()
{
serialCommsQueue1 = true;
}
void pin3Fired()
{
serialCommsQueue2 = true;
}
ИЗМЕНИТЬ:
Если я беру провод из 3, пин 2 постоянно (каждые 2 секунды) пишет в последовательный порт. Если я верну провод обратно в контакт 3, он регулярно пишет каждые 2 секунды - что само по себе тоже является проблемой, поскольку он должен обнаруживать только «изменение»?
@JᴀʏMᴇᴇ, 👍1
Обсуждение1 ответ
Лучший ответ:
Прерывание на контакте 2 срабатывает, потому что контакт является плавающим. Так как к контакту ничего не подключено, он реагирует на любой шум, пролетающий мимо (например, от контакта 3). Это может привести к тому, что контакт изменит свое состояние вместе с контактом 3 или просто беспорядочно и случайным образом изменит свое состояние.
Вам необходимо подключить подтягивающий или подтягивающий резистор (один довольно большой резистор, идущий от вывода к Vcc или земле), который устанавливает состояние выводов, когда в противном случае он активно не управляется. Если вам нужно подтягивание или опускание, зависит от желаемого поведения.
Если вам подходит подтягивающий резистор, вы можете активировать внутренний подтягивающий резистор Arduino с помощью
pinMode(2, INPUT_PULLUP);
Я не думаю, что вы понимаете, сколько хлопот это спасло меня! Большое спасибо, приятель, я присужу награду, как только это будет возможно., @JᴀʏMᴇᴇ
Это распространенная проблема с цифровыми входами CMOS. Если они не подключены через резистор (хороший выбор 10 кОм) к +5 В или земле, они выдают полуслучайные единицы и нули., @Duncan C
- Отправка последовательных данных в прерывании
- Серийное прерывание
- Отправка информации (например, строки) через цифровые контакты
- Есть ли способ использовать последовательный порт в качестве источника прерывания?
- Можно ли безопасно использовать последовательный порт в процедуре прерывания SPI?
- Является ли мой скетч «потокобезопасным»?
- Простое последовательное сообщение непоследовательно (иногда перемешано)
- Как считывать цифровые данные и отправлять их через последовательный порт на ПК со скоростью около 2 МГц?
Вероятно, у вас есть плавающие входы., @Majenko