attiny85: ISR не срабатывает для PCINT2?

Я использую attiny85 для считывания скорости вращения вентилятора, сообщаемой парой 4-проводных вентиляторов. Я планировал подключить выход TACH от вентиляторов к контактам 1 и 2, но столкнулся с проблемой: я смог без проблем обработать прерывания на контакте 1, но не могу заставить ISR срабатывать при изменениях на контакте 2. Код, демонстрирующий проблему, выглядит следующим образом:

#define PIN_LED 0
#define PIN_TACH2 2

void setup() {
  cli();
  pinMode(PIN_TACH2, INPUT_PULLUP);
  pinMode(PIN_LED, OUTPUT);

  GIMSK |= _BV(PCIE);
  PCMSK |= _BV(digitalPinToPCMSKbit(PIN_TACH2));
  sei();
}

void loop() {
  digitalWrite(PIN_LED, 1);
  delay(2000);    
}

ISR(PCINT0_vect) {
  byte tach2;

  tach2 = (PINB & _BV(PIN_TACH2));

  if (! tach2) {
    digitalWrite(PIN_LED, 0);
  }
}

Если я заменю определения PIN_TACH2 и PIN_TACH2_INT на контакт 1, например...

#define PIN_TACH2 1
#define PIN_TACH2_INT PCINT1

...работает отлично (прерывания также работают для контактов 0 и 3).

Почему я не могу обработать прерывания смены вывода для вывода 2?

для @chrisl

Это всего лишь тестовый код. Светодиод горит до тех пор, пока не сработает ISR, после чего он погаснет на 2 секунды. С прерываниями, подключенными к контактам 1 или 3, все работает так, как и ожидалось: падающий фронт на контакте заставляет светодиод погаснуть.

На контакте 2 ISR никогда не срабатывает.

, 👍0


1 ответ


Лучший ответ:

2

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

Ответ...

ПЕРЕД ТЕСТИРОВАНИЕМ СХЕМЫ ОТКЛЮЧИТЕ ПРОГРАММАТОР

Вот и все. При отключенном программаторе все работает как надо.

,