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 никогда не срабатывает.
@larsks, 👍0
1 ответ
Лучший ответ:
Итак, получается, что это была действительно глупая проблема, и полностью по моей вине, но я оставлю этот вопрос здесь в надежде, что это убережет кого-то другого от такой же проблемы.
Ответ...
ПЕРЕД ТЕСТИРОВАНИЕМ СХЕМЫ ОТКЛЮЧИТЕ ПРОГРАММАТОР
Вот и все. При отключенном программаторе все работает как надо.
- Почему необходимо использовать ключевое слово volatile для глобальных переменных при обработке прерываний в ардуино?
- Серийное прерывание
- Влияет ли `millis()` на длинные ISR?
- PCINT0, PCINT1, PCINT2 и т. д. на ATtiny45/85
- Как прервать функцию цикла и перезапустить ее?
- Как назначить прерывание на нажатие кнопки с помощью ATtiny? (прерывание не срабатывает с моим кодом)
- Прерывание переполнения таймера AVR не работает
- ATtiny85 AC Phase Control для регулировки яркости лампочки