Смущен тем, как 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 секунды - что само по себе тоже является проблемой, поскольку он должен обнаруживать только «изменение»?

, 👍1

Обсуждение

Вероятно, у вас есть плавающие входы., @Majenko


1 ответ


Лучший ответ:

2

Прерывание на контакте 2 срабатывает, потому что контакт является плавающим. Так как к контакту ничего не подключено, он реагирует на любой шум, пролетающий мимо (например, от контакта 3). Это может привести к тому, что контакт изменит свое состояние вместе с контактом 3 или просто беспорядочно и случайным образом изменит свое состояние.

Вам необходимо подключить подтягивающий или подтягивающий резистор (один довольно большой резистор, идущий от вывода к Vcc или земле), который устанавливает состояние выводов, когда в противном случае он активно не управляется. Если вам нужно подтягивание или опускание, зависит от желаемого поведения.

Если вам подходит подтягивающий резистор, вы можете активировать внутренний подтягивающий резистор Arduino с помощью

pinMode(2, INPUT_PULLUP);
,

Я не думаю, что вы понимаете, сколько хлопот это спасло меня! Большое спасибо, приятель, я присужу награду, как только это будет возможно., @JᴀʏMᴇᴇ

Это распространенная проблема с цифровыми входами CMOS. Если они не подключены через резистор (хороший выбор 10 кОм) к +5 В или земле, они выдают полуслучайные единицы и нули., @Duncan C