Проблема 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");
}
@Jay, 👍0
Обсуждение1 ответ
Не выполняйте серийную печать внутри ISR.
Ваша переменная
enable
должна быть объявлена какvolatile
, поскольку она изменяется внутри ISR. Компилятор имеет право кэшировать значение переменной, если вы этого не сделаете.Вы непоследовательно используете
enable
. Вы тестируете НИЗКИЙ или ВЫСОКИЙ, но устанавливаете его на 0 или 1. Теперь они совпадают, но кто-то может удивиться. Если вы собираетесь тестировать НИЗКИЙ или ВЫСОКИЙ уровень, назначьте ему НИЗКИЙ или ВЫСОКИЙ уровень.
См. мой справочный вопрос Как прерывания работают на Arduino Uno и подобных платах?.
Я думал, что 0 и 1 — это серийные контакты. Я использую цифровой контакт 2
Не в коде вас нет:
attachInterrupt(digitalPinToInterrupt(1), Wakeup, RISING);
Вы имеете в виду:
attachInterrupt(digitalPinToInterrupt(wakeup), Wakeup, RISING);
Существование двух имен, различающихся только регистром, немного сбивает с толку.
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Распиновка аналога Arduino Pro Micro
- Keyboard.h: Нет такого файла или каталога - Arduino pro micro (leonardo)
- Вращающийся энкодер, использующий прерывание
- Прерывание переполнения Timer0 не работает
- Библиотека джойстиков Arduino не распознается играми (Steam)
- Тахометр на базе Леонардо?
- Управлять яркостью светодиода с помощью потенциометра без кода, а также считывать значение потенциометра?
возможно, вам не следует использовать вывод последовательного порта для прерывания, @jsotola
Я думал, что 0 и 1 - это серийные контакты. Я использую цифровой контакт 2, @Jay
@jsotola это профессиональный микро с 32U4. он не использует контакт 2 для серийного номера, @Tirdad Sadri Nejad
пожалуйста, просмотрите свой код, @jsotola