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.
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
| Timer | Rozdzielczość | Typowe powiązania | Wskazówka |
|---|---|---|---|
| Timer0 | 8 bitów | millis(), micros(), delay(), PWM D5/D6 | Nie zmieniaj bez potrzeby, jeśli program korzysta z funkcji czasu Arduino |
| Timer1 | 16 bitów | PWM D9/D10, często biblioteka Servo | Najwygodniejszy do precyzyjnych i wolniejszych przerwań |
| Timer2 | 8 bitów | PWM 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.
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()idelay(). - 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
- Arduino millis() bez delay() — programowe odmierzanie czasu bez blokowania pętli.
- Generator przerwań PCINT — reagowanie na zmianę stanu wejść.
- Arduino UNO pinout — piny PWM i funkcje zaawansowane timerów.
- Generatory i kalkulatory Arduino — wszystkie narzędzia online.
Źródła techniczne: dokumentacja ATmega328P i ATmega2560 firmy Microchip, rozdziały Timer/Counter oraz tryb CTC.