Generator przerwań zegara Arduino – Timer1, CTC i ISR

Generator przerwań zegara Arduino konfiguruje sprzętowy timer mikrokontrolera i tworzy kod trybu CTC oraz funkcję ISR. Wybierz Arduino UNO, Nano lub Mega, podaj częstotliwość przerwania, a narzędzie dobierze preskaler i wartość rejestru OCR.

To są przerwania sprzętowego timera, a nie przerwania zewnętrzne na pinach D2 i D3.

setup()
ISR()

Instrukcja obsługi generatora przerwań zegara Arduino

Generator służy do przygotowania ustawień timera (przerwań zegara) w Arduino. Poniżej znajdziesz prostą instrukcję krok po kroku, także dla początkujących.

1. Wybierz typ płytki

Na górze formularza wybierz, czy używasz Arduino Uno/Nano (ATmega328P) czy Arduino Mega 2560 (ATmega2560). Lista timerów dopasuje się do wybranej płytki (Mega ma Timery 0–5).

2. Wybierz timer

Wybierz timer, którego chcesz użyć (np. Timer1). Jeśli nie wiesz, zacznij od Timer1 — jest często używany i oferuje dobrą rozdzielczość. Na Mega dostępne są także Timery 3/4/5.

3. Ustaw częstotliwość

Podaj, ile razy na sekundę ma wywoływać się przerwanie (np. 1000 Hz = 1000 razy na sekundę). Generator sam przeliczy parametry timera.

4. Sprawdź wyniki

Generator pokaże:

  • ustawienia preskalera,
  • wartość rejestru porównania (OCR),
  • informację, czy ustawienie jest możliwe dla wybranego timera.

5. Skopiuj kod do Arduino

Skopiuj wygenerowany kod i wklej go do szkicu Arduino IDE. Upewnij się, że:

  • inicjalizacja timera znajduje się w funkcji setup(),
  • obsługa przerwania znajduje się w odpowiedniej funkcji ISR,
  • nie używasz tego samego timera do innych bibliotek (np. Servo).

6. Testuj działanie

Wgraj program do Arduino. Jeśli potrzebujesz sprawdzić, czy przerwanie działa, możesz np. przełączać diodę LED w funkcji ISR (dla testu).

Uwaga: niektóre biblioteki korzystają z timerów i mogą kolidować z konfiguracją przerwań. Na Arduino Uno/Nano:

  • Servo zwykle używa Timer1,
  • Tone zwykle używa Timer2,
  • funkcje czasu millis()/delay() korzystają z Timer0,
  • PWM jest powiązane z Timer0/1/2 (zależnie od pinu).

Na Arduino Mega 2560 odpowiednikiem Timer1 jest Timer5, a dodatkowo dostępne są Timery 3 i 4, co ułatwia dobranie timera bez konfliktu z bibliotekami.

Jeśli pojawiają się problemy w działaniu programu, wybierz inny timer albo sprawdź w dokumentacji, z którego timera korzysta dana biblioteka.

Jak działa przerwanie zegara Arduino?

Sprzętowy Timer/Counter zwiększa licznik niezależnie od głównej pętli programu. W trybie CTC licznik jest zerowany, gdy osiągnie wartość zapisaną w rejestrze OCR. Zdarzenie porównania może wtedy wywołać funkcję ISR w równych odstępach czasu.

Dla podstawowego trybu CTC częstotliwość przerwania można opisać wzorem:

f = F_CPU / (preskaler × (1 + OCRnA))

Generator sprawdza dostępne preskalery i zakres licznika, a następnie wybiera możliwie dokładne ustawienie. Dla typowej płytki UNO lub Mega częstotliwość zegara F_CPU wynosi 16 MHz.

Timery w Arduino UNO i Nano

TimerRozdzielczośćTypowe powiązaniaWskazówka
Timer08 bitówmillis(), micros(), delay(), PWM D5/D6Nie zmieniaj bez potrzeby, jeśli program korzysta z funkcji czasu Arduino
Timer116 bitówPWM D9/D10, często biblioteka ServoNajwygodniejszy do precyzyjnych i wolniejszych przerwań
Timer28 bitówPWM D3/D11, często funkcja tone()Dobry, gdy Timer1 jest zajęty, ale ma mniejszy zakres

Arduino Mega 2560 udostępnia dodatkowo 16-bitowe Timery 3, 4 i 5. Dzięki nim łatwiej uniknąć konfliktu z bibliotekami i zachować Timer0 dla standardowych funkcji czasu.

Jak dobrać częstotliwość przerwania?

Najpierw określ okres zdarzenia. Częstotliwość 1 Hz oznacza jedno wywołanie na sekundę, 100 Hz — co 10 ms, a 1000 Hz — co 1 ms. Bardzo wysoka częstotliwość zostawia procesorowi mało czasu na wykonywanie loop(), dlatego ISR powinna być krótka.

Uwaga na obciążenie procesora: jeśli przerwanie trwa 50 µs i uruchamia się 10 000 razy na sekundę, sama obsługa ISR może zużyć około połowy czasu procesora. W ISR ustaw flagę lub zwiększ licznik, a cięższe zadanie wykonaj w loop().

Przerwanie timera a millis()

millis() jest prostsze, gdy program ma okresowo sprawdzać warunki i dopuszczalne są niewielkie przesunięcia czasu wynikające z długości pętli. Sprzętowe przerwanie timera wybierz wtedy, gdy zdarzenie ma występować w regularnym rytmie niezależnie od aktualnie wykonywanego fragmentu loop().

Timer przydaje się między innymi do próbkowania sygnału, programowego zegara, sterowania krokami silnika lub cyklicznego ustawiania flag. Nie zastępuje jednak przemyślanej architektury programu — długa ISR nadal blokuje obsługę pozostałych zdarzeń.

Najczęstsze konflikty timerów

  • Zmiana Timer0 może zaburzyć millis(), micros() i delay().
  • Biblioteka Servo na płytkach z ATmega328P zwykle korzysta z Timer1.
  • Funkcja tone() może zajmować Timer2.
  • Zmiana trybu timera wpływa na PWM przypisane do jego wyjść OCnA/OCnB.
  • Dwie biblioteki próbujące konfigurować ten sam timer nadpiszą sobie ustawienia.

Najczęściej zadawane pytania

Czy przerwanie zegara działa tylko na pinach D2 i D3?

Nie. D2 i D3 na UNO dotyczą zewnętrznych przerwań INT0 i INT1. Generator konfiguruje wewnętrzny sprzętowy timer mikrokontrolera.

Który timer wybrać w Arduino UNO?

Najczęściej wygodny jest 16-bitowy Timer1. Przed użyciem sprawdź jednak, czy nie korzysta z niego biblioteka Servo albo PWM na pinach D9 i D10.

Czy w funkcji ISR można używać delay()?

Nie należy. ISR powinna działać krótko; ustaw flagę i wykonaj dłuższą operację w głównej pętli.

Powiązane materiały

Źródła techniczne: dokumentacja ATmega328P i ATmega2560 firmy Microchip, rozdziały Timer/Counter oraz tryb CTC.