Generator przerwań PCINT Arduino – gotowy kod

Generator przerwań PCINT Arduino tworzy kod Pin Change Interrupt dla wybranych pinów Arduino UNO, Nano oraz Mega 2560. Wybierz płytkę i wejścia, a narzędzie skonfiguruje rejestry PCICR, PCMSK oraz odpowiednie funkcje ISR.

PCINT reaguje na każdą zmianę stanu pinu — zarówno LOW → HIGH, jak i HIGH → LOW — i pozwala obsługiwać więcej wejść niż standardowe attachInterrupt().

Jak używać generatora PCINT?

  1. Wybierz Arduino UNO/Nano lub Arduino Mega 2560.
  2. Zaznacz wszystkie piny, których zmianę ma wykrywać mikrokontroler.
  3. Opcjonalnie włącz inicjalizację portu szeregowego. Na UNO piny D0 i D1 są jednocześnie używane przez UART.
  4. Skopiuj wygenerowany kod do Arduino IDE i wpisz własną, możliwie krótką obsługę zdarzenia w funkcji ISR.

Co to jest przerwanie PCINT?

PCINT, czyli Pin Change Interrupt, jest sprzętowym przerwaniem wywoływanym przez zmianę poziomu logicznego na pinie. W ATmega328P wejścia są podzielone na trzy grupy. Każda grupa ma wspólny wektor przerwania, dlatego program powinien porównać bieżący stan portu z poprzednim i ustalić, który pin się zmienił.

Ważne: PCINT nie wybiera osobno zbocza narastającego albo opadającego. Reaguje na oba kierunki zmiany. Jeśli interesuje Cię tylko naciśnięcie lub tylko zwolnienie przycisku, rozróżnij je w programie na podstawie aktualnego stanu wejścia.

Piny PCINT w Arduino UNO i Nano

Piny ArduinoPort AVRGrupaWektor ISR
D8–D13PORTBPCINT0–5PCINT0_vect
A0–A5PORTCPCINT8–13PCINT1_vect
D0–D7PORTDPCINT16–23PCINT2_vect

Na Arduino UNO i klasycznym Nano z ATmega328P generator pozwala wybrać wszystkie wyprowadzone piny cyfrowe D0–D13 oraz analogowe A0–A5. Wejścia analogowe mogą pełnić także funkcję cyfrową.

PCINT a attachInterrupt() — czym się różnią?

CechaPCINTattachInterrupt()
Dostępne piny UNOD0–D13 i A0–A5D2 i D3
Rodzaj wyzwalaniaKażda zmiana stanuLOW, CHANGE, RISING albo FALLING
WektoryWspólne dla grup pinówOsobny wektor dla INT0 i INT1
Poziom obsługiBezpośrednia konfiguracja rejestrów AVRProstsza funkcja Arduino

Jak bezpiecznie pisać kod ISR?

  • W funkcji ISR wykonuj tylko krótkie operacje, na przykład zapisz stan lub ustaw flagę.
  • Zmienne współdzielone między ISR i loop() oznaczaj jako volatile.
  • Nie używaj w ISR funkcji delay() i unikaj wysyłania długich komunikatów przez Serial.
  • Dla przycisków uwzględnij drgania styków. Jedno fizyczne naciśnięcie może spowodować kilka zmian stanu.
  • Gdy kilka pinów należy do tego samego wektora, ustal źródło przerwania przez porównanie poprzedniego i bieżącego stanu portu.
Konflikt z UART: na Arduino UNO piny D0 (RX) i D1 (TX) służą do komunikacji szeregowej i wgrywania programu. Jeśli używasz Serial, wybierz inne wejścia PCINT, o ile projekt na to pozwala.

Kiedy warto użyć PCINT?

PCINT przydaje się do klawiatur z wieloma przyciskami, enkoderów, liczników impulsów o umiarkowanej częstotliwości oraz wybudzania mikrokontrolera po zmianie stanu wejścia. Jeśli potrzebujesz cyklicznego zdarzenia niezależnego od pinów, użyj sprzętowego przerwania timera Arduino.

Najczęściej zadawane pytania

Czy PCINT działa na każdym pinie Arduino UNO?

Na UNO z ATmega328P funkcję PCINT mają wszystkie wyprowadzone piny D0–D13 oraz A0–A5. Należą jednak do trzech wspólnych grup przerwań.

Czy PCINT wykrywa zbocze narastające i opadające?

Tak. Sprzęt wywołuje przerwanie po każdej zmianie. Kierunek zmiany trzeba rozpoznać w kodzie.

Dlaczego przycisk wywołuje kilka przerwań?

Najczęściej odpowiadają za to drgania styków. Zastosuj eliminację drgań programową albo sprzętową.

Powiązane materiały

Źródła techniczne: dokumentacja ATmega328P i ATmega2560 firmy Microchip.

Generator przerwań Arduino w praktyce – przykład wykorzystania:
Klawiatura na pcint