Не удается заставить attachInterrupt работать
У меня есть датчик гироскопа accel +, подключенный к arduino zero. Он настроен на вывод сигнала прерывания на вывод 2 при нажатии. Я могу выполнить цифровое считывание
на выводе, и он действительно становится высоким, так что прерывание от датчика срабатывает, как и ожидалось.
Однако, когда я пытаюсь присоединить
interrupt к этому pin, чтобы я мог обновить логическую переменную для последующего использования в коде, это не работает. Логическая переменная никогда не обновляется.
Я делаю что-то не так в коде, или это аппаратная проблема? Спасибо вам за вашу помощь.
byte int2 = 2;
int int2_val;
volatile boolean tapcheck = false;
void interrupt_setup() {
// настройте датчик на запуск прерываний
// ...
pinMode(int2, INPUT);
// присоединить прерывание к выводу 2
attachInterrupt(digitalPinToInterrupt(int2), tapdummyf, RISING);
}
// двойное нажатие функции ISR
void tapdummyf () {
tapcheck = !tapcheck;
}
void interrupt_test() {
int2_val = digitalRead(int2);
if (int2_val == 1) {
SerialUSB.println ("interrupt triggered ");
int2_val = 0;
}
}
void loop(void) {
// в цикле
interrupt_test();
if (tapcheck){
SerialUSB.println("dt1");
}
}
@Zhelyazko Grudov, 👍-1
Обсуждение2 ответа
Вы должны использовать внешний выпадающий резистор на вашем входном выводе, 10K, вероятно, было бы идеально, tapcheck будет работать только при альтернативных прерываниях, когда вы его переключаете.
Спасибо. Проблема заключалась в том, что вывод 2 был затруднен с прерываниями., @Zhelyazko Grudov
Вывод 2 на Arduino M0 является единственным выводом в заголовках, который не поддерживает внешнее прерывание, поскольку он сопоставлен с выводом PA08 SAMD21G, который является единственным выводом SAMD, который не может быть мультиплексирован как внешнее прерывание (поскольку это единственный вывод, который поддерживает NMI).
На плате Arduino Zero SAMD контакт PA08 сопоставлен с контактом 4 разъема, что является лучшим выбором для платы в формате Uno, поскольку на Uno только контакты 2 и 3 поддерживают внешнее прерывание. Возможно, изначально была идея, что NMI (немаскируемое прерывание) — это еще лучшее внешнее прерывание.
Для функции attachInterrupt требуется вывод, поддерживающий внешнее прерывание.
Похоже, у вас плата Arduino M0, а не Arduino Zero.
- Почему необходимо использовать ключевое слово volatile для глобальных переменных при обработке прерываний в ардуино?
- Серийное прерывание
- Влияет ли `millis()` на длинные ISR?
- Как прервать функцию цикла и перезапустить ее?
- Аппаратное прерывание срабатывает случайным образом
- Какой правильный способ запроса устройства I2C из процедуры обслуживания прерывания?
- Чтение квадратурного энкодера в реальном времени с полным разрешением только с одним прерыванием на ATmega328
- Как выйти из прерывания таймера (ISR(TIMER1_COMPA_vect))
Известно, что вывод 2 в прошлом был ненадежным (см. https://forum.arduino.cc/t/zero-attachinterrupt/331384 ). Попробуйте использовать другой контакт, @Majenko
@Majenko это действительно была проблема, вау, поди разберись. Спасибо вам :), @Zhelyazko Grudov