Прерывание активируется, как только я вставляю перемычку в порт

interrupt testing

Я написал очень простой код для проверки работы прерываний моей платы расширения Arduino Uno:

const byte buttonPin3 = 3; 


void setup() {
  pinMode(buttonPin3, INPUT); 
  attachInterrupt(digitalPinToInterrupt(buttonPin3), trigger, CHANGE);

  Serial.begin(9600);
}

void loop() {
}



void trigger(){
  Serial.println("trigger");
}

Однако Serial.println("trigger"); активируется, как только я вставляю перемычку в контакты 2 или 3. Похоже, я сломал микроконтроллер. Я был бы признателен, если бы вы могли помочь мне узнать, что-то не так с моим кодом или мне нужно изменить микроконтроллер? если мне нужно заменить MCU, могу ли я просто использовать любой идентичный AVR и просто поместить его на адаптер гнезда DIP IC?

PS Филип Франик попросил меня нарисовать схемы:

схема

PS Я использовал официальный учебник по кнопке, и теперь все работает нормально. Я больше не могу воспроизвести проблему без видимой причины!.

, 👍1

Обсуждение

В схеме, которую вы разместили, нет кнопки или перемычки куда-то еще. В текущем состоянии оба контакта будут отображать только 0 в качестве своего состояния. Объясните, пожалуйста, какой соединительный кабель вы имеете в виду, куда вы его подключаете и куда он оттуда идет., @chrisl


2 ответа


2

Подключите контакты 2 и 3 с помощью двух резисторов 1K к земле.

Когда контакт, установленный как INPUT, является «плавающим» (он ни к чему не подключен), значение на нем «не определено», и прерывание может срабатывать при изменении состояния соседнего контакта или даже просто волшебным образом само по себе. Резисторы номиналом 1 кОм (называемые подтягивающими резисторами) гарантируют, что контакт установлен в НИЗКИЙ уровень, когда он не подключен с помощью перемычки.

Эта схема должна обеспечивать стабильное 0 В на контакте 3, когда переключатель не нажат, и 5 В, когда он нажат. Вы должны быть в состоянии проверить это с помощью любого вольтметра.

модифицированный дизайн из вопроса

Если проблема не устранена, замена микроконтроллера на Arduino — это лишь один из шагов, которые необходимо выполнить. Вам также потребуется записать загрузчик на чип. Это несложная процедура, но для нее требуется второй Arduino.

,

При этом нет непрерывных прерываний. Однако, как только я удаляю провод, чтобы подключить его к другому месту, где он должен быть, он снова начинает срабатывать!, @Foad

Можете ли вы нарисовать свои связи? У меня проблемы с представлением вашего дизайна. Также используйте вольтметр и проверьте, есть ли 5 В после того, как вы поместите перемычку и резистор на контакт., @Filip Franik

добавил в пост, @Foad

"...как только я убираю провод, чтобы подключить его к другому месту, где он должен быть, он снова начинает срабатывать!" В этом есть смысл. Когда контакт ни к чему не подключен, он снова начинает плавать., @Duncan C


1

Входы CMOS «плавают», когда ни к чему не подключены, и выдают полуслучайные значения. Вы можете либо соединить вывод с землей через резистор среднего значения (1кОм-10кОм), либо установить вывод в режим INPUT_PULLUP.

Вы не должны перемещать контакты прерывания во время работы Arduino. Как только вы отсоединяете провод от входа, он снова начинает плавать и может обнаруживать полуслучайные значения HIGH/LOW.

Если вы используете внешний подтягивающий резистор, поместите разъем после заземления и переместите это соединение, чтобы подтягивающий резистор всегда был подключен к контакту.

Если вы используете режим INPUT_PULLUP, вам не следует использовать подтягивающий или подтягивающий резистор. В этом режиме контакт слабо подключается к +5 В, что будет удерживать его в ВЫСОКОМ значении, когда он ни к чему не подключен. Затем вы бы заземлили его, чтобы вызвать прерывание. В режиме INPUT_PULLUP вы, вероятно, сможете отсоединить провод от вывода прерывания, не вызывая прерывания.

,