Przerwania typu PCINT – klawiatura

Przerwania typu PCINT są niezwykle przydatne w praktyce. Oczywiście można wykorzystywać przerwania zewnętrzne (External Interrupts) jednak w Arduino Uno mamy do dyspozycji jedynie dwa przerwania zewnętrzne – w wielu przypadkach to za mało. Przerwania typu PCINT można użyć na każdym pinie Arduino – daje to niesamowite możliwości!

Przykład – klawiatura złożona z trzech przycisków.

Przyciski podłączamy zgodnie z poniższym schematem – Rys.1 (oczywiście numery pinów podłączeń przycisków są dowolne – jednak zmianę trzeba uwzględnić w kodzie).

Rys.1. Przykładowy sposób podłączenia przycisków do Arduino.

W przykładzie wybrano następujące podłączenie przycisków:

Przycisk S1 – pin Arduino nr 11.

Przycisk S2 – pin Arduino nr 7.

Przycisk S3 – pin Arduino nr 9.

W kolejnym kroku włączamy generator przerwań typu PCINT, aby błyskawicznie wygenerować niezbędny fragment kodu (Link do generatora przerwań typu PCINT).
W generatorze zaznaczamy odpowiednie piny Arduino czyli: D11, D7 oraz D9 (tak jak na Rys.2).


Rys.2. Sposób wyboru pinów Arduino, na których obsługiwane będą przerwania typu PCINT.

Wynikiem generacji jest poniższy kod:

W tym przypadku zmienna “flag” powinna być typu volatile.

Zmienne PIN_STATE_D7, PIN_STATE_D9, PIN_STATE_D11 – wskazują nam, czy przyciski są aktualnie wciśnięte czy też nie (wartość 1 dla wciśniętego przycisku, wartość 0 dla zwolnionego przycisku).

Zadaniem natychmiastowej aktualizacji stanów powyższych zmiennych zajmują się właśnie zdefiniowane przerwania typu PCINT. To olbrzymie ułatwienie, ponieważ aktualizacja przebiega w tle, niezależnie od realizowanego programu głównego. W każdym miejscu programu mamy dostęp do aktualnych wartości. Praktycznie nie musimy się martwić, że program nie zauważy wciśnięcia przycisku, bo wykonuje jakąś inną czasochłonną funkcję.

W dalszym kroku, aby klawiatura działała poprawnie, musimy programowo wyeliminować wpływ efektu drgań styków. Ustalono opóźnienie 50ms (stała: t_delay).

Przykładowy program obsługujący klawiaturę (zliczający przyciśnięcia) wykorzystujący przerwania PCINT przedstawiono poniżej:

Efekt działania programu, gdy wciskamy nasze przyciski (odpowiedź na porcie szeregowym) przedstawiono na Rys.3.

Rys.3. Odpowiedź z portu szeregowego na przyciskanie przycisków klawiatury.

Gdyby były problemy ze zrozumieniem powyższego kodu proszę o kontakt na stronie Facebook Arduino Polska.