Timer Pada Mikrokontroler AVR

Timer AVR (www.albireo.at)

Timer AVR (www.albireo.at)

Timer merupakan fitur yang telah tertanam di dalam mikrokontroler AVR yang memiliki fungsi terhadap waktu. Fungsi timer yang dimaksud disini adalah penentuan kapan program tersebut akan dijalankan dan kapan program tersebut akan berhenti.

Timer mikorokontroler AVR tersusun dari beberapa register, yang nilai nya berkurang dan bertambah secara otomatis. Pada mikrokontroler AVR terdapat dua jenis timer, yaitu : timer 8-bit dan timer 16-bit. Pada timer 8-bit, register yang digunakan memiliki lebar 8-bit yang berarti mampu menghitung sebanyak 2^8=256, yaitu : dari nilai 0 hingga 255, seperti pada gambar dibawah ini.

Gambar 1 Register Timer 8 Bit (maxembedded.com)

Gambar 1 Register Timer 8 Bit (maxembedded.com)

pada timer 16-bit lebar register juga sebesar 16-bit. karena memiliki lebar register yang lebih besar, timer 16-bit mampu menghitung sebanyak 2^16=65536, yaitu: dari 0 hingga 65535, sehingga juga dapat digunakan sebagai pencacah (counter) dimana perbedaannya terdapat pada sumber clocknya. pada timer, sumber clocknya berasal dari internal mikrokontroler itu sendiri. Sedangkan Counter, sumber clocknya berasal dari luar mikrokontroler (eksternal). Jika perhitungan atau pencacahan pada timer 8-bit maupun timer 16-bit sudah mencapai nilai maksimum nya yaitu 255 pada timer 8 bit dan 65535 pada timer 16-bit maka yang akan terjadi adalah keadaan overflow (penuh) dimana nilai perhitugan akan kembali ke nilai nol. Keadaan overflow pada timer/counter ini kemudian bisa dimanfatkan sebagai sumber interupsi pada aplikasi-aplikasi selanjutnya.

Pada mikrokontroler AVR atmega 16/8535/32, terdapat 3 jenis timer antara lain adalah sebagai berikut:

 Konsep Timer

T = 1/f, adalah rumus yang sudah sangat familiar bagi kita untuk menghitung periode. Misalkan kita ingin mengedipkan sebuah LED setiap 10 ms yang berarti memiliki frekwensi sebaser 1/10 ms yaitu 100 Hz. Misalnya sistem kita menggunakan external crystal XTAL sebesar 4 MHz. Sehingga frekuensi clock dari CPU adalah sebesar 4 MHz. Seperti yang telah dijelaskan sebelumnya, Timer mencacah dari 0 hingga nilai maksimalnya (TOP). Untuk berubah dari 0 menuju 1, maka memerlukan satu siklus clock. untuk frekuensi CPU sebesar 4 Mhz, periodenya adalah T=1/4M = 0.00025 ms, maka setiap transisi dari 0 ke 1, 1 ke 2 dan selanjutnya akan membutuhkan waktu selama 0.00025 ms.

Untuk delay selama 10 ms yang akan kita aplikasikan pada LED, nilai Timer dapat dihitung dengan rumus di bawah ini:

RUMUSKita masukkan delay sebesar 10 ms dan periode clock sebesar 0.00025 ms sehingga didapatkan timernya sebesar 39999. Hal tersebut berarti akan menghasilkan delay selama 10 ms dan clock akan melakukan 39999 siklus. Dengan nilai timer sebesar itu, kita tidak dapat menggunakan timer 8-bit yang hanya memiliki nilai maksimal sebesar 255, sehingga kita harus menggunakan timer 16-bit yang mampu menghitung hingga 65535.

Prescaler Pada Timer

Gambar 2 - Prescaler Pada timer

Gambar 2 – Prescaler Pada timer

Jika kita ingin membuat delay sebesar 20 ms dengan menggunakan timer 16-bit (MAX – 65535) dan menggunakan XTAL 4 MHz maka frekuensi CPU (F_CPU) nya juga sebesar 4 MHz. Jika kita masukkan pada rumus di atas maka delay maksimum yang dapat dihasilkan oleh sistem yang kita gunakan hanya sebesar 16.384 ms. Lalu bagaimanakah solusinya agar delay yang dihasilkan lebih besar dari 16.384 ? jawaban nya adalah dengan mengurangi F_CPU dari 4 MHz menjadi 0.5 MHz atau 500 KHz, sehingga periode clock-nya meningkat menjadi 1/500k = 0.002 ms. Sekarang kita memasukkan pada rumus diatas, mengganti delay dengan 20 ms dan periode clock 0.002 ms. kita mendapatkan nilai timer sebesar 9999 yang dapat di aplikasikan dengan menggunakan timer 16-bit. Pada frekuensi clock yang telah direduksi menjadi (500 KHz) maka nilai delay maksimum yang dapat dihasilkan adalah sebesar 131.072 ms.

Teknik mereduksi frekuensi clock/F_CPU ini merupakan teknik pembagian atau pen-skala-an frekuensi yang dinamakan dengan Prescaling. Akan tetapi dalam menggunakan prescaler, ada yang harus dikorbankan, yaitu: antara resolusi dan durasi dari timer yang kita gunakan. Semakin besar delay yang mampu kita hasilkan dengan menggunakan prescaling maka akan mengurangi resolusi dari timer yang berdampak pada akurasi timer yang akan menurun, sebagai contoh: pada kasus di atas durasi dari delay yang dihasilkan meningkat dari 16.384 ms menjadi 131.072 ms dengan melakukan prescaling pada F_CPU. Akan tetapi resolusinya juga menigkat dari 0.00025 ms menjadi 0.002 ms. Hal ini berarti bahwa setiap detik-kan (waktu transisi dari 0 ke 1 dan selanjutnya hingga nilai MAX) akan memakan waktu lebih lama yaitu 0.002 ms yang berdampak akurasi dari timer akan berkurang. Jika pada timer sebelumnya dapat dihitung durasi seperti 0,1125 ms (0.1125/0.00025 = 450) maka pada timer setelah dilakukan prescaling tidak dapat dilakukan (0.1125/0.002 = 56.25).

Pemilihan Prescaler

Sebagai contoh kita membutuhkan delay sebesar 184 ms. F_CPU yang akan digunakan sebesar 4 MHz. Sistem pada AVR memberikan pilihan pada kita dengan nilai prescaler: 8, 64, 256 dan 1024. Prescaler 8 berarti nilai F_CPU akan dibagi dengan 8 (F_CPU/8) begitu juga yang lainnya. Jika nilai pembagian F_CPU yaitu 4 MHz dengan tiap-tiap nilai prescaler dimasukkan pada rumus timer diatas dan nilai delay yang diinginkan sebesar 184 ms maka kita akan mendapatkan beberapa nilai timer seperti pada gambar berikut ini :

Gambar 3 - Perhitungan Prescaler (maxembedded.com)

Gambar 3 – Perhitungan Prescaler (maxembedded.com)

Dari nilai-nilai di atas, kita dapat melihat bahwa prescaler 8 tidak dapat digunakan karena nilai timer melebihi batas dari nilai maksimal timer 16-bit yaitu sebesar 65535. Selain itu timer juga hanya mengambil nilai integer (bilangan bulat), sehingga kita juga tidak dapat menggunakan prescaler 1024 karena nilai timer nya bukan bilangan integer. Sehingga nilai prescaler yang dapat digunakan adalah 64 dan 256. Akan tetapi prescaler 64 memberikan resolusi yang lebih tinggi, sedangkan prescaller 256 akan menghasilkan durasi yang lebih besar.

 Contoh: Timer0 pada Mikrokontroler AVR

Gambar 4 - Diagram Blok Internal Timer0 pada Atmega8 (www.electroschematics.com)

Gambar 4 – Diagram Blok Internal Timer0 pada Atmega8 (www.electroschematics.com)

Sebagai contoh kali ini kita akan mengedipkan LED setiap 6 ms. Pada contoh ini dilakukan tanpa menggunakan prescaler. Sistem yang digunakan memiliki frekuensi CPU (F_CPU) sebesar 32 kHz. Dengan memasukkan nilai-nilai yang diketahui, yaitu: delay yang diinginkan serta periode clock ke dalam rumus timer sebagai berikut:

SADiperoleh nilai timer sebesar 191, sehingga kita cukup menggunakan timer0 yaitu 8 bit. Setelah itu, kita harus melakukan perhitungan untuk mencapai nilai 191 dimana logika LED akan berubah dari 1 ke 0 yang berarti LED akan berkedip. Untuk melakukan hal tersebut kita perlu bantuan dari register-register berikut.

  • Register TCNT0

Gambar 5 - Bit pada Register TCNT0 Register

Gambar 5 – Bit pada Register TCNT0 Register

TCNT0 merupakan singkatan dari Timer/Counter Register, sedangkan angka 0 menunjukkan bahwa register ini digunakan untuk timer0. Ini adalah register dimana pencacahan timer 8-bit disimpan. nilai pencacahan yang disimpan pada register ini bertambah dan berkurang secara otomatis. Register TCNT0 tidak dapat diaktifkan tanpa mengaktifkan timer sehingga kita perlu melakukan setting pada timer terlebih dahulu.

  • Register TCCR0

Gambar 6 - Bit pada Register TCNT0 Register

Gambar 6 – Bit pada Register TCNT0 Register

TCCR0 merupakan singkatan dari Timer/Counter Control Register, sedangkan angka 0 menunjukkan bahwa register ini digunakan untuk timer0. Pada bagian ini kita akan berfokus pada bit yang diberi highlight. Dimana ketiga nilai bit ini (CS02, CS01 dan CS00) menunjukkan pemilihan prescaler yang akan digunakan, apakah itu 8, 64, 256, 1024 atau tanpa menggunakan prescaler seperti pada contoh yang akan kita buat. Pada gambar berikut ditunjukkan beberapa kombinasi nilai dari bit CS02, CS01 dan CS00 untuk melakukan pemilihan prescaler.

Gambar 7 - Pemilihan Prescaler

Gambar 7 – Pemilihan Prescaler

pada contoh kasus di atas, kita tidak memerlukan prescaler untuk membuat delay sebesar 6 ms, sehingga nilai bit CS02, CS01 dan CS00 sesuai dengan nilai yang diberi highlight pada gambar di atas. Dan pada listing kode, kita tuliskan seperti berikut ini:

TCCR0 |= (1 << CS00);

Perlu diingat, jika kita tidak memberikan nilai pada register ini maka semua nilai bit pada register dianggap nol dan timer/counter tidak akan berjalan yang berarti timer dalam keadaan stop. Berikut ini adalah kode lengkap dari program mengedipkan LED dengan selang waktu 6 ms dimana menggunakan XTAL clock sebesar 32 kHz yang dibuat menggunakan software AVRstudio:

Jika dalam aplikasi timer memerlukan penggunaan interupsi overflow maka register lain yang dapat digunakan sebagai berikut:

  • Register TIMSK

Gambar 8 - Bit pada Register TIMSK (www.zembedded.com)

Gambar 8 – Bit pada Register TIMSK (www.zembedded.com)

TIMSK adalah singkatan dari Timer/Counter Interrupt Mask, register ini adalah register yang digunakan untuk ketiga timer pada mikokontroler AVR, yaitu: timer0, timer1 dan timer2. Bit 0 dan 1 digunakan untuk timer0, bit 2 hingga 5 digunakan untuk timer1, sedangkan bit 6 dan 7 digunakan untuk timer2. Untuk mengaktifkan interupsi overflow pada timer0, bit TOIE0 harus diberikan nilai “1”. Pada timer1 mengaktifkan interupsi overflow adalah dengan memberikan nilai pada bit TOIE0, sedangkan bit 5 hinga 3 pada timer1 digunakan utuk aplikasi CTC. Pada timer2, aktifasi interupsi overflow dilakukan dengan memberikan nilai “1” pada bit 6 TOIE2.

  • Register TIFR

Gambar 9 - Bit pada Register TIFR (www.zembedded.com)

Gambar 9 – Bit pada Register TIFR (www.zembedded.com)

TIFR adalah singkatan dari Timer/Counter Interrupt Flag Register, register ini juga digunakan untuk semua timer baik timer0, timer1, maupun timer2. Bit 0 dan 1 digunakan untuk timer0, bit 2 hingga 5 digunakan untuk timer1, dan bit 6 dan 7 digunakan untuk timer2. Pada bit 0 yaitu TOV0 (untuk timer0), TOV1(untuk timer1), TOV2(untuk timer2) akan bernilai 1 jika timer mengalami overflow dan kembali bernilai 0 jika interrupt Service Routine (ISR) dieksekusi. Jika tidak ada ISR yang akan dieksekusi maka bit-bit tersebut (TOV0,TOV1,TOV2) dapat diberikan nilai.

Jika artikel ini bermanfaat buat Anda, mohon untuk di Share because “Sharing is Caring”

Referensi:

  1. maxembedded.com,
  2. atmel.com,
  3. www.zembedded.com,
  4. www.electroschematics.com

COMMENTS

Loading Facebook Comments ...