BAB 9 

Sasaran

 

Setelah anda menamatkan bab ini , diharapkan anda dapat :

ð          Menyebutkan Timer-timer dari 8051 dan register-register yang berkenaan dengannya`.

ð          Menjelaskan beberapa mode Timer pada 8051.

ð          Mem-program Timer pada 8051 untuk menghasilkan tundaan.

ð          Mem-program Counter pada 8051 sebagai pencacah keadaan.

 

8051 memiliki dua buah Timer/Counter. Masing-masing dapat digunakan sebagai Timer untuk membuat tundaan waktu, dan dapat pula digunakan sebagai pencacah (counter) untuk mencacah keadaan (event) yang terjadi di luar mikro kontroller. Pada BAB ini kita dapat melihat bagaimana dia dapat diprogram dan digunakan. Pada SubBab 9-1 kita aka membahas tentang Timer untuk menhasilkan tundaan waktu. Dan di SubBab 9-2 akan dibahas penggunaannya sebagai pencacah keadaan di luar chip 8051.

 

Dalam datasheet yang dikeluarkan Intel, tidak ada nama khusus dari peralatan ini. Beberapa buku menyebutnya “Timer/Counter”, namun beberapa buku yang lain menyebutnya hanya dengan “Timer”. Walaupun fungsi dari peralatan ini sebagai Timer dan juga bisa sebagai Counter. Sehingga kita harap kita tidak kebingungan antara nama dan fungsinya.

 



 

SubBAB 9-1 PEMROGRAMAN TIMER PADA 8051

 

      8051 memiliki dua Timer, yaitu Timer-0 dan Timer-1. Masing-masing bisa digunakan sebagai Timer atau sebagai counter pencacah. Untuk SubBAB ini kita akan berkonsentrasi pada fungsinya sebagai Timer, serta membahas register-registernya, lalu juga membahas bagaimana Timer bisa digunakan untuk membentuk tundaan waktu.

 

 

Register-register Timer 0

 

      Register Timer-0 adalah register selebar 16-bit (D0 s/d D15). Register sebesar ini cukup mampu untuk melakukan cacahan sampai 65356 cacahan. Register 16-bit ini dapat diakses sebagai dua buah register 8-bit (D0-D7 dan D8-D15), yang mana bisa diperlakukan sebagai register biasa, seperti A, B R0, R1, R2, dll. Contohnya, instruksi “MOV TL0,#4Fh“, mengisi TL0 dengan nilai 4Fh. TL0 adalah low byte dari Timer-0. Register-regiter itu pula dapat dibaca sebagai register biasa. Contohnya, “MOV R5,TH0” yaitu menyalin isi register TH0 ke R5.

 

gambar 9-1 Register-register Timer-0

 

 

Register-register Timer 1

 

      Timer 1 juga memiliki register selebar 16-bit  yang dibagi menjadi 2-byte, yang dinamakan sebagai TL1 (Timer-1 low byte) dan TH1 (Timer-1 high byte). Register-register ini dapat diakses seperti juga register Timer-0 yang sudah dijelaskan di atas.

 

gambar 9-2 Register-register Timer-1

 

 

Register TMOD

 

      Di luar itu, masing-masing Timer-0 dan Timer-1 menggunakan satu register yang sama, yang disebut TMOD, yang digunakan untuk mengatur beragam mode operasi dari Timer tersebut. TMOD adalah register 8-bit yang mana 4-bit terbawah digunakan oleh Timer-0 dan 4-bit lainnya digunakan oleh Timer-1. Pada masing-masing 4-bit tersebut 2-bit terbawah adalah penentu mode operasi. Pilihan dari mode operasi akan dijelaskan nanti.

 

gambar 9-3. Register TMOD

 

keterangan gamnbar 9-3:

GATE  Pengontrol Gate jika tinggi. Timer/Counter bisa jalan, hanya jika port pin INTx tinggi dan bit control TRx juga tinggi. Namun saat GATE rendah, Timer/Counter bisa jalan hanya melalui TRx tinggi.

C/’T  Adalah pemilih fungsi Timer/Counter. Jika C/’T = 0, maka Timer/Counter akan berfungsi sebagai menghasil tundaanwaktu (Timer), namun jika C/’T = 1, maka Timer/Counter akan menjadi pencacah hitungan (Counter).

M1    Mode bit 1

M0    Mode bit 0

 

M1    M0    Mode     Mode Operasi

0     0     0        Mode Timer 13-bit.

                     Timer/Counter 8-bit pada TH dengan TL sbg 5-bit prescalar

0     1     1        Mode Timer 16-bit.

                     Timer/Counter 16-bit, TH dan TL sejajar. Tanpa prescalar.

1     0     2        Mode Timer 8-bit.

                     Timer/Counter auto reload 8-bit. TH adalah menyimpan nilai

                     yang nantinya akan disalin ke TL setiap terjadi overflows.

1     1     3        Mode Timer Terbelah.

 

 

M1,M0

 

M0 dan M1 adalah pemilih mode Timer. Seperti yang kita lihat pada gambar di atas, terdapat mode 0, 1, 2, dan mode 3. Mode-0 adalah timer 13-bit, mode-1 adalah Timer 16-bit, mode-2 adalah Timer 8-bit, sedang mode-3 adalah mode Timer terpisah yang akan kita jelaskan pada akhir bab ini. Namun sekarang kita akan berkonsentrasi pada Mode-1 dan Mode-2 karena hal ini adalah mode yang paling sering digunakan oleh para programmer saat ini.

 

 

C/’T (Counter/Timer)

 

      Bit ini adalah juga termasuk bagian dari TMOD yang digunakan untuk memilih apakan Timer ini digunakan sebagai penghasil tundaan waktu (Timer) ataukah sebagai pencacah (Counter). Jika C/’T  = 1 maka Timer/Counter akan digunakan sebagai Timer. Yang biasanya digunakan untuk menghasilkan tundaan waktu. Sumber clock pencacah disediakan oleh kristal osilator utama pada 8051. Nah untuk SubBAB ini kita berkonsentrasi pada pilihan ini. Di samping itu, jika C/’T = 1, maka Timer/Counter digunakan sebagai Counter atau pencacah atau penghitung keadaan yang terjadi diluar 8051. Untuk yang ini akan kita bahas pada SubBAB berikutnya.

 

Contoh 9-1

 

Jelaskan mode mana dan Timer yang mana yang diplih dari beberapa contoh ini.

(a) MOV TMOD,#01h (b) MOV TMOD,#20h (c) MOV TMOD,#12h

 

Jawaban:

 

Kita dapat mengkonversi nilai tersebut ke dalam biner. Didapat..

(a)          TMOD = 00000001, dipilih Timer-0 Mode-1

(b)          TMOD = 00000001, dipilih Timer-1 Mode-2

(c)          TMOD = 00000001, dipilih Timer-0 Mode-2 dan Timer-1 Mode-1

 

 

 

Sumber Clock untuk Timer

 

      Seperti yang anda ketahui, bahwa setiap Timer membutuhkan “tik” denyut clock untuk bekerja (seperti jam kuno yang membutuhkan gerakan pendulumnya untuk menggerakkan jarum detik-nya). Lalu apa sumber clock denyut untuk Timer pada 8051? Jika C/’T = 0, maka osilator kristal utama yang terpasang pada 8051 disambung kepada Timer sebagai sumber denyutnya. Sehingga ukuran kecepatan pada osilator kristal yang terpasang pada 8051 tersebut menjadi sangat berpengaruh pada kecepatan “tik” dari pada Timer tersebut. Adapun frekuensi dari Timer selalu 1/12 dari frekuensi osilator kristal yang terpasang pada 8051. Lihat Contoh 9-2

 

Contoh 9-2

 

Cari frekuensi clock untuk Timer dan perioda dari sebuah system berbasis 8051 dengan osilator kristal sebagai berikut.

(a) 12 MHz

(b) 16 MHz

(c) 11.05920 MHz

 

Jawaban:

 

 

 

 

(a) 1 / 12 x 12 MHz = 1 MHz  è T = 1 / 1 MHz = 1 uS

(b) 1 / 12 x 16 MHz = 1.333 MHz  è T = 1 / 1.333 MHz = 0.75 uS

(c) 1 / 12 x 11.0592 MHz = 921.6 kHz  è T = 1 / 921.6 kHz = 1.085 uS

 

Catatan T = Tik = Waktu yang dibutuhkkan oleh Timer/Counter sekali mencacah.

 

 

      Walaupun banyak dari system yang berbasis 8051 menggunakan osilator kristal dengan frekuensi bervariasi antara 1 – 40 MHz, namun saat ini kita akan berkonsentrasi pada frekuensi kristal 11.0592 MHz. Alasannya adalah frekuensi ini adalah yang paling ideal jika kita hendak menghubungkan 8051 dengan Komputer Personal, dengan tingkat error adalah nol. Perihal mengenai pemilihan frekuensi ini, hubungan dengan PC, dan Serial, akan kita jelaskan nanti pada BAB selanjutnya tentang Komunikasi serial.

 

 

GATE

 

      Bit yang lain dari register TMOD adalah bit GATE. Ingat seperti yang dijelaskan pada gambar 9-3 bahwa masing-masing kedua Timer tersebut memiliki bit GATE. Lalu apa gunanya?  Setiap Timer tentunya memiliki  kendali untuk memulai dan berhenti, bukan?!. Beberapa Timer memiliki fungsi untuk menghidupkan dan mematikan Timer melalui software. Ada juga yang melalui hardware. Sedang Timer pada 8051 ini, dilengkapi dengan keduanya. Sehingga kita dapat menjalankan dan menghentikan Timer ini lewat software maupun lewat hardware, maupun kedua-duanya. Secara software, Timer ini dikontrol oleh bit yang dinamakan TR (Timer Run). Dua TR, yaitu TR0 dan TR1 masing-masing milik Timer-0 dan Timer-1. Untuk menjalankan dan menghentikan Timer tersebut cukup dengan instruksi “SetB TR0” dan “Clr TR0” untuk Timer-0, dan “SetB TR1” dan “Clr TR1” untuk Timer-1. Perintah ini berlaku selama GATE = 0. Lalu kemudian untuk menghidupkan dan menjalankan Timer secara hardware dapat dilakukan dengan membuat GATE = 1 pada register TMOD. Namun untuk menghindarkan anda dari kebingungan akan masalah GATE, ada baiknya untuk sementara selalu kita buat GATE = 0 dulu. Sehigga hidup matinya Timer masih dikendalikan lewat software. Sehingga kita masih membutuhkan instruksi “SetB TRx” dan “Clr TRx“. Adapun untuk GATE = 1 atau menghidup-matikan Timer secara hardware akan kita bahas di akhir BAB ini.

 

Contoh 9-3

 

Cari nilai TMOD, jika kita hendak memprogram Timer-0 pada Mode-2, menggunakan osilator kristal system 8051 sebagai sumber clocknya, dan menggunakan instruksi software untuk menjalankan dan menghentikan Timer.

 

Jawaban:

 

TMOD = 0000 0010 timer-0, mode-2,

C/’T = 0 untuk mengunakan XTAL sebagai sumber clock,

Gate = 0 untuk menggunakan control software start dan stop.

 

 

      Sekarang, setelah kita sudah mengerti dasar-dasar aturan dalam register TMOD, kita beranjak pada mode-mode Timer dan bagaimana mereka diprogram untuk dapat menghasilkan tundaan waktu. Mengingat pada kenyataannya mode-1 dan mode-2 adalah mode yang paling banyak digunakan oleh para programmer, maka untuk sementara kita akan berkonsentrasi kepada dua mode ini.

 

 

Pemrograman pada MODE 1

 

   Di bawah ini adalah ciri-ciri operasi dari mode-1

1.    Timer 16-bit. Sehingga Timer dapat melakukan cacahan dengan bilangan 0000 s/d FFFFh yang ada pada pasangan register TH dan TL.

2.    Setelah TH dan TL di isi terlebih dahulu untuk membentuk nilai awalan 16-bit, Timer harus dijalankan dengan perintah “SetB TR0” untuk Timer-0 dan/atau “SetB TR1” untuk Timer-1.

3.    Setelah Timer hidup, dia mulai mencacah ke atas. Sampi dicapai bilangan  tertingginya yaitu FFFFh. Selanjutnya pada cacahan berikutnya, yaitu cacahan FFFFh ke 0000. Dia mengaktifkan (men-set menjadi 1s)  sebuah bendera yang disebut dengan TF (Timer Flag). Bendera ini juga dapat dimonitor. Ketika Timer Flag bergerak naik, berarti Timer sudah overflow. Biasanya tugas selanjutnya kita segera menghentikan Timer. Hal ini cukup dengan “Clr TR0” atau “Clr TR1” masing-masing untuk Timer-0 dan Timer-1. Sekali lagi, bahwa masing-masing Timer memiliki bendera-nya sendiri. TF0 untuk Timer-0 dan TF1 untuk Timer-1.

 

 

4.    Setelah Timer melewati batas-nya dan kemudian rolls over, untuk jika dibutuhkan pengulangan Timer maka register TH dan TL harus diset ulang dengan nilai yang sama sebelum Timer dijalankan. Jika tidak, maka kita tidak akan mendapatkan waktu rolls over yang sama seperti waktu roll over sebelumnya. Dan TF harus di-reset ke 0s sebelum Timer dijalankan kembali.

 

 

Langkah-langkah Pemnrograman Timer pada Mode-1

 

      Untuk membuat tundaan waktu, menggunakan Timer dengan mode-1, langkah-langkah di bawah ini harus kita kerjakan. Untuk memperjelas langkah-langkah tersebut silahkan pelihat contoh 9-4.

1.    Isi register TMOD dengan nilai di mana Timer (Timer-0 atau Timer-1) digunakan dengan mode-1.

2.    Isi register TH dan TL dengan nilai cacahan awal(initial).

3.    Jalankan Timer.

4.    Selalu monitor status dari Timer Flag (TF) dengan instruksi “JNB TFx,lokasi” untuk menunggu TF tersebut menjadi tinggi. Dan segera keluar dari loop jika keadaan tersebut terjadi.

5.    Matikan Timer.

6. Reset TF untuk proses tundaan berikutnya.

7. Kembali ke langkah 2 untuk mengisi TH dan TL

 

        Untuk menghitung tundaan waktu yang benar, dan frekuensi dari gelombang kotak (square wave) yang dihasilkan dari pin P1.5, kita harus tahu nilai dari XTAL osilator-nya. Lihat contoh 9-5.

       

        Dari Contoh 9-6 kita dapat membangun rumusan untuk perhitungan tundaan dengan Timer pada mode-1 (16-bit) dan menggunakan osilator XTAL = 11.0592 MHz. Seperti yang ditunjukkan oleh gambar 9-4. Kalkulator Scientific pada Microsoft Windows kita, dapat membantu kita untuk mencari nilai TH dan TL tersebut. Kalkulator ini dapat menangani perhitungan data decimal, hexadecimal, dan binary.

       

(a) dalam hex

 

(FFFF – YYXX + 1) x 1.085 uS dimana YYXX adalah nilai awalan masing-masing untuk TH dan TL. Harap dicatat bahwa YYXX adalah dalam hex

(b) dalam desimal

 

Ubah nilai YYXX dari pasangan register TH dan TL ke desimal untuk mendapatkan nilai desimal NNNNN. Selanjutnya (65536 – NNNNN)x 1.085 uS

 

Gambar 9-4 Perhitungan waktu tundaan Timer dengan XTAL = 11.0592 MHz

       

           

Contoh 9-4

 

Dalam program berikut ini, kita mencoba untuk membuat gelombang balok (square wave) dengan siklus kerja 50% (sama panjang rendah dan tinggi-nya) pada port P1.5. Timer-0 digunakan untuk menghasilkan waktu tundaan. Pelajari programmnya.

 

         MOV  TMOD,#01     ;Timer-0 Mode-1 (16-bit)

MULAI:   MOV  TL0,#0F2h    ;TL0=F2h, low byte

         MOV  TH0,#0FFh    ;TH0=FFh, high byte

         CPL  P1.5         ;Toggle P1.5

         ACALL DELAY

         SJMP MULAI        ;Isi kembali TH dan TL

 

;—————-Delay menggunakan Timer-0

 

DELAY:   SetB TR0          ;Jalankan Timer

ULANG:   JNB  TF0,ULANG    ;Monitor Timer, Keluar dari Loop saat

                           ; TF menjadi tinggi.

         CLR  TR0          ;Matikan Timer

         CLR  TF0          ;reset TF

         RET

 

Jawaban:

 

Pada program di atas kira-kira penjelasannya adalah seperti ini.

1.       TMOD diisi.

2.       nilai FFF2 diisikan pada TH0 – TL0

3.       P1.5 di togle untuk bagian tinggi dan rendah.

4.       Subrutine DELAY yang menggunakan Timer dipanggil

5.       dalam subrutin DELAY, Timer-0 dijalankan dengan perintah “SetB TR0”.

6.       Timer-0 mencacah ke atas clock demi clock, yang dihasilkan dari osilator kristal. Saat Timer mencacah melewati FFF3, FFF4, FFF5, FFF6, FFF7, FFF8, FFF9, FFFA, FFFB, sampai FFFF. Satu cacahan berikutnya Timer akan mengaktifkan Timer Flag (TF0=1). Pada titik ini, program keluar dari loop dengan instruksi JNB.

7.       Time-0 dihentikan denga perintah “Clr TR0“. Dan Subrutin selesai, dan kemudian proses diulangi kembali.

 

Catatan: Untuk mengulang proses, kita harus mengisi kembali nilai register TH dan TL, dan kemudian menjalankan Timer kembali

 

 

 

 

 

       

Contoh 9-5

 

Pada Contoh 9-4, hitung seberapa banyak waktu tundaan dalam subrutin DELAY yang dihasilkan dari Timer. Anggaplah XTAL = 11.0592 MHz

 

Jawaban:

 

Timer bekerja pada 1/12 kali dari frekuensi clock dan frekuensi osilator kristal. Sehingga kita mendapat 11.0592 MHz / 12 = 921.6 kHz untuk frekuensi Timer. Hasilnya adalah setiap perioda clock adalah  T = 1 / 921.6 kHz = 1.085 uS. Dengan kata lain, Timer-0 mencacah setiap 1.085 uS. Sehingga tundaannya adalah Delay = jumlah-cacahan x 1.085 uS.

Jumlah cacahan untuk roll over adalah FFFFh – FFF2h = 0Dh (13 desimal). Selanjutnya, kita tambah 13 dengan 1 sebagai waktu yang dibutuhkan untuk roll-over dari FFFFh ke 0000h dan kemudian mengaktifkana bendera TF. Hasilnya adalah 14 x 1.085 uS = 15.19 uS untuk satu bagian dari gelombang balok tersebut. Akhirnya keseluruhan perioda gelombang yang terdiri dari dua bagian gelombang menghasilkan T = 2 x 15.19 uS = 30.08 uS adalah waktu yang butuhkan oleh Timer.

 

 

       

Contoh 9-6

 

Pada Contoh 9-5, hitung frekuensi dari gelombang balok pada Pin P1.5.

 

Jawaban:

 

Pada perhitungan tundaan waktu dari contoh 9-5, kita tidak memasukkan kelebihan waktu yang digunakan CPU mengeksekusi instruksi-instruksi dalam loop. Untuk memperoleh perhitungan waktu yang akurat, kita harus memasukkan tambahan siklus clock yang digunakan instruksi di dalam loop. Untuk itu, kita harus merujuk pada daftar siklus kerja mesin (ada pada lampiran), dan hasilnya seperti dibawah ini.

 

                              Siklus

MULAI:   MOV  TL0,#0F2h         2

         MOV  TH0,#0FFh         2

         CPL  P1.5              1

         ACALL DELAY            2

         SJMP MULAI             2

 

;—————-Delay menggunakan Timer-0

 

DELAY:   SetB TR0               1

ULANG:   JNB  TF0,ULANG         14

         CLR  TR0               1

         CLR  TF0               1

         RET                    1

                      Total  =  27

 

 

       

Contoh 9-7

Cari waktu tundaan yang dihasilkan dari Timer-0 dari kode di bawah ini, menggunakan ke dua motode perhitungan dari gambar 9-4. Tidak perlu memasukkan kelebihan siklus instruksi.

 

         CLR  P2.3         ;Clear P2.3

         MOV  TMOD,#01     ;Timer-0 Mode-1 (16-bit)

Mulai:   MOV  TL0,#3Eh     ;TL0=3Eh, low byte

         MOV  TH0,#0B8h    ;TH0=B8h, high byte

         SETB P2.3         ;Set P2.3

         SETB TR0          ;jalankan Timer

ULANG:   JNB  TF0,ULANG    ;Monitor Timer Flag

         CLR  TR0          ;Matikan Timer

         CLR  TF0          ;Reset TF

         CLR  P2.3

 

Jawaban:

 

(a)   (FFFF – B93E + 1) = 47C2h = 18370 dalam desimal dan 18370 x 1.085 uS = 19.93145 mS

(b)   Mengingat TH –TL = B83Eh = 47166 (dalam desimal) dan didapat hasil 65536 – 47166 = 18370. Ini berarti Timer mencacah mulai B83Eh – FFFFh. Termasuk mencacah ke 0000 dibutuhkan waktu sebanyak 18370 clock, dimana setiap clock adalah 1.085 uS. Maka 18370 x 1.085 uS = 19.093145 mS adalah waktu dari panjang pulsa.

 

 

       

Contoh 9-8

 

Ubahlah nilai TH danTL pada contoh 9-7 untuk mendapatkan waktu tundaan yang paling lama dalam satuan mS. Tidak perlu memasukkan kelebihan siklus instruksi dalam loop.

 

Jawaban:

 

Untuk mendapatkan tundaan paling lama kita membuat TH dan TL keduanya menjadi 00. Dengan demikian cacahan benar-benar dimulai dari 0000 s/d FFFFh, dan roll-over kembali ke 0.

 

         CLR  P2.3         ;Clear P2.3

         MOV  TMOD,#01     ;Timer-0 Mode-1 (16-bit)

Mulai:   MOV  TL0,#0       ;TL0=3Eh, low byte

         MOV  TH0,#0       ;TH0=B8h, high byte

         SETB P2.3         ;Set P2.3

         SETB TR0          ;jalankan Timer

ULANG:   JNB  TF0,ULANG    ;Monitor Timer Flag

         CLR  TR0          ;Matikan Timer

         CLR  TF0          ;Reset TF

         CLR  P2.3

 

Dengan membuat masing-masing TH dan TL menjadi 0. Timer akan mencacah mulai dari 0000 s/d FFFFh, dan kemudian membangkitkan bendera TF. Hasilya adalah total cacahan adalah 65536 cacahan. Sehingga, kita mendapatkan tundaan = (65536 – 0 ) x 1.085 uS = 71.1065 mS

 

 

 

Pada Contoh 9-7 dan 9-8 kita tidak melakukan isi ulang pada TH dan TL karena yang diminta hanyalah untuk denyut tunggal. Lihat pada contoh 9-9, dimana kita harus meng-isi ulang nilai TH dan TL sebelum digunakan kembali.

 

 

Contoh 9-9

 

Program berikut adalah untuk menghasilkan gelombang balok pada pin P1.5 secara terus menerus menggunakan Timer1 sebagai tundaan waktunya. Cari frekuensi dari gelombang balok jika XTAL = 11.0592 MHz. Dalam perhitungan kita, untuk kasus ini tidak diperlukan memasukkan kelebihan siklus instruksi dalam loop.

 

         MOV  TMOD,#10     ;Timer-1 Mode-1 (16-bit)

Mulai:   MOV  TL1,#034h    ;TL1=34h, low byte

         MOV  TL1,#076h    ;TH1=76h, high byte

 

         SetB TR1          ;Jalankan Timer

ULANG:   JNB  TF0,ULANG    ;Monitor Timer, Keluar dari Loop saat

                           ; TF menjadi tinggi.

         CLR  TR0          ;Matikan Timer

         CPL  P1.5         ;Toggle P1.5

         CLR  TF0          ;Reset TF

         SJMP MULAI        ;Isi kembali TH dan TL dan ulangi proses

 

Jawaban:

 

Dari program di atas dapat kita lihat lokasi dari SJMP. Pada Mode-1, program harus me-reload (isiulang) nilai awalan pada TH dan TL setiap saat jika kita mengingikan untuk membuat gelombang yang kontinyu. Sekarang adalah perhitungannya. Mengingat FFFFh – 7634h = 89CBh + 1 = 35276 clock cacahan, didapat 32276 x 1.085 uS = 38.274 mS atau frekuensi = 36.127 Hz.

Harap dicatat pula bahwa bagian tinggi dari gelombang dan bagian rendah dari gelombang balok adalah sama. Dan dalam perhitungan di atas, kelebihan siklus instruksi dalam loop tidak dimasukkan.

 

 

       

Mencari Nilai untuk diisikan ke dalam Timer.

       

Anggaplah kita tahu waktu tundaan yang kita butuhkan, pertanyaannya adalah mencari nilai yang dibutuhkan itu untuk diisikan pada register TH dan TL. Untuk menghitung nilai tersebut lihat contoh di bawah, di mana kita menggunakan osilator kristal dengan frekuensi 11.0592 MHz untuk system 8051 kita.

       

Dengan menganggap XTAL = 11.0592 MHz dari contoh 9-10 kita dapat menggunakan langkah berikut ini untuk mencari nilai register TH dan TL yang tepat.

1.    Bagilah waktu yang dibutuhkan dengan 1.085 uS. Hasilnya adalah n.

2.    Kurangi 65536 – n, di mana n adalah nilai dalam desimal.

3.    Ubah hasil Langkah 2 menjadi bilangan hex. Di mana yyxx adalah nilai awalan yang dimasukkan pada register-register Timer.

4.    Atur TL = xx dan TH = yy.

 

       

Contoh 9-10

 

Anggaplah XTAL = 11.0592 MHz. Berapa nilai yang dibutuhkan untuk diisikan pada register-register Timer jika kita menginginkan untuk membuat tundaan waktu 5 mS (miliDetik)? Tuliskan kode untuk Timer-0 untuk membuat pulsa 5 mS pada P2.3.

 

Jawaban:

 

Mengingat XTAL = 11.0592 MHz, Timer akan mencacah setiap 1.085 uS. Maksudnya adalah berapa jumlah interval 1.085 uS untuk mencapai 5 mS. Untuk mendapatkan hasilnya kita bagi satu dengan yang lainnya. Sehingga kita butuh clock = 5 mS / 1.085 uS = 4608 clock. Untuk itu kita harus mengisi nilai TH dan TL dengan nilai = 65536 – 4608 = 60928 = EE00h. Sehingga kita harus mengisi TH = EEh dan TL = 0.

 

         CLR  P2.3         ;Clear P2.3

         MOV  TMOD,#01     ;Timer-0 Mode-1 (16-bit)

Mulai:   MOV  TL0,#0       ;TL0=0, low byte

         MOV  TH0,#0EEh    ;TH0=EEh, high byte

         SETB P2.3         ;Set P2.3

         SETB TR0          ;jalankan Timer

ULANG:   JNB  TF0,ULANG    ;Monitor Timer Flag

         CLR  TR0          ;Matikan Timer

         CLR  TF0          ;Reset TF

 

 

       

Contoh 9-11

 

Anggaplah XTAL = 11.0592 MHz, tulislah program untuk membuat gelombang balok setinggi 2 kHz pada pin P1.5.

 

Jawaban:

 

Ini mirip dengan contoh 9-10, hanya saja kita harus men-toggle port yang dimaksud untuk menghasilkan gelombang  balok. Lihat langkah di bawah ini.

(a)    T = 1 / f = 1 / 2 kHz = 500 uS, perioda dari gelombang balok.

(b)    1/2 darinya untuk bagian tinggi dan bagian rendah = 250 uS.

(c)    250 uS / 1.085 uS = 230 dan 65536 – 230 = 65306 dec (FF1Ah).

(d)    TL = 1A dan TH = FF (dalam hex)

 

Adapun programnya adalah sebagai berikut

 

         MOV  TMOD,#10h    ;Timer-0 Mode-1 (16-bit)

Mulai:   MOV  TL1,#01Ah    ;TL0=0, low byte

         MOV  TH1,#0FFh    ;TH0=DCh, high byte

         SETB TR1          ;jalankan Timer

ULANG:   JNB  TF1,ULANG    ;Monitor Timer Flag

         CLR  TR1          ;Matikan Timer

         CPL  P1.5         ;Comp. P1.5 utk tinggi dan rendah

         CLR  TF1          ;Reset TF

         SJMP MULAI        ;reload Timer karena mode-1

                           ; bukan autoreload

 

 

 

       

Contoh 9-12

 

Anggaplah XTAL = 11.0592 MHz, tulislah program untuk membuat gelombang balok setinggi 50 Hz pada pin P2.3.

 

Jawaban:

 

Lihat langkah di bawah ini.

(a)   T = 1 / 50 Hz = 20 mS, perioda dari gelombang balok.

(b)   1/2 darinya untuk bagian tinggi dan bagian rendah = 10 mS.

(c)   10 mS / 1.085 uS = 9216 dan 65536 – 9216 = 56320 dec (DC00h).

(d)   TL = 00 dan TH = DC (dalam hex)

 

Adapun programnya adalah sebagai berikut

 

         MOV  TMOD,#10h    ;Timer-1 Mode-1 (16-bit)

Mulai:   MOV  TL1,#0       ;TL1=0, low byte

         MOV  TH1,#0DCh    ;TH1=DCh, high byte

         SETB TR1          ;jalankan Timer

ULANG:   JNB  TF1,ULANG    ;Monitor Timer Flag

         CLR  TR1          ;Matikan Timer

         CPL  P2.3         ;Comp. P2.3 utk tinggi dan rendah

         CLR  TF1          ;Reset TF

         SJMP MULAI        ;reload Timer karena mode-1

                           ; bukan autoreload

 

 

 

 

Membuat tundaan waktu yang panjang

 

      Seperti yang sudah kita ketahui melalui contoh-contoh sebelumnya, lama tundaan waktu tergantung dari beberapa faktor (a) frekuensi osilator kristal, dan (b) nilai register 16-bit dari Timer pada mode-1. Kedua faktor inilah yang harus dimengerti oleh programmer 8051. Kita dapat membuat tundaan yang sangat panjang dengan membuat nilai awalan ke dua register Timer TH dan TL adalah 00h. Bagaimana jika itu masih belum cukup panjang? Maka Tundaan Timer yang sudah ada ditambah dengan rutin pengkali. Biasanya menggunakan instruksi DJNZ karena seluruh memory internal bisa dialamat oleh DJNZ. Contoh 9-13 memperlihatkan bagaimana membuat tundaan waktu yang panjang. Terlihat di sana R3 adalah sebagai register pengkalinya.

 

 

Menggunakan Kalkulator Windows untuk mencari TH dan TL.

 

      Kalkulator scientific pada Windows adalah sesuatu yang ringkas dan mudah digunakan untuk mencari nilai TH dan TL. Sebutlah kita hendak mencari TH, TL, dan berapa waktu tundaan jika kita menggunakan 35.000 clock. Sementara setiap clock adalah setara dengan 1.085 uS. Langkah berikut adalah menunjukan perhitungannya.

1.    Buka Kalkulator Scientific Windows Anda, dan pilih decimal.

2.    Masukkan nilai 35000.

3.    Pilih hex. Yang kemudian merubah 35.000 menjadi 88B8h.

4.    Pilih +/-. Sehingga kita memperoleh nilai negatif menjadi -35.000 (yaitu 7748 hex).

5.    Lihat bilangan hex-nya. 2-digit terbawah adalah nilai untuk TL dan dua digit berikutnya adalah nilain untuk TH. Sedangkan untuk digit 5 ke atas dapat kita abaikan. (suatu waktu kita mendapatkan hasil hitungan kurang dari 4 digit, sehingga digit-digit yang hilang tersebut dapat diganti dengan 0).

 

 

Contoh 9-13

 

Terangkan program di bawah ini, dan cari waktu tundaan dalam satuan Detik.  Tanpa memasukkan kelebihan siklus instruksi dalam loop.

 

         MOV  TMOD,#10h    ;Timer-1 Mode-1 (16-bit)

         MOV  R3,#200      ;register pengkali R3 = 200

Mulai:   MOV  TL1,#0       ;TL1=0, low byte

         MOV  TH1,#0DCh    ;TH1=DCh, high byte

         SETB TR1          ;jalankan Timer

ULANG:   JNB  TF1,ULANG    ;Monitor Timer Flag

         CLR  TR1          ;Matikan Timer

         CPL  P2.3         ;Comp. P2.3 utk tinggi dan rendah

         CLR  TF1          ;Reset TF

         DJNZ R3, MULAI    ;reload Timer jika R3 <> 0

 

Jawaban:

 

TH-TL = 108h = 264 dalam desimal dan  65536 – 264 = 65272. Lalu 65272 x 1.085 uS = 70.820 mS, dan ditambah loop register sehingga 70.820 mS x 200 = 14.164024 Detik

 

 

 

Mode-0

 

      Mode-0 sebenarnya sama persis dengan Mode-1, kecuali lebar cacahan yang dapat ditangani hanya 13-bit. Counter 13-bit dapat menangani data 0000 s/d 1FFFh pada register TH dan TL. Dengan demikian saat Counter pencacah mencapai nilai 1FFFh, cacahan berikutnya adalah 0000, bersamaan dengan mengaktifkan bendera Timer (TF).

 

 

Pemrograman Mode-2

 

      Di bawah ini adalah ciri-ciri operasi dari Mode-2

1.    Adalah Timer 8-bit, yang memungkinkan nilai mulai 00 s/d FFh yang bisa diisikan pada register Timer, dalam mode ini adalah TH.

2.    Setelah TH di isi dnegan nilai awalan, yaitu nilai dimana Timer memulai cacahannya. 8051 akan menyalin isi TH tersebut ke TL. Selanjutnya Timer dijalankan dengan perintah SetB TR0 untuk Timer-0 dan atau SetB TR1 untuk Timer-1. Mirip dengan mode-1.

3.    Setelah Timer berjalan, dia akan memulai mencacah dengan cara mengicrement isi register TL. Saat mencacah sampai pada nilai FFh, cacahan selanjutnya adlah 00 atau disebut roll-over. Dan pada saat bersamaan Timer akan mengaktifkan bendera Timer (TF). TF0 untuk Timer-0 dan TF1 untuk Timer-1.

 

  

 

4.    Setelah TL mencacah FFh ke 00h, dengan membuat TF menjadi =1, kemudian TL secara otomatis segera di isi kembali (reload) dengan salinan nilai dari register TH. Selanjutnya untuk mengulang proses tundaan waktu, kita hanya tingga me-reset bendera Timer (TF), tanpa harus mereload cacahan awal untuk mendapatkan waktu tundan yang benar dan tidak berbeda tundaan pertama dan selanjutnya. Hal ini berbeda dengan Mode-1 yang mengharuskan kita untuk mereload isi cacahan (TH dan TL), sehingga akan didapat waktu tundaan yang benar.

 

Kita ulangi bahwa mode-2 adalah Timer 8-bit dengan kemampuan autoreload. Pada saat auto reload ini, TH yang diisikan dengan nilai awalan cacahan akan menyalin isinya pada TL. Yang selanjutnya TL akan selalu mencacah mulai dari nilai seperti isi TH. Sementara itu isi TH sendiri tidak berubah. Banyak contoh dari menggunaan mode-2 ini. Salah satunya adalah digunakan untuk membentuk baud rate pada komunikasi serial, yang akan kita bahas pada bab selanjutnya.

 

 

Langkah-langkah Pemnrograman pada Mode-2

 

Untuk menghasilkan tundaan waktu menggunakan Timer mode-2, kita harus mengikuti langkah-langkah di bawah ini.

1.    Isi register TMOD dengan nilai yang menunjukkan Timer mana yang kita pakai dengan menggunakan mode-2.

2.    Isikan register TH dengan nilai awalan cacahan yang sudah dihitung sebelumnya.

3.    Jalankan Timer.

4.    Selalu memonitor Bendera Flag, yang bisa dilakukkan dengan instruksi “JNB TF,Lokasi“. Program akan tetap pada instruksi ini sampau ditemukan TF = 1.

5.    Reset bender Timer (TF).

6.    Ulangi langkah 4 untuk mengulang proses, jika diperlukan,

 

Contoh 9-14 menggambarkan bagaimana untuk mrncapai tundaan yang lebih panjang, kita sebaiknya menggunakan register pengkali seperti yang dicontohkan contoh 9-15

 

 

Contoh 9-14

 

Anggaplah XTAL = 11.0592 MHz, carilah (a) frekuensi dari gelombang balok yang dihasilkan pin P1.0 dari program di bawah, dan (b) frekuensi terendah yang bisa dihasilkan dengan program ini, berapa nilai TH yang harus diisikan untuk melakukannya.

 

         MOV  TMOD,#20h    ;Timer-1 Mode-2 (8-bit)

         MOV  TH1,#5       ;Nilai cacahan awal

         SETB TR1          ;jalankan Timer

ULANG:   JNB  TF1,ULANG    ;Monitor Timer Flag

         CPL  P1.0         ;Comp. P1.0 utk tinggi dan rendah

         CLR  TF1          ;Reset TF

         SJMP ULANG        ;reload Timer dan loop

 

Jawaban:

 

(a)    Perhatikan alamat target dari SJMP. Pada mode-2 kita tidak perlu untuk me-reload isi TH atau TL, karena sudah otomatis di-reload oleh CPU. Sekarang (250 – 05) x 1.085 uS = 251 x 1.085 uS = 272.33 uS yang merupakan salah satu bagian dari gelombang balok. Mengingat gelombang ini adalah memiliki siklus kerja 50%, maka perioda penuh adalah dua kalinya, sehingga hasilnya adalah T = 2 x 272.33 uS = 544.67 uS dan didapat frekuensi setinggi 1.83597 kHz.

(b)    Untuk mendapatkan frekuensi terendah, hanya bisa dicapai dengan membuat TH pada cacahan maksimun, yaitu TH = 0. Didapat clock 256 – 0 = 256 clock yang dibutuhkan. Sehingga waktu periodanya adalah T = 2 x 256 x 1.085 uS = 555.52 uS dengan frekuensi = 1.8 kHz.

 

 

 

Contoh 9-15

 

Cari frekuensi dari gelombang balok yang dihasilkan dari pin P1.0.

 

         MOV  TMOD,#02h    ;Timer-0 Mode-2 (8-bit,autoreload)

         MOV  TH0,#0       ;TH0=0

LAGI:    MOV  R3,#250      ;register pengkali R3 = 250

         ACALL DELAY

         CPL  P1.0

         SJMP LAGI

 

DELAY:   SETB TR0          ;jalankan Timer

ULANG:   JNB  TF0,ULANG    ;Monitor Timer Flag

         CLR  TR0          ;Matikan Timer

         CLR  TF0          ;Reset TF

         DJNZ R3, MULAI    ;reload Timer jika R3 <> 0

         RET

 

Jawabanya:

 

T = 2 (250 x 256 x 1.085 uS) = 138.88 mS, dan frekuensi = 72 Hz.

 

 

 

Contoh 9-16a

 

Anggaplah kita memprogram Timer dalam Mode-2, cari nilai (dalam Hex) yang diisikan pada TH dari beberapa contoh di bawah ini.

 

(a) MOV  TH1,#-200    (b) MOV  TH0,#-60

(c) MOV  TH1,#-3      (d) MOV  TH1,#-12

(e) MOV  TH0,#-48

 

Jawaban:

 

Kita dapat menggunakan Kalkulator scientific untuk menguji hasil konversi yang dikerjakan assembler. Pada Windows Kalkulator, pilih desimal dan masukkan nilai 200. Lalu pilih hex, lalu pilih +/- untuk mendapatkan nilai tersebut dalam hex. Harap diingat kita hanya menggunakan 2-digit paling kanan dari hasil yang nampak pada kalkulator. Hal itu karena data yang kita ambil adalah data 8-bit. Dan hasilnya adalah sebagai berikut.

 

    Desimal         2’s complement (Nilai TH)

    -200            38h

     -60            C4h

     – 3            FDh

     -12            F4h

     -48            D0h

 

 

 

 

Bahasa Assembler dan nilai Negatif

 

      Sebenarnya kita dapat assembler dapat (sekali lagi) memudahkan dan membantu kita untuk melakukan perhitungan dalam mencari nilai untuk TH dan TL tersebut. Caranya adalah sangat mudah, yaitu dengan menambahkan nilai yang diinginkan dengan simbol minus. Misalnya untuk Mode-2 8-bit, kita cukup menuliskan dengan “MOV TH,#-nnn“, dimana nnn adalah bilangan desimal 0 s/d 256.

 

Contoh 9-16b

 

Dibawah ini adalah beberapa contoh penggunaan assembler directive minus untuk mempermudah perhitungan nilai register Timer. Kita tinggal memasukkan jumlah tundaan yang dibutuhkan.

 

(a)        MOV TH1,#-0           ; TH1 = 00h

(b)        MOV TH1,#-1           ; TH1 = FFh

(c)        MOV TH1,#-3           ; TH1 = FDh

(d)        MOV TH1,#-255         ; TH1 = 01h

(e)        MOV TH1,#-256         ; TH1 = 00h

(f)        MOV TH1,#-357         ; TH1 = 00h dan pesan Error.

 

Untuk Contoh (f) terdapat pesan kesalahan assembbler karena nilai terlalu besar. Mode-2 8-bit Maksimal adalah 256, sedang untuk mode-1 16-bit adalah 65535.

 

(g)        MOV TH0,#High(-1000)       ; -1000 = FC18h ==> TH0 = FCh

(h)        MOV TL0,#Low(-1000)        ;                   TL0 = 18h

(i)        MOV TH1,#High(-5000)       ; -5000 = EC78h ==> TH1 = ECh

(j)        MOV TL1,#Low(-5000)        ;                   TL1 = 78h

 

(k)        MOV TH1,#High(-65536)      ; Ada pesan kesalahan

 

(l)        MOV TH1,#High(-8191)       ; maksimal mode-0

(m)        MOV TH1,#High(-8192)       ; diluar range mode-0

 

Contoh g s/d j adalah contoh untuk mengisikan register timer pada mode-1. bilangan tertinggi adalah 65535. Namun yang harus diperhatikan adalah apabila digunakan untuk mode-0, kita bisa memasukkan nilai diatas range 13-bit (8191) tanpa ada pesan kesalahan dari assembler, walaupun hal itu salah, dan program tida berjalan semestinya. 

 

 

 

Contoh 9-17

 

Cari (a) frekuensi gelombang balok yang dihasilkan kode di bawah ini, dan (b) cari siklus kerja dari gelombang ini.

 

         MOV   TMOD,#02h    ;Timer-0 Mode-2 (8-bit,autoreload)

         MOV   TH0,#-150    ;TH0=6Ah = 2’s comp dari = -150

LAGI:    SETB  P1.3         ;P1.3 = 1

         ACALL DELAY

         ACALL DELAY

         CLR   P1.3         ;P1.3 = 0

         ACALL DELAY

         SJMP  LAGI

 

DELAY:   SETB TR0          ;jalankan Timer

ULANG:   JNB  TF0,ULANG    ;Monitor Timer Flag

         CLR  TR0          ;Matikan Timer

         CLR  TF0          ;Reset TF

         RET

 

Jawaban:

 

Untuk nilai TH dalam mode-2, konversi bisa dilakukan oleh assembler, selama itu adalah bilangan negatif. Hal ini akan membuat perhitungan menjadi sangat mudah. Seperti contoh kita menggunakan 150 clock, maka kita mendapatkan waktu tundaan untuk subrutin DELAY adalah = 150 x 1.085 uS = 162 uS. Karena bagian sinyal tinggi adalah dua kali dari sinyal rendah maka dapat dibilang gelombang memiliki siklus kerja 66%. Selanjutnya kita mendapatkan T = bagian tinggi + bagian rendah = 325.5 uS + 162.25 uS = 488.25 uS dan frekuensi adalah 2.048 kHz.

 

 

 

      Harap diingat bahwa dari beberapa contoh perhitungan waktu tundaan yang sudah kita berikan, kita masih mengabaikan waktu clock tambahan yang diperlukan komputer untuk mengeksekusi instruksi-instruksi di dalam loop itu sendiri. Untuk memperoleh perhitungan waktu tundaan yang akurat, seperti program untuk menghasilkan sebuah frekuensi. Jika tidak, saat kita memeriksanya dengan osiloskop, maka kita akan mendapati frekuensi yang dihasilkan tidak sama dengan yang kita perhitungkan.

 

      Pada bagian ini, kita telah membahas pengunaan Timer 8051 sebagai penghasil tundaan waktu. Namun ada penggunaan lain yang lebihkreatif, yaitu menggunakan Timer tersebut sebagai pencacah atau penghitung atau counter dari sebuah keadaan yang terjadi diluar komputer. Kesemuanya itu akan kita jelaskan pada bagian Bab berikutnya.

 



 

SubBAB 9.2 : PEMROGRAMAN COUNTER PADA 8051

 

      Pada SubBAB yang lalu kita menggunakan Timer/Counter dari 8051 sebagai Timer atau sebagai penghasil tundaan waktu. Timer/Counter ini dapat juga digunkan sebagai pencacah, atau penghitung, atau counter dari keadaan yang terjadi diluar komputer. Sejauh ini kita masih menitik-beratkan penggunaan Timer/Counter sebagai Timer, tibalah saatnya kita membahas penggunaannya sebagai Counter. Semua bahasan mengenai Timer dapat dikenakan pada Counter. Baik itu tentang register-register, Mode, roll over, jumlah cacahan, dsb. Satu-satunya yang berbeda adalah sumber denyut untuk Timer yang sebelumnya diperoleh dari osilator kristal system utama 8051, untuk Counter sumber denyut dihasilkan dari status salah satu port 8051 tersebut. Semua bahasan tentang TH dan TL juga berlaku untuk Counter.

 

C/T pada register TMOD

 

      Seperti yang sudah kita ketahui bahwa C/’T adalah bit pemilih sumber denyut. Jika C/’T = 0, maka Timer digunakan sebagai penghasil tundaan waktu atau disebut Timer. Namun jika C/’T = 1, maka Timer digunakan sebagai pencacah atau counter yang mengambil sumber denyut clock dari luar komputer, yaitu melalui pin 14 atau pin 15. Masing-masing pin itu dinamakan T0 (Timer-0 input) dan T1 (Timer-1 input). Ingat bahwa pin-pin tersebut adalah bagian dari port 3. Saat Timer-0 dengan C/’T = 1, maka sumber clock didapat dari pin 14 (P3.4). Setiap adanya status rendah dari pin tersebut maka Pencacah Timer-0 akan mencacah satu kali. Begitu pula untuk Timer-1 dengan C/’T =1, maka Pin 15 (P3.5) akam mebuat pencacah Timer-0 mencacah sekali.

 

Tabel 9-1 Pin-pin yang digunakan Timer-0 dan Timer-1

 

 

Pin

Port Pin

Fungsi

Keterangan

14

P3.4

T0

Timer/Counter 0 External Input

15

P3.5

T1

Timer/Counter 1 External Input

 

 

Contoh 9-18

 

Anggaplah kita memberikan denyut clock melalui pin T1. Tulis program untuk Counter-1 dengan mode-2 , yang melakukan cacahan dan menampilkan status cacahan pada TL1 ke P2.

 

Jawaban:

 

         MOV  TMOD,#01100000   ;Counter-1,Mode-2,8-bit,C/’T=1

                               ; pulsa eksternal

         MOV  TH0,#0           ;Clear TH

         SETB P3.5             ;Buat port sebagai input

LAGI:    SETB TR1

ULANG:   MOV  A,TL1            ;Salin Counter ke A

         MOV  P2,A             ;Kirim A ke Port 2

         JNB  TF1,ULANG        ;Ulang sampai TF = 1

         CLR  TR1              ;Matikan Counter 1

         CLR  TF1              ;Reset TF

         SJMP LAGI

 

Perhatikan pada program di atas ini, atas penggunaan instruksi “SETB P3.5“. Karena port selalu dibuat menjadi port output saat CPU di-reset, maka kita harus membuat P3.5 menjadi port input dengan membuatnya tinggi. Dengan kata lain, kita harus menjadikan pin T1 (P3.5) dalam logika tinggi, agar port tersebut dapat menerima perubahan status yang diberikan kepadanya.

 

          

 

P2 Terhubung dengan 8 LED, sedang Sumber Denyut diberikan pada Port T1.

 

 

      Pada Contoh 9-18 kita menggunakan Timer-1 sebagai pencacah counter, di mana pencacah akan mencacah sekali saat adanya denyut rendah pada pin 3.5. Denyut ini dapat diumpamakan (direpresentasikan) sebagai jumlah orang yang berjalan melalui pintu bandara, jumlah putar roda kendaraan, dan semua perubahan keadaan yang bisa diubah menjadi denyut pulsa.

      Pada contoh 9-19, Data TL ditampilan dalam bentuk biner. Dan dalam contoh 9-19, TL dikonversi menjadi ASCII yang kemudian bisa ditampilkan pada LCD sebagai angka.

 

gambar 9-5 (a)Timer-0 Mode-1 dgn External Input (b) Timer-1 Mode-1 dgn External Input

 

Contoh 9-19

 

Anggaplah kita menggunakan pembangkit denyut 1 Hz yang disambungkan kepada pin 3.4. Tulis program untuk menampilkan Counter-0 pada LCD. Dan atur nilai awalan dari TH0 adalah -60.

 

Jawaban:

 

Untuk menampilkan cacahan TL ke LCD, kita harus mengubah data biner 8-bit ke dalam bentuk data ASCII. Untuk konversi data lihat BAB 6.

 

         ACALL LCD_SET_UP       ;Inisialisasi piranti LCD

         MOV   TMOD,#0000110b   ;Counter-0,Mode-2,C/’T=1

         MOV   TH0,#-60         ;mencacah 60 denyut

         SetB  P3.4             ;buat T0 sebagai port Input

LAGI:    SetB  TR0              ;hidupkan Counter

ULANG:   MOV   A,TL0            ;salin isi TL0 ke A

         ACALL CONV             ;konversi ke R2,R3,R4

         ACALL DISPLAY          ;Tampilan pada LCD

         JNB   TF0,ULANG        ;Ulangi sampai TF = 1

         CLR   TR1              ;Matikan Counter 1

         CLR   TF1              ;Reset TF

         SJMP  LAGI

 

;conversi data 8-bit biner ke ASCII

;hasilnya disimpan pada R4,R3,R2 sebagai data ASCII (R2 = LSD)

 

CONV:    MOV B,#10              ;bagi dengan 10

         DIV AB

         MOV R2,B               ;simpan digit terbawah

         MOV B,#10              ;bagi dengan 10 lagi

         DIV AB

         ORL A,#30h             ;ubah menjadi ASCII

         MOV R4,A               ;simpan MSD

         MOV A,B

         ORL A,#30h             ;ubah menjadi ASCII

         MOV R3,A

         MOV A,R2

         ORL A,#30h             ;ubah menjadi ASCII

         MOV R2,A               ;save LSD

         RET

 

               

 

Dengan menggunakan 60 Hz kita dapat menghasilkan Detik,Menit,Jam

 

Harap dicatat, untuk cacahan pertama couter TL0 masih dalam keadaan 0 ke 1, mengingat saat reset nilai TL0 selalu menjadi 0. Untuk menghidari ini, agar pertama sekali isikan TL0 dengan nilai seperti TH0. Sehingga TL0 dalam cacahan pertamanya akan mencacah mulai dari -60.

 

 

 

 

gambar 9-65 (a)Timer-0 Mode-2 dgn External Input (b) Timer-1 Mode-2 dgn External Input

 

 

      Beberapa Contoh aplikasi Timer dengan C/’T = 1, kita dapat meyambungkan pembangkit gelombang denyut 60 Hz pada Timer. Dan kemudian membuat program untuk mendapatkan Detik, Menit, dan Jam, lalu kemudian menampilkan hasilnya pada LCD. Ini adalah contoh aplikasi yang sangat menarik, walau tidak terlalu akurat sebagai Jam. Contoh dari aplikasi ini dapat dilihat pada Lampiran E.

 

      Sebelum kita menyelesaikan subBAB ini kita harus memperhatikan dua hal penting sebagaimana berikut ini.

1.    Jika anda berfikir memonitor adanya TF dengan instruksi “JNB TFx,lokasi” adalah membuang-buang waktu prosesor karena hanya melakukan satu tugas? Jawabannya adalah betul, karena komputer tidak dapat melakukan hal lain, sampai munculnya TF dan komputer keluar dari loop. Tentu ada solusinya, yaitu menggunakan interupsi. Dengan interupsi monitoring TF ini dapat kita serahkan pada mekanisme interupsi, sementara itu komputer dapat melakukan hal lain, misalnya mengirim data ke LCD, atau ke motor stepper. Dan peralatan interupsi akan memberitahu CPU saat terjadi rolls-over yang kemudian CPU melakukan tugas yang berkaitan dengan Timer atau Counter tersebut. Hal mengenai interusi akan kita bahas lebih dalam pada bab lain.

2.    Anda mungkin bertanya-tanya tentang TR0 dan TR1 itu adalah anggota bagian register mana. Masing-masing bit tersebut adalah milik register TCON, yang mana akan kita diskusikan nanti

 

Tabel 9-2.  Instruksi yang sejenis untuk Register TCON (Timer Control)

 

Untuk Timer 0

SETB TR0     =     SETB TCON.4

CLR  TR0     =     CLR  TCON.4

 

SETB TF0     =     SETB TCON.5

CLR  TF0     =     CLR  TCON.5

 

 

Untuk Timer 1

SETB TR1     =     SETB TCON.6

CLR  TR1     =     CLR  TCON.6

 

SETB TF1     =     SETB TCON.7

CLR  TF1     =     CLR  TCON.7

 

 

Register TCON

 

      Dari contoh yang sudah-sudah, kita selalu menggunakan TR0 dan/atau TR1 untuk menjalankan Timer. Dua bit ini adalah bagian dari register TCON (Timer Control). Regsiter ini adalah register 8-bit, yang seperti ditapilkan dalam ganbar 9-2, 4-bit teratas dari register ini digunakan untuk menyimpan TR0 dan TR1, yang masing-maisng untk Timer-0 dan Timer-1. Sedangkan 4-bit terbawah adalah dugunkan untuk control interupsi. Harap diingat bahwa TCON adalah register yang bisa dialamati bit. Saat kita menggunakan instruksi seperti “SetB TR1” atau “Clr TR1“, alternatif lain a dalah dengan menggunakan instruksi “SetB TCON.6” atau “Clr TCON.6“. Tabel 9-2 menunjukan alternativ dari instruksi-intruksi semacam ini.

 

 

Saat GATE = 1 pada register TMOD

 

      GATE adalah bit terakhir dari register TMOD yang akan kita bahas. Selam ini kita menggunakan Timer atau counter dalam keadaan bit GATE = 0. Sehingga Tiemr dapat dijalankan dengan perintah “SetB TR1” atau “Clr TR1“. Lalu apa yang terjadi saat GATE = 1. Seperti yang kita lihat dalam gambar 9-8 dan 9-9, jika GATE = 1, maka Timer dapat dijalankan dan dihentikan secara eksternal melalui pin P3.2 dan Pin P3.3 masing-masing untuk Timer-0 dan Timer-1. Di lain pihak Counter tersebut harus diaktifkan dengan perintah “SetB TRx” terlebih dahulu. Selanjutnya dengan demikian bahwa Timer dapat dijalankan dan dihentikan secara eksternal kapan saja misalnya dengan menghubungkan pin-pin tersebut dengan switch sederhana. Cara menhidupkan dan menghentikan Timer semacam ini, banyak dipakai oleh beberapa aplikasi.

 

Seperti contoh, sebuah system 8051 yang dibangun untuk menghasilkan suara alarm setiap detik menggunakan Timer-0. Timer-0 diaktifkan dan dijalankan melalui software dengan perintah “SetB TR0“. Selanjutnya kita dapat mengkontrol hidup-matinya Timer-0 ini dengan harware melalui pin P3.2, termasuk misalnya untuk mematikan alarm.

 

gambar 9-8: Timer/Counter 0

 

gambar 9-9: Timer/Counter 1

 

 



 

RINGKASAN

 

      8051 memiliki dua buah Timer/Counter. Masing-masing dapat digunakan sebagai Timer untuk menghasilkan tundaan waktu. Dan dapat pula digunakan sebagai Counter pencacah keadaan. Pada BAB ini pula diperlihatkan beberapa contoh pemrograman Timer/Counter dengan mode-mode yang bervariasi.

      Masing-masing kedua Timer memiliki regisater 16-bit, yang masing-masingnya regtister 16-bit tersebut dapat diakses seperti register 8-bit lainnya TL0 dan TH0 untuk Timer-0, serta TL1 dan TH1 untuk Timer-1.Kedua Timer menggunakan register TMOD untuk mengatur Timer dalam mode tertetu.4-bit terendah dari register TMOD dipakai oleh Timer-0, dan 4-bit tertas digunkan oleh Timer-1.

      Ada beberap perbedaan mode yang dapat kita gunakan. Mode-0 adalah Timer 13-bit, Mode-1 adalah Timer 16-bit,Mode-2 adalah Timer 8-bit yang ditambah dengan auto reloading.

      Saat Timer/digunakan sebagai Timer, osilator kristal dari system utamna digunakan sebagai sumber denyut, namun sebaliknya jika digunakan sebagai Counter, adanya pulsa denyut rendah pada pin P3.4 atau pin P3.5, yang bisa membuat Timer/Counter mencacah sekali pada register-register TH dan TL-nya.

 



—————————————-

|o-o| Diterjemahkan oleh Dhanny Dhuzell

—————————————-

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.