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:

  1. Pilih frekuensi kristal yang digunakan dalam rangkaian, dalam hal ini dipilih 11.0592MHz;
  2. 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);
  3. Tuliskan frekuensi yang diinginkan (berapa jumlah interupsi per detiknya), tuliskan 1, artinya 1 kali interupsi per detik atau tundaan 1 detik;
  4. Pilih satuannya, yaitu Hz;
  5. Cek apakah error-nya 0%? Selalu usahakan nilai 0 atau mendekati 0 agar diperoleh akurasi yang lebih baik;
  6. Catat hasil perhitungan nilai inisialisasinya, dalam hal ini terhitung 0×5740 (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 0×5740 (16bit);
  • TCNT1, yang terdiri dari TCNT1L (bagian low dari 16-bit) dan TCNT1H (bagian high dari 16-bit), diisi dengan konstanta Inisial sebesar 0×5740;

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…

Tags: , , , ,

2 Responses to “Menggunakan Timer1 untuk Tundaan 1 detik (AVR)”

  1. salam kenal, saya mau menambahkan data
    SKRIPSI BAHASA INDONESIA

  2. terima kasih mas agfi atas tutorialnya

Leave a Reply

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>