Noah Stahl'ın blogunda Timer2 ile bir LED yanıp sönme örneği var . Bununla ve veri sayfasıyla, kullanmak istediğiniz kesmeye - yani normal işlevinden vazgeçmeyi ya da değiştirmeye istekli olduğu kesime - adapte edebilmelisiniz. Timer2 genellikle bazı PWM işlevleri için kullanılır.
Onun örneği ATmega2560; ATmega328p ile de çalıştığını doğrulayabilirim. Daha kullanışlı Arduino kesme örnekleri için sitesinin etrafına bakın.
Düzenle:
İşte Nuh'un kodunun hafifçe düzenlenmiş - çoğunlukla yorumlarda - sürümü. İlgili veri yapılarını veya donanımları başlattıktan sonra Arduino setup () işlevinden Timer2init () yöntemini çağırın, çünkü zamanlama - ve kesinti - bir kez yaptığınızda başlayacaktır.
F / ex, 3 basamaklı 7 segmentli bir ekranı çoğaltmak için kullandım, böylece zamanlayıcıyı başlatmadan önce, ekran G / Ç kayıtlarını başlattım ve ekran verilerini ISR'nin arayacağı yere boşalttım.
Veri sayfasındaki bazı yararlı zamanlama verilerinin yorumlarında ve başka bir zamanlama şemasını ayarlamak için referans için kendi hesaplamalarımda bir tablo var.
ISR () makrosu, normal bir işlevin giriş ve çıkışı yerine bir ISR için kesme giriş ve çıkış kodu oluşturmaya ve onu uygun kesme vektörü ile ilişkilendirmeye özen gösterir. Bu işlevin geri kalanı 1) her kesmede çalıştırılacak kod ve 2) bir sonraki kesme için zamanlayıcıyı sıfırlamak için kod kodudur.
Yazıldığı gibi, bu bir .pde veya .ino çizimine (veya eclipse, f / ex kullanıyorsanız bir .cpp dosyasına) bırakılmalıdır. Çizim LEDPIN #define gerekir ve setup () Timer2init () çağırmak gerekir. Döngü işlevi boş olabilir veya olmayabilir; indirme sırasında LED yanıp sönmeye başlamalıdır (kelimenin tam anlamıyla Timer2init () çağrıldıktan sonra).
/*
* 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
};