Pada percobaan ini akan dibuat interupsi timer 1 pada ATmega328 dengan frekuensi 1 kHz, dan kemudian dilakukan pengukuran frekuensi yang dihasilkan.
Konfigurasi Timer 1 sebagai berikut
- Frekuensi 1 kHz, atau perioda 1 ms
- menggunakan Timer1
- Clock Source: System Clock
- Clock Value: 250 kHz (prescaler 64)
- Mode: CTC top=OCR1A
- Out A: Disconnected
- Out B: Disconnected
- Interrupt on: Compare A Match
- tidak ada output langsung ke pin mikrokontroler
Frekuensi clock adalah 16 Mhz. Dengan prescaler 64, dihasilkan clock ke Timer1 sebesar 250 kHz. Untuk membuat frekuensi 1 kHz, perlu pembagi sebesar 250 (0xFA), untuk itu diperlukan angka 249 (0xF9) di register OCR1A. Mode timer1 menggunakan CTC (Clear Timer on Compare), jadi ketika angka counter mencapai 249, otomatis berikutnya menjadi 0, dibarengi dengan munculnya interupsi timer 1. Dengan demikian sinyal clock timer 1 250 kHz akan menghasilkan interupsi timer dengan frekuensi 1 kHz.
Kode dibuat dengan menggunakan CodeWizard pada compiler CodevisionAVR versi Evaluation. Berikut ini tampilan setting pada code wizard untuk Timer 1:
Untuk menghasilkan sinyal output, digunakan port C sebagai output. Output pada port C dikomplemen setiap interupsi, sehingga akan timbul sinyal dengan frekuensi 500 Hz pada port C. Berikut kode ISR (interrupt service routine) untuk Timer 1:
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
PORTC=~PORTC;
}
Berikut ini sinyal yang dihasilkan, diukur dengan menggunakan osiloskop. Screen capture diambil langsung dari osiloskop (bukan difoto).
Frekuensi yang terukur adalah 500,026 Hz, sehingga frekuensi interupsi sebenarnya adalah 2 x 500,026 = 1000,052 Hz. Tidak sama persis dengan seharusnya (1 kHz), kemungkinannya antara frekuensi kristal yang tidak tepat, atau clock pada osiloskop yang tidak tepat.