Правильно ли я считаю, что если у вас есть два контакта, вызывающих одно и то же прерывание AVR PCINT (например, вектор PCINT0, вызванный выводами PCINT0 или PCINT1 - я думаю, что совпадение имен векторов и выводов сбивает с толку), то единственный способ определить, какой вывод (s) вызвало прерывание, чтобы записать их состояние после каждого прерывания и сравнить предыдущие и текущие значения всех контактов, которые включены в PCMSKn?
avr
interrupts
atmel
Том Дэвис
источник
источник
Ответы:
Это!
Причина, по которой существует 8 различных внешних выводов для вектора прерывания, заключается в том, чтобы упростить компоновку печатной платы или использовать другой вывод в случае конфликта с другой функцией выводов.
В общем, допустим, вы заботитесь только о PB0 (PCINT0) и PB1 (PCINT1). Таким образом, маска разрешения смены выводов PCMSK0 будет установлена на 0x03.
Так что, если
pins
0x01, вы знаете, что это PB0 ... И если вам нужно знать, что изменилось, вам нужно сравнить его сpreviousPins
, в значительной степени, в точности тем, что вы думали.Имейте в виду, что в некоторых случаях
pins
может быть неточным, если вывод имеет состояние изменения после прерывания, но до этогоpins = (PINB & 0x03)
.Другой вариант - использовать отдельные векторы прерываний с одним выводом от каждого вектора, чтобы вы знали, какой из них изменен. Опять же , это также имеет некоторые проблемы, такие как прерывания приоритета и после того , как центральный процессор входит в ISR, разрешения глобальных прерываний бит
I-bit
вSREG
будет очищен так , что все остальные прерывания отключены, но вы можете установить его внутри прерывания , если вы хотите, что бы быть вложенным прерыванием.Для получения дополнительной информации ознакомьтесь с примечанием приложения Atmel « Использование внешних прерываний для устройств megaAVR».
Обновить
Вот полный пример кода, который я только что нашел здесь .
источник
В более новом регистре серии ATTINY
INTFLAGS
будет указано , какой бит порта вызвал прерывание.Вот выдержка из таблицы:
источник