Saya mencoba membuat interupsi waktu tunda dengan Arduino. Saya ingin menggunakan fungsi interupsi (), karena ini adalah interupsi internal.
Contoh: Katakanlah, saya ingin membuat lampu berkedip dan mati, dengan hanya waktu interupsi.
Ada kode sampel, tetapi menggunakan interupsi eksternal (attachInterrupt ()). Saya ingin tetap menggunakan interupsi internal.
arduino
microcontroller
interrupts
Tdk sengaja
sumber
sumber
Jawaban:
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).
sumber
Fungsi attachInterrupt () sebenarnya adalah melampirkan interupsi ke perubahan status eksternal pada pin, itu tidak memiliki opsi lain.
Pada halaman yang sama opsi mode terdaftar sebagai:
Maaf menjadi pembawa berita buruk, itu adalah salah satu hal pertama yang saya cari.
sumber
Ini artikel tentang PWM akan menghapus banyak keraguan Anda mengenai penggunaan Arduino timer. Ada dua timer 8-bit, dan satu timer 16-bit pada Arduino. Tidak ada API tingkat tinggi untuk mengaitkan fungsi ISR langsung ke pengatur waktu, yang dikirimkan dengan Arduino SDK (yaitu sebagai pustaka standar), tetapi metode yang agak lebih rendah dalam pengaturan Special-Function-Register dan bit-arithmetic / operasi pada mereka. Namun ada perpustakaan kontribusi pengguna yang disebut Timer satu .
sumber
Arduino menggunakan ketiga timer di ATMega328.
Timer1
(16 bit) digunakan untuk fungsi sepertidelay()
danmillis()
dan untuk output PWM pada pin 5 dan 6. Dua timer lainnya -Timer0
danTimer2
digunakan untuk output PWM pada pin 3, 9, 10, 11.Jadi, tidak ada fungsi Arduino untuk interupsi timer. Tapi ada cara. Anda dapat menggunakan kode ini untuk mengaktifkan penghentian waktu pada
Timer2
:Saya menulis kode ini tanpa pengujian, jadi mungkin saya membuat kesalahan. Dalam hal ini, periksa lembar data, hal.156 .
Jika Anda ingin mengubah frekuensi timer (prescaler), cukup ubah register
TCCR2A
. Untuk info lebih lanjut, lihat halaman lembar data 153. Tetapi jika Anda mengubah frekuensi pengatur waktu, Anda juga mengubah frekuensi sinyal PWM pada dua pin keluaran!sumber
Timer0
danTimer2
8 bit dan hanyaTimer1
16 bit.