Sabtu, 15 Januari 2011

Membangkitkan “delay time” lebih besar dari satu detik dengan menggunakan Timer 0 denga mode 1 pada keluarga Microcontroller 8051

Pendahuluan

Delay time dengan durasi lebih besar dari satu detik pada dunia pengontrolan merupakan hal yang sering digunakan agar suatu operasi micro controller dapat dimati oleh user atau pengguna; Delay time pada running LED (Light Emitting Diode). Banyaknya pe-nanya di Internet (berbagai Blok) dan juga pada perkuliahan Microcontroller, Mekatronika dan Robotika yang diasuh penulis yang mempertanyakan cara kerja timer telah mendorong penulis untuk membahas masalah ini. Penulis mengambil Running LED sebagai objek penampil hanya karena media ini dapat dirakit dengan mudah dan digunakan pada percobaan Microcontroller.

Isi

Pada gambar 1 ditunjukkan gambar rangkaian display LED (delapan buah) yang disusun dalam susunan Common Anode (kutub Anoda dari masing-masing LED dihubungkan bersama melalui jumper (J3);jika kaki 1 dan 2 jumper/penghubung dihubung singkat.

Jika kaki 1 dan 2 dari J3 dihubungkan maka kedelapan kaki Anoda LED adakan mendapatkan tegangan Vcc (+ 5 Volt). Jika kita ingin menghidupkan salah satu LED maka kita harus memberikan tegangan 0 (GND) pada kaki katoda dari LED tersebut.

.














Jika kita menghubungkan port parallel 0 (P 0) dari micro controller seperti ditunjukkan pada gambar 2 di atas, kita akan mendapatkan rangkaian Running Led yang dikontrol oleh microprocessor 8051. Seperti telah disinggung sebelumnya rangkaian LED di atas disusun dengan susunan Common Anode. Agar rangkaian LED di atas dapat menyala kaki katoda (Cathode) dari LED yang akan dinyalakan harus mendapatkan tegangan 0 Volt (Logika 0).

Agar efek running LED kelihatan kita harus menghidupkan tiap LED secara bergantian, seperti ditunjukkan pada gambar 3 di bawah ini.

Gambar 3 Tampilan Running LED

Dari gambar 3 di atas jelas terlihat konsep dari Running LED setiap LED akan hidup selama 1 detik atau lebih tergantung dari ke-inginan pemrogram agar mudah diamati.

Diagram alir (Flow Chart) Gambar 4 dari pemrograman Running LED tersebut ditunjukkan pada gambar 4 di bawah ini.









Inisialisasi Timer (Delay 1 detik atau Lebih, Data=01






Dari flow chart (Gambar 4) di atas dapat dipahami bahwa delay lebih dari satu detik digunakan untuk memudahkan user (Pengguna) untuk mengamati dan memahami cara kerja program yang dibuat.

Pada artikel ini akan dibahas Delay dibangkitkan dengan menggunakan Timer 0 dengan mode 1. Untuk dapat dengan mudah memahami cara kerja delay ini ada baiknya dilihat gambar 5 di bawah ini.

01

Gambar 5 kompoen-komponen Microcontroller 8051 Sumber[2]






http://ndoware.com/wp-content/uploads/2009/06/8051pin.gif



Gambar 6 Konfigurasi PIN Microcontroller 8051 sumber [6].


Dari gambar 5 di atas dapat kita pahami bahwa keluarga microcontroller 8051 memiliki dua buah timer;Timer 0 dan Timer 1, tetapi seperti telah disinggung sebelumnya pada kesempatan ini akan didiskusikan penggunaan timer 0 sebagai pembangkit delay.

Dari Peta memory 8051 (SFR, Special Function Register) gambar 7 [3] diketahui bahwa Timer 0

sfr8051



Gambar 7 SFR 8051 sumber[3]


Terdiri dari dua buah register TH0 dan TL0 masing-masing berkaspasitas 8 bit;timer0 seperti halnya juga Timer 1 merupakan timer 16 bit. TL0 dan TH0 masing-masing terletak pada alamat 8A­H dan 8C­H.




TL0 =8AH

TH0 =8CH

Untuk dapat mengkonfigurasi Timer 0 ini kita harus juga memahami dahulu dua buah register lagi pada SFR, yakni register TCON dan TMOD yang berturut-turut terletak pada alamat 88H dan 89H . Gambar 9 di bawah ini menunjukkan bit-bit TCON.


Register TCON berguna untuk mendapatkan status Timer baik Timer 0 ataupun Timer 1 (apakah sudah overflows) (Timer telah mencapai harga maksimum dan kembali ke nilai awal). Hal ini ditandai dengan logika dari bit 5 dan Bit 7 (TF0 dan TF1). Jika terjadi overflows bit TF0 ataupun TF1 akan berlogika 1; tergantung Timer mana yang dimaksud.

Bit ke 4 dan bit ke 6 (TR0 dan TR1) dari TCON berguna untuk mengaktifkan timer yang dimaksud, Jika TRx berlogika 0 maka Timer x akan berhenti bekerja sebaliknya jika TRx berlogika 1 maka Timer x akan beroperasi.

TCON merupakan register bit addressable; kita dapat menggunakan instruksi-instruksi bit untuk mengaksesnya. Instruksi Instruksi di bawah ini akan mengaktifkan Timer 0 dan Timer 1,

SETB TRO;Mengaktifkan Timer 0

SETB TR1;Mengaktifkan Timer 1

MOV TCON,#10h;Mengaktifkan Timer 0

MOV TCON,#40h;Mengaktifkan Timer1

SETB 8Ch; Mengaktifkan Timer 0

SETB 8Eh; Mengaktifkan Timer1

MOV 88h,#10h;Mengaktifkan Timer 0

MOV 88h,#40h;Mengaktifkan Timer 1

Instruksi-instruksi berikut ini digunakan untuk memberhentikan Timer 0 dan Timer 1

CLR TR0;Memberhentikan Timer 0

CLR TR1;Memberhentikan Timer1

MOV TCON,#00h;Menon aktifkan Timer 0

MOV TCON,#00h;Menonaktifkan Timer1

CLR 8Ch;Menon aktifkan Timer 0

CLR 8Eh;Menon aktifkan Timer1

MOV 88h,#00h;Menonaktifkan Timer 0

MOV 88h,#00h;Menonktifkan Timer 1

Kelebihan perintah dengan mengunakan instruksi bit (SETB dan CLR) dibandingkan dengan instruksi MOV adalah dengan menggunakan instruksi ini kita dapat mengaktifkan ataupun menon aktifkan Timer tertentu tanpa mengangu operasi timer lainnya.

Sebagai contoh perintah

SETB TRO

Akan mengaktifkan Timer 0 tanpa menganggu keadaan Timer 1. Sementara instruksi

MOV 88h,#10h

Akan mengaktifkan Timer 0 dan menon aktifkan Timer 1 dan juga menganggu status Timer 1.

Bit 0-Bit 3 dari TCON tidak dibahas pada diskusi ini. Keempat bit terbawah dari TCON digunakan untuk operasi Intrupsi[4].

Register berikutnya yang harus dikonfigurasi adalah TMOD. Seperti halnya register TCON, regeister ini juga merupakan register 8 bit dan juga register bit addressable. Alamat dari register ini seperti telah dibahas sebelumnya adalah 89h lihat juga gambar 7 di atas.


Untuk lebih mudah memahami fungsi dari bit-bit TMOD ini ada baiknya kita lihat gambar 11­[5] di bawah ini.

timer



Gambar 11 diagram blok timer pada 8051sumber[5]


Pada gambar 11 terlihat register TMOD untuk pengaturan Timer 0 (Bit 0-Bit 3). Sementara untuk pengaturan Timer 1 adalah Bit 4-Bit 7[5] lihat gambar 10 dan gambar 11. Pada bahagian ini akan didiskusikan pengaturan Timer 0 saja.

Pada gambar 11 terlihat bahwa pengaturan mode Timer 0 diatur dengan men Set/Reset Bit 0 (M0) dan Bit 1 (M1).



Tabel 1 Pengaturan Mode Timer sumber[4]


Bit 1

Bit 0

Keterangan

0

0

Mode 0;Timer 0 13 bit

0

1

Mode1;Timer 0 16 Bit

1

0

Mode 2;Timer 0 Auto reload

1

1

Mode 3;Timer 0 dua buah timer terpisah

Untuk mengatur Timer 0 dengan mode 1 maka bit 0 (M0) dan bit 1 (M1) TMOD diisi dengan data 1, dan 0 seperti ditunjukkan oleh table 1 di atas.

Untuk bit 2 (C/T’) dan bit 3 (GATE) kita isi dengan data 0, 0 berturut-turut; Kita menggunakan input dari OSC/12 (berfungsi sebagai Timer;bukan sebagai event counter (pencacah kejadian). Jika bit 2 (C/T’) diisi dengan 1 maka sumber clock untuk Timer bukan lagi OSC/12 tetapi T0/P3.4 Pin/Kaki 14 Microcontroller 8051 lihat gambar 6 dan gambar 11.

Untuk bit 3 (GATE) juga diisi dengan 0 Timer akan bekerja Jika TR0 (bit 4) dari register TCON berlogika 1, jika data yang diisikan pada bit 3 (GATE) adalah 1 maka Timer akan bekerja jika ada sinyal Intrupt (INT0/P3.2) Pin/Kaki 12 dari Microcontroller 8051 dan TR0 (Bit 4) dari register TCON berlogika 1 juga lihat gambar 6 dan gambar 11.

Dengan demikian untuk mengkonfigurasi Timer 0 dengan mode 1 yang harus kita lakukan adalah

  • memberikan data 01H (00000001B ) register TMOD.
  • Memberikan data 10H (00010000B ) register TCON
  • Menset TH0 dan THL dengan nilai awal sesuai dengan lama delay

Seperti telah didiskusikan sebelumnya lama berlangsungnya delay ditentukan oleh pengisian data awal pada TH0 dan TL0.




Dari gambar 12 di atas kita melihat Timer 0 akan meningkat cacahnya dari nilai awal (isi TH0 dan TL0) sampai dengan berisi FFFFH (65535D). Nilai TF0 akan berganti dari 0 menjadi 1 ketika isi dari Timer berobah dari 65535D menjadi 0D. Isi dari TF0 ini akan digunakan sebagai tanda untuk menghentikan Timer 0, dan mengisi kembali Timer 0 kembali dengan nilai awal.

Frekwensi yang masuk ke Timer adalah fosc /12; fosc=12 MHz. Dengan demikian frekwensi yang masuk ke Timer 0 adalah 1 MHz. Durasi/lama (Periode satu getaran =1X10-6 detik) atau dapat ditulis T=1/f;1/(1X106 Getaran/detik=1µ detik/Getaran).









(Nilai awal65535D0).

65535D


Dengan demikian delay =1 µdetik X Jumlah cacah Timer

Atau dapat ditulis dalam formula



Text Box: delay ={65536-Nilai awal}X1 µdetik


Jika kita membuat nilai awal = 0, maka delay = 1 µdetik X 65536. Dengan demikian delay=0,065536 detik. Untuk mendapatkan delayTotal 1 detik kita harus membagi delayTotal dengan delay. Untuk mendapatkan delayTotal 1 detik kita harus membuat “cacah luar” sebesar 1 detik/0,065536 detik =15,2587890625 kali ̴ 15 kali (0FH). Kita dapat menggunakan R0 sebagai pencacah luar tersebut.

Program lengkap dari delayTotal dapat dilihat di bawah ini.

Org 30h

start:

call initial_timer1

;lompat ke inisialisasi timer1

mov a,#01h

;isi data dengan 01h (Led 0 menyala)

ulang1:

mov P0,a

;tampilkan isi a pada Port 0 (Led 0 menyala)

call delay_satudetik

;Tunda 1 detik

rl a

;Pindahkan led berikutnya

sjmp ulang1

;lompat ke ulang1

initial_timer1:

push psw

;simpan status ke stack

push ar0

;simpan a0 ke stack

clr tr0

;non aktifkan timer 0

clr tf0

;bit f0 dire-set

mov tmod,#01

;timer 1 dengan mode 1

mov th0,#00h

;isi th0 dengan 0

mov tl0,#00h

;isi tl0 dengan 0

pop ar0

;kembalikan isi r0 dari stack

pop psw

;kembalikan isi psw dari stack

ret

;kembali dari sub routine

delay_satudetik:

push psw

;simpan isi psw ke stack

push ar0

;simpan isi r0 ke stack

mov r0,#0fh

;isi r0 dengan data 0fh (delay 1 detik)

ulang:

jnb tf0,$

;periksa apakah timer1 telah overflows

clr tr0

;non aktikan timer1

clr tf0

;bit f0 di re-set

djnz r0, ulang

;jika r0 belum bernilai 0 lompat ke ulang

pop ar0

;kembalikan nilai ar0 dari stack

pop psw

;kembalikan nilai psw dari stack

ret

;kembali dari sub routine

end

;akhir program

Jika kita ingin mendapatkan delay yang lebih besar dari 1 detik kita dapat membuat potongan program delay diatas sebagai sub routine delay_satu detik dan menset register r1 sebagai pencacah jumlah detik, seperti ditunjukkan pada program di bawah ini.

Org 30h

Mulai:

Call initial_timer1

;memanggil sub routine timer1

Mov r1,2;set delay 2 detik

;isi r1 dengan jumlah kelipatan 1 detik

Ulang:

Call delay_satudetik

;memeanggil register satu detik

djnz r1, ulang

;r1 dikurang 1, jika r1 belum sama dengan nol lompat ke label ulang

end

Penutup

Tulisan ini diharapkan akan memberikan sumbangan pemikiran kepada Ilmu pengetahuan, terutama bidang pengontrolan berbasis Microcontroller. Juga diharapkan dapat membantu para mahasiswa, pencinta dan pengguna Microcontroller untuk dapat menggunakannnya pada bidang automatisasi-industri, sekuriti, robotika, mekatronika, medis dan bebagai aplikasi lainnya.