Проблема ISR: Arduino Pro Micro

Я пытаюсь провести небольшой тест, в котором использую ISR на Arduino Pro Micro, выводя его из спящего режима. Я использую резистор с датчиком силы (FSR, резистор, который меняет свое сопротивление в зависимости от того, насколько сильно вы на него нажимаете) со схемой делителя напряжения, где выход делителя напряжения подключен к аналоговому выводу и выводу цифрового прерывания. Я не могу заставить прерывание срабатывать независимо от того, какое у меня условие. Я не думаю, что Vout на делителе напряжения слишком низкое, поскольку АЦП регистрирует значения от 0 до 1000 (от 0 до примерно 4,8 В) при нажатии кнопки FSR. Что-то не так с моим кодом, что мешает правильному выполнению моего теста?

uint8_t LED = 9;
uint8_t wakeup = 2;
uint8_t enable = 0;

void Wakeup(void);


void setup() {
  // put your setup code here, to run once:
  pinMode(LED, OUTPUT);
  pinMode(wakeup, INPUT);
  attachInterrupt(digitalPinToInterrupt(1), Wakeup, RISING);
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  //Serial.println(analogRead(A2));
  if (enable == HIGH)
    digitalWrite(LED, HIGH);
  else if (enable == LOW)
    digitalWrite(LED, LOW);
  if (analogRead(A2) < 700)
    enable = 0;
}


void Wakeup(void) {
  enable = 1;
  Serial.println("Interrupt");
}

, 👍0

Обсуждение

возможно, вам не следует использовать вывод последовательного порта для прерывания, @jsotola

Я думал, что 0 и 1 - это серийные контакты. Я использую цифровой контакт 2, @Jay

@jsotola это профессиональный микро с 32U4. он не использует контакт 2 для серийного номера, @Tirdad Sadri Nejad

пожалуйста, просмотрите свой код, @jsotola


1 ответ


1
  • Не выполняйте серийную печать внутри ISR.

  • Ваша переменная enable должна быть объявлена как volatile, поскольку она изменяется внутри ISR. Компилятор имеет право кэшировать значение переменной, если вы этого не сделаете.

  • Вы непоследовательно используете enable. Вы тестируете НИЗКИЙ или ВЫСОКИЙ, но устанавливаете его на 0 или 1. Теперь они совпадают, но кто-то может удивиться. Если вы собираетесь тестировать НИЗКИЙ или ВЫСОКИЙ уровень, назначьте ему НИЗКИЙ или ВЫСОКИЙ уровень.

См. мой справочный вопрос Как прерывания работают на Arduino Uno и подобных платах?.

Я думал, что 0 и 1 — это серийные контакты. Я использую цифровой контакт 2

Не в коде вас нет:

attachInterrupt(digitalPinToInterrupt(1), Wakeup, RISING);

Вы имеете в виду:

attachInterrupt(digitalPinToInterrupt(wakeup), Wakeup, RISING);

Существование двух имен, различающихся только регистром, немного сбивает с толку.

,