Blog Noah Stahl memiliki contoh berkedip LED dengan Timer2 . Dengan itu dan lembar data, Anda harus dapat menyesuaikannya dengan interupsi mana pun yang ingin Anda gunakan - yaitu, interupsi yang fungsi normalnya paling Anda mampu untuk menyerah atau bersedia untuk memodifikasi. Timer2 biasanya digunakan untuk beberapa fungsi PWM.
Teladannya mengutip ATmega2560; Saya dapat mengonfirmasi bahwa ini bekerja dengan ATmega328p juga. Lihatlah sekeliling situsnya untuk contoh interupsi Arduino yang lebih berguna.
Edit:
Inilah sedikit kode saya yang diedit - kebanyakan dalam komentar - versi Nuh. Panggil Timer2init () dari fungsi pengaturan Arduino () setelah Anda menginisialisasi struktur data atau perangkat keras yang terkait, karena pengaturan waktu - dan interupsi - akan dimulai setelah Anda melakukannya.
F / ex, saya menggunakannya untuk multiplex tampilan 3-segmen 7-digit jadi saya sebelum menginisialisasi timer, saya menginisialisasi register display I / O dan mengapit data tampilan di tempat di mana ISR akan mencarinya.
Ada tabel di komentar dari beberapa data waktu yang berguna dari lembar-data dan perhitungan saya sendiri untuk referensi untuk mengatur skema waktu lain.
Makro ISR () mengatur pembuatan entri interupsi dan kode keluar untuk ISR alih-alih entri fungsi normal dan keluar, dan menghubungkannya dengan vektor interupsi yang tepat. Sisa dari fungsi itu adalah 1) kode yang akan dijalankan pada setiap interupsi, dan 2) kode kode untuk mengatur ulang timer untuk interupsi berikutnya.
Seperti yang tertulis, ini harus dimasukkan ke sketsa .pde atau .ino (atau file .cpp, jika Anda menggunakan eclipse, f / ex). Sketsa tersebut perlu #define LEDPIN, dan setup () perlu memanggil Timer2init (). Fungsi loop mungkin kosong atau tidak; LED harus mulai berkedip saat unduhan (yah, secara harfiah, setelah Timer2init () dipanggil).
/*
* 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
};