Próbuję utworzyć przerwanie opóźnienia czasowego w Arduino. Chciałbym użyć funkcji interrupts (), ponieważ jest to wewnętrzne przerwanie.
Przykład: Powiedzmy, że chciałbym, aby kontrolka mrugała i wyłączała się, podając jedynie czas przerwania.
Istnieje przykładowy kod, ale wykorzystuje on zewnętrzne przerwania (attachInterrupt ()). Chciałbym nadal używać wewnętrznych przerwań.
arduino
microcontroller
interrupts
Przypadkowy
źródło
źródło
Odpowiedzi:
Blog Noah Stahl ma przykład migania diody LED za pomocą Timera2 . Dzięki temu i karcie danych powinieneś być w stanie dostosować ją do dowolnego przerwania, którego chcesz użyć - tj. Przerwania, którego normalnej funkcji najbardziej możesz sobie pozwolić na rezygnację lub na modyfikację. Timer2 jest zwykle używany do niektórych funkcji PWM.
Jego przykład przytacza ATmega2560; Mogę potwierdzić, że działa również z ATmega328p. Rozejrzyj się po jego stronie, aby znaleźć bardziej przydatne przykłady przerwań Arduino.
Edytować:
Oto moja lekko zredagowana - głównie w komentarzach - wersja kodu Noego. Wywołaj Timer2init () z funkcji Arduino setup () po zainicjowaniu powiązanej struktury danych lub sprzętu, ponieważ odmierzanie czasu i przerwanie rozpocznie się po wykonaniu tej czynności.
F / ex, użyłem go do multipleksowania 3-cyfrowego 7-segmentowego wyświetlacza, więc przed zainicjowaniem timera zainicjowałem rejestry we / wy wyświetlacza i wyczyściłem dane wyświetlania w miejscu, w którym będzie go szukał ISR.
W komentarzach znajduje się tabela niektórych przydatnych danych dotyczących czasu z arkusza danych i moich własnych obliczeń, które mogą posłużyć jako odniesienie do ustanowienia innego schematu pomiaru czasu.
Makro ISR () zajmuje się tworzeniem kodu wejścia i wyjścia przerwań dla ISR zamiast wejścia i wyjścia normalnej funkcji oraz powiązaniem go z odpowiednim wektorem przerwań. Reszta tej funkcji to 1) kod, który ma być uruchamiany przy każdym przerwaniu, oraz 2) kod kodu, aby zresetować licznik czasu dla następnego przerwania.
Jak napisano, powinno to zostać przeniesione do szkicu .pde lub .ino (lub pliku .cpp, jeśli używasz Eclipse, f / ex). Szkic musi # zdefiniować LEDPIN, a setup () musi wywołać Timer2init (). Funkcja pętli może być pusta lub nie; dioda LED powinna zacząć migać podczas pobierania (no dosłownie po wywołaniu Timer2init ()).
źródło
Funkcja attachInterrupt () faktycznie dołącza przerwanie do zmiany stanu zewnętrznego na pinie, nie ma żadnych innych opcji.
Na tej samej stronie opcje trybu są wymienione jako:
Przepraszam, że jestem nosicielem złych wieści, to jedna z pierwszych rzeczy, których szukałem.
źródło
Ten artykuł na temat PWM rozwieje wiele twoich wątpliwości dotyczących używania zegarów Arduino. W Arduino są dwa 8-bitowe timery i jeden 16-bitowy. Nie ma interfejsu API wysokiego poziomu, aby podłączyć funkcję ISR bezpośrednio do timerów, który jest dostarczany z Arduino SDK (tj. Jako standardowa biblioteka), ale nieco niższa metoda ustawiania rejestrów funkcji specjalnych i arytmetyki bitów / operacje na nich. Istnieje jednak biblioteka użytkownika o nazwie Timer jeden .
źródło
Arduino używa wszystkich trzech timerów w ATMega328.
Timer1
(16 bitów) służy do funkcji takich jakdelay()
imillis()
do wyjścia PWM na pinach 5 i 6. Pozostałe dwa timery -Timer0
iTimer2
są używane do wyjścia PWM na pinach 3, 9, 10, 11.Tak więc nie ma funkcji Arduino dla przerwania timera. Ale jest na to sposób. Możesz użyć tego kodu, aby włączyć przerwanie timera na
Timer2
:Napisałem ten kod bez testowania, więc możliwe, że popełniłem błąd. W takim przypadku sprawdź arkusz danych, s . 156 .
Jeśli chcesz zmienić częstotliwość timera (prescaler), po prostu zmień rejestr
TCCR2A
. Aby uzyskać więcej informacji, zajrzyj do arkusza danych na stronie 153. Ale jeśli zmienisz częstotliwość timera, zmienisz również częstotliwość sygnału PWM na dwóch pinach wyjściowych!źródło
Timer0
iTimer2
są 8-bitowe i tylkoTimer1
16-bitowe.