Sekarang kita gunakan Timer1 (16 bit) untuk melakukan tundaan sebesar 1 detik. Konsepnya sama seperti timer yang lain, yaitu menggunakan interupsi overflow-nya Timer1. Berapakah nilai inisialisasi-nya, kita gunakan program KAVRCalc by Kevin Rosenberg untuk menghitung, hasilnya ditunjukkan pada Gambar berikut…
Penjelasan Gambar:
- Pilih frekuensi kristal yang digunakan dalam rangkaian, dalam hal ini dipilih 11.0592MHz;
- Pilih pembagi detak-nya atau praskalar-nya, dalam contoh ini dipilih 256. Anda bisa melakukan eksperimen, coba-coba memilih nilai praskalar lainnya asalkan error yang dihasilkan tetap 0% (lihat panah 5);
- Tuliskan frekuensi yang diinginkan (berapa jumlah interupsi per detiknya), tuliskan 1, artinya 1 kali interupsi per detik atau tundaan 1 detik;
- Pilih satuannya, yaitu Hz;
- Cek apakah error-nya 0%? Selalu usahakan nilai 0 atau mendekati 0 agar diperoleh akurasi yang lebih baik;
- Catat hasil perhitungan nilai inisialisasinya, dalam hal ini terhitung 0x5740 (satuan heksadesimal) dalam 16-bit yang nantinya kita simpan ke TCNT1L dan TCNT1H.
Langkah selanjutnya adalah menuliskan program-nya…
1: ' program timer1_01.bas 2: ' membuat gelombang kotak frekuensi 50 Hz 3: ' 4: $regfile = "m16def.dat" 5: $crystal = 11059200 6: 7: Config Timer1 = Timer , Prescale = 256 8: Const Inisial = &H5740 9: 10: On Timer1 Timer1_isr ' timer0 overflow interrupt 11: 12: Config Portb = Output 13: 14: Tcnt1l = Low(inisial) 15: Tcnt1h = High(inisial) 16: 17: Enable Timer1 ' enable Ovf0 18: Enable Interrupts 19: 20: Do 21: NOP 22: Loop 23: 24: End 25: 26: Timer1_isr: ' untuk 1 kali interupsi/detik 27: Tcnt1l = Low(inisial) ' inisialisasi spt ini 28: Tcnt1h = High(inisial) ' memiliki kelemahan, 29: Toggle Portb.0 ' lihat penjelasan di bawah 30: Return
Penjelasan listing program:
- Baris 7 digunakan untuk mendeklarasikan fungsi Timer1 sebagai pewaktu dengan nilai praskala 256;
- Baris 8 kita definisikan variabel Inisial untuk menyimpan nilai ulang yang tadi sudah dihitung melalui program khusus sebesar 0x5740 (16bit);
- TCNT1, yang terdiri dari TCNT1L (bagian low dari 16-bit) dan TCNT1H (bagian high dari 16-bit), diisi dengan konstanta Inisial sebesar 0x5740;
Tambahan koreksi dari mas Anang Dono Prasetyo:
- Dalam Program masih ada satu kelemahan. Timer masih disetting sebagai timer biasa. Setiap kali intrupsi, kita harus memasukan nilai TCNT1, yang artinya timer berikut akan melakukan intrupsi (“waktu inisialisasi TCNT1” + TCNT1 (1detik)).
- Jika bukan digunakan untuk waktu kritis, maka ngak masalah. Dalam pengamatan mata hidup LED akan sama dengan detikan JAM, padahal ada waktu kelebihan sedikit yaitu “waktu inisialisasi TCNT1”. nah ini yg jadi masalah kok program waktu pada AVR keteteran jika sudah beberapa jam.
- Solusinya: Setting Timer dalam mode CTC. dalam mode ini TCNT1 akan di bandingkan dengan OCR1x (x bisa A atau B tergantung yg dihidupkan). jika TCNT1 = OCR1X maka akan ada intrupsi dan nilai TCNT1 akan di nolkan. Semuanya berlaku secara Harware dan pada satu waktu, yg menyebabkan waktu antar intrupsi tetap yaitu bergantung OCR1x.
- Di dalam program pelayanan interupsi tidak ada acara inisialisasi timer dan menghidupkan timer lagi. Pada saat melayani interupsi, pada saat itu pula timer mulai menghitung untuk interupsi berikutnya.
Informasi lebih lanjut tentang tutorial tentang TIMER pada mikrokontroler AVR ATMega bisa dibaca di ebook BASCOM AVR (the best seller).
Terima kasih dan semoga bermanfaat…