Używam Arduino Uno i już skonfigurowałem go do pracy z przerwaniami na pinach cyfrowych 2, 3, 4 i 5 zgodnie z wyjaśnieniem 1 , które znalazłem.
void setup()
zawiera następujący kod do ustawienia przerwań.
//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);
A teraz funkcja ISR (PCINT2_vect) jest uruchamiana przy każdym przerwaniu. To działa jak urok. Moje pytanie brzmi: jaki jest najlepszy / najszybszy sposób, aby dowiedzieć się, który pin został wyzwolony?
Znalazłem coś w Re: Czy lepiej użyć ISR (PCINT2_vect) lub dołączyć Przerwanie na pinach 2, 3? , ale nie rozumiem kodu i nie działa on od razu po wyjęciu z pudełka. Ale wygląda imponująco ...
Jakie jest rozwiązanie?
[2] http://arduino.cc/forum/index.php/topic,72496.15.html#lastPost
Edytować:
W tej chwili czytam stan pinów z wejściowego rejestru pinów:
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" );
Na koniec chcę policzyć przerwania na pinach. Ale jak mogę zapewnić, że nie ma dwóch liczonych?
źródło
Odpowiedzi:
Sam mam pierwsze rozwiązanie, ale nie mogłem przetestować niezawodności, ponieważ sprzęt nie jest skończony.
Najpierw dodałem oldPins i tickCount jako zmienne globalne:
I tak w tej chwili rozwiązałem ISR. Lepsze rozwiązania są mile widziane.
źródło