Проблема 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