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 ()).
/*
* From sample interrupt code published by Noah Stahl on his blog, at:
* http://arduinomega.blogspot.com/p/arduino-code.html
*
*/
/*** FUNC
Name: Timer2init
Function: Init timer 2 to interrupt periodically. Call this from
the Arduino setup() function.
Description: The pre-scaler and the timer count divide the timer-counter
clock frequency to give a timer overflow interrupt rate:
Interrupt rate = 16MHz / (prescaler * (255 - TCNT2))
TCCR2B[b2:0] Prescaler Freq [KHz], Period [usec] after prescale
0x0 (TC stopped) 0 0
0x1 1 16000. 0.0625
0x2 8 2000. 0.500
0x3 32 500. 2.000
0x4 64 250. 4.000
0x5 128 125. 8.000
0x6 256 62.5 16.000
0x7 1024 15.625 64.000
Parameters: void
Returns: void
FUNC ***/
void Timer2init() {
// Setup Timer2 overflow to fire every 8ms (125Hz)
// period [sec] = (1 / f_clock [sec]) * prescale * (255-count)
// (1/16000000) * 1024 * (255-130) = .008 sec
TCCR2B = 0x00; // Disable Timer2 while we set it up
TCNT2 = 130; // Reset Timer Count (255-130) = execute ev 125-th T/C clock
TIFR2 = 0x00; // Timer2 INT Flag Reg: Clear Timer Overflow Flag
TIMSK2 = 0x01; // Timer2 INT Reg: Timer2 Overflow Interrupt Enable
TCCR2A = 0x00; // Timer2 Control Reg A: Wave Gen Mode normal
TCCR2B = 0x07; // Timer2 Control Reg B: Timer Prescaler set to 1024
}
/*** FUNC
Name: Timer2 ISR
Function: Handles the Timer2-overflow interrupt
Description: Maintains the 7-segment display
Parameters: void
Returns: void
FUNC ***/
ISR(TIMER2_OVF_vect) {
static unsigned int led_state = 0; // LED state
led_state = !led_state; // toggles the LED state
digitalWrite(TOGGLE_PIN, led_state);
TCNT2 = 130; // reset timer ct to 130 out of 255
TIFR2 = 0x00; // timer2 int flag reg: clear timer overflow flag
};