Я использую Arduino Uno и уже настроил его для работы с прерываниями на цифровых выводах 2, 3, 4 и 5 в соответствии с объяснением 1, которое я нашел.
void setup()
содержит следующий код для настройки прерываний.
//Endable Interrupts for PCIE2 Arduino Pins (D0-7)
PCICR |= (1<<PCIE2);
//Setup pins 2,3,4,5
PCMSK2 |= (1<<PCINT18);
PCMSK2 |= (1<<PCINT19);
PCMSK2 |= (1<<PCINT20);
PCMSK2 |= (1<<PCINT21);
//Trigger Interrupt on rising edge
MCUCR = (1<<ISC01) | (1<<ISC01);
И теперь функция ISR (PCINT2_vect) срабатывает при каждом прерывании. Это работает как шарм. У меня вопрос, какой самый лучший / быстрый способ узнать, какой пин был сработал?
Я нашел что-то в Re: Лучше использовать ISR (PCINT2_vect) или attachInterrupt на контактах 2, 3? , но я не понимаю код, и он не работает из коробки. Но выглядит впечатляюще ...
Каково решение?
[2] http://arduino.cc/forum/index.php/topic,72496.15.html#lastPost
Редактировать:
В данный момент я читаю состояние контакта из входного регистра контактов:
if (PIND & 0b00000100)
Serial.println( "PIN 2" );
if (PIND & 0b00001000)
Serial.println( "PIN 3" );
if (PIND & 0b00010000)
Serial.println( "PIN 4" );
if (PIND & 0b00100000)
Serial.println( "PIN 5" );
В конце я хочу посчитать прерывания на выводах. Но как я могу заверить, что не считаются дважды?
источник
Ответы:
У меня есть первое решение, но я не смог проверить надежность, так как аппаратное обеспечение не закончено.
Сначала я добавил oldPins и tickCount как глобальные переменные:
И вот как я решил ISR на данный момент. Лучшие решения более чем приветствуются.
источник