Arduino Micro Невозможно заставить прерывание 6 работать на PIN 7

Узнав о ситуации с pin7 из этого руководства:

https://forum.sparkfun.com/viewtopic.php?f=32&t=35847

    void setup(){

    EICRB |= (1<<ISC60)|(0<<ISC61); // устанавливает тип прерывания для EICRB (INT6).
                                  // EICRA устанавливает тип прерывания для INT0...3

    /*
    ISCn0  ISCn1   Where n is the interrupt. 0 for 0, etc
      0      0   Triggers on low level
      1      0   Triggers on edge
      0      1   Triggers on falling edge
      1      1   Triggers on rising edge
    */
EIMSK |= (1<<INT6); // активирует прерывание. 6 для 6 и т.д.

void loop(){
//заниматься другими делами здесь
}

ISR(INT6_vect) {
  // код прерывания идет здесь
  }

Я установил:

EICRB |= (0<<ISC60)|(0<<ISC61);

Потому что мне нужно, чтобы он срабатывал на НИЗКОМ уровне.

Я все еще не могу заставить его работать на микроконтроллере. ЕСЛИ я использую этот вывод как обычный входной вывод, то я могу четко видеть LOW/HIGH на выводе 7 с помощью цифрового чтения.

У меня там установлен датчик, который в случае срабатывания переключается на НИЗКИЙ уровень.

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

, 👍1

Обсуждение

Операция ИЛИ с 0 ничего не даёт., @Ignacio Vazquez-Abrams

А вы определили ISR?, @Ignacio Vazquez-Abrams


1 ответ


1

Я использовал следующий код и петлю от контакта 8 до контакта 7:

// петля: контакт 8 -> контакт 7

void setup() {
  pinMode(7, INPUT_PULLUP);
  pinMode(8, OUTPUT);
  pinMode(LED_BUILTIN_TX, OUTPUT); // чтобы увидеть логический уровень контакта 8 на светодиоде TX
  pinMode(LED_BUILTIN, OUTPUT); // переключается ISR

  EICRB |= _BV(ISC60);  // Срабатывает по фронту
  EIMSK |= _BV(INT6);   // активирует прерывание
}

ISR(INT6_vect) {
  PINC = _BV(PC7);  // переключение светодиода 13 (@ PC7)
}

void loop() {
  digitalWrite(8, HIGH);
  digitalWrite(LED_BUILTIN_TX, HIGH);

  delay(500);
  digitalWrite(8, LOW);
  digitalWrite(LED_BUILTIN_TX, LOW);
  delay(500);

} 

И это работает отлично. Единственная проблема, которую я могу себе представить, это правильно выяснить, какой пин на самом деле 7, поскольку метка находится справа от пина (не снизу и не слева).

,