TEKNOLOGI ELEKTRONIKA

TEKNOLOGI ELEKTRONIKA

Sabtu, April 18, 2009

Mikrokontroler

Kepingin edit, compiled , dan debug file untuk bahasa Assembly Mikrokontroller coba aplikasi ini. Gambar di atas adalah dimana kita ingin mengkompile ASM ke HEX untuk diwrite (diisikan) ke mikrokontroller. Sudah dicoba untuk assembly ke AT89S51/52.
Bisa juga untuk C-compiler.


Single TUbe Nixie Clock





Mengatur Timer

Gambar 4 merupakan bagan susunan rangkaian yang bisa terjadi pada Timer 1 secara lengkap, digambarkan pula hubungan-hubungan semua register pembentuk dan pengatur Timer 1. Gambar ini berlaku pula untuk Timer 0.

Dalam pemakaian sesungguhnya, rangkaian yang dipakai hanya sebagian dari rangkaian lengkap tersebut, sesuai dengan keperluan sistem yang dibangun. Rangkaian yang dikehendaki dibentuk dengan mengatur register TMODE, sedangkan kerja dari Timer dikendalikan lewat register TCON.


Gambar 4
Skema lengkap Timer 1 dalam Mode 1

Setelah MCS51 di-reset register TMOD bernilai $00, hal ini berarti :

· bit C/T* =’0’, menurut Gambar 4 keadaan ini membuat saklar S1 ke posisi atas, sumber sinyal denyut berasal dari osilator kristal yang frekuensinya sudah dibagi 12, pencacah biner yang dibentuk dengan TL1 dan TH1 berfungsi sebagai timer. Jika sistem yang dirancang memang menghendaki Timer 1 bekerja sebagai timer maka bit C/T* tidak perlu diatur lagi.
Tapi jika sistem yang dirancang menghendaki agar Timer 1 bekerja sebagai counter untuk menghitung pulsa yang masuk lewat kakai T1 (P3.5), maka posisi saklar S1 harus dikebawahkan dengan membuat bit C/T* menjadi ‘1’.

· bit GATE=’0’, hal ini membuat output gerbang OR selalu ‘1’ tidak dipengaruhi keadaan ‘0’ atau ‘1’ pada kaki INT1 (P3.3). Dalam keadaan semacam ini, saklar S2 hanya dikendalikan lewat bit TR1 dalam register TCON. Jika TR1=’1’ saklar S2 tertutup sehingga sinyal denyut dari S1 disalurkan ke sistem pencacah biner, aliran sinyal denyut akan dihentikan jika TR=’0’.
Sebaliknya jika bit GATE=’1’, output gerbang OR akan mengikuti keadaan kaki INT1, saat INT1=’0’ apa pun keadaan bit TR1 output gerbang AND selalu =’0’ dan saklar S1 selalu terbuka, agar saklar S1 bisa tertutup kaki INT1 dan bit TR1 harus =’1’ secara bersamaan.

Jika sistem yang dirancang menghendaki kerja dari timer/counter dikendalikan dari sinyal yang berasal dari luar chip, maka bit GATE harus dibuat menjadi ‘1

· bit M1 dan M0=’0’, berarti TL1 dan TH1 disusun menjadi pencacah biner 13 bit (Mode 0), jika dikehendaki Timer 1 bekerja pada mode 1 seperti terlihat dalam Gambar 4, maka bit M1 harus dibuat menjadi ‘0’ dan bit M0 menjadi ‘1’.

Pengetahuan di atas dipakai sebagai dasar untuk mengatur dan mengendalikan Timer seperti terlihat dalam contoh-contoh berikut :

Setelah reset TMOD bernilai $00, berarti Timer 1 bekerja sebagai pencacah biner 13 bit, sumber sinyal denyut dari osilator kristal atau Timer 1 bekerja sebagai ‘timer’, bit GATE =’0’ berarti kaki INT1 tidak berpengaruh pada rangkaian sehingga Timer 1 hanya dikendalikan dari bit TR1.

Dalam pemakaian biasanya dipakai pencacah biner 16 bit, untuk keperluan itu instruksi yang diperlukan untuk mengatur TMOD adalah :

MOV TMOD,#010000

Catatan dalam instruksi di atas tanda ‘#’ menyatakan bagian di belakangnya adalah bilangan konstan yang akan diisikan ke TMOD, ‘%’ merupakan awalan yang menandakan bahwa bilangan di belakangnya adalah bilangan biner. Penulisan dengan bilangan biner semacam ini, memudahkan untuk mengenali dengan cepat bit-bit apa saja yang diisikan ke TMOD.

Bilangan biner 010000 diisikan ke TMOD, berakibat bit 7 TMOD (bit GATE) bernilai ‘0’, bit 6 (bit C/T*) bernilai ‘0’, bit 5 dan 4 (bit M1 dan M0) bernilai ‘01’, ke-empat bit ini dipakai untuk mengatur Timer 1, sehingga Timer 1 bekerja sebagai timer dengan pencacah biner 16 bit yang dikendalikan hanya dengan TR1.

Jika dikehendaki pencacah biner dipakai sebagai counter untuk mencacah jumlah pulsa yang masuk lewat kaki T1 (P3.5), instruksinya menjadi :

MOV TMOD,#%01010000

Perbedaannya dengan instruksi di atas adalah dalam instruksi ini bit 6 (bit C/T*) bernilai ‘1’. Selanjutnya jika diinginkan sinyal dari perangkat keras di luar chip MCS51 bisa ikut mengendalikan Timer 1, instruksi pengatur Timer 1 akan menjadi :

MOV TMOD,#%11010000

Dalam hal ini bit 7 (bit GATE) bernilai ‘1’.

Setelah mengatur konfigurasi Timer 0 seperti di atas, pencacah biner belum mulai mencacah sebelum diperintah dengan instruksi :

SETB TR1

Perlu diingatkan jika bit GATE = ‘1’, selama kaki INT1 bernilai ‘0’ pencacah biner belum akan mencacah. Untuk menghentikan proses pencacahan, dipakai instruksi

CLR TR1

Di atas hanya dibahas Timer 1 saja, tata canya untuk Timer 0 persis sama. Yang perlu diperhatikan adalah register TMOD dipakai untuk mengatur Timer 0 dan juga Timer 1, sedangkan TMOD tidak bisa dialamati secara bit (non bit addressable) sehingga jika jika kedua Timer dipakai, pengisian bit-bit dalam register TMOD harus dipikirkan sekali gus untuk Timer 0 dan Timer 1.

Bit TR1 dan TR0 yang dipakai untuk mengendalikan proses pencacahan, terletak di dalam register TCON (memori-data internal nomor $88) yang bisa dialamati secara bit (bit addressable). Sehingga TR0 dan TR1 bisa diatur secara terpisah (dengan perintah SETB atau CLR), tidak seperti mengatur TMOD yang harus dilakukan secara bersamaan.

Demikian pula bit penampung limpahan pencacah biner TF0 dan TF1, juga terletak dalam register TCON yang masing-masing bisa di-monitor sendiri.

Pemakaian waktu tunda

Waktu tunda banyak dipakai dalam pemerograman mikronkontroler untuk membangkitkan pulsa, membangkitkan sinyal periodik dengan frekuensi tertentu, untuk menghilangkan effek getar dari skalar dalam membuat key pad (keyboard sederhana) dan lain sebagainya.

Waktu tunda bisa dibangkitkan secara sederhana dengan menjalankan instruksi-instruksi yang waktu pelaksanaanya bisa diperhitungkan dengan tepat. Untuk mendapatkan waktu tunda yang panjang, tidak dipakai cara di atas tapi pakai Timer. Waktu tunda yang dibentuk dengan kedua cara tersebut sangat tergantung pada frekuensi kerja mikrokontroller, dalam contoh-contoh berikut dianggap mikrokontroller bekerja pada frekuensi 12 MHz.

Instruksi-instruksi berikut ini bisa dipakai untuk membangkitkan pulsa ‘0’ dengan lebar 3 mikro-detik pada kaki P1.0

01: CLR P1.0

02: NOP ; 1 mikro-detik

03: NOP ; 1 mikro-detik

04: SETB P1.0 ; 1 mikro-detik

Instruksi baris pertama membuat P1.0 yang mula-mula ‘1’ menjadi ‘0’, pelaksanaan instruksi NOP memerlukan waktu 1 mikro-detik (jika MCS51 bekerja pada frekuensi 12 MHz), instruksi SETB P1.0 juga memerlukan waktu 1 mikro-detik, total waktu sebelum P1.0 kembali menjadi ‘1’ adalah 3 mikro-detik (baris 2 3 dan 4). Dengan demikian terjadilah pulsa dengan lebar 3 mikro-detik pada kaki P1.0 seperti terlihat pada Gambar 5.



Gambar 5
Pulsa 3 mikro-detik pada P1.0

Dengan sedikit perubahan instruksi-instruksi di atas bisa membangkitkan sinyal dengan frekuensi 100 KHz pada kaki P1.0 :

01: Sinyal100KHz:

02: CPL P1.0 ; 1 mikro-detik

03: NOP ; 1 mikro-detik

04: NOP ; 1 mikro-detik

05: SJMP Sinyal100KHz ; 2 mikro-detik

Instruksi CPL P1.0 pada baris 1 membalik keadaan pada P1.0, bila mula-mula P1.0 bernilai ‘1’ akan dirubah menjadi ‘0’, sebaliknya bila mula-mula ‘0’ akan dirubah menjadi ‘1’. Total waktu tunda ke-empat baris di atas adalah 5 mikro-detik, sehingga yang terjadi adalah P1.0 bernilai ‘0’ selama 5 mikro-detik dan bernilai ‘1’ selama 5 mikro-detik berulang terus tanpa henti, dengan frekuensi sebesar 1/10 mikro-detik = 100.000 Hertz.

Program di atas bisa pula dibuat dengan memakai Timer 1 sebagai pengatur waktu tunda sebagai berikut :

01: MOV TMOD,#100000 ; Timer 1 bekerja pada Mode 2

02: MOV TH1,#$F6 ; Nilai pengisi ulang TL1

03: SET TR1 ; Timer 1 mulai mencacah

04: Ulangi:

05: BIT TF1,$ ; Tunggu sampai melimpah

06: CPL P1.0 ; Keadaan pada P1.0 di-balik

07: CLR TF1 ; Hapus limpahan pencacah

08: SJMP Ulangi ; Ulangi terus tiada henti…

Instruksi baris pertama mempersiapkan Timer 0 bekerja pada Mode 2 – Pencacah Biner 8 bit dengan Isi Ulang, bilangan pengisi ulang ditentukan sebesar $F0 yang disimpan ke register TH1 pada baris 2, instruksi berikutnya memerintahkan pencacah biner mulai mencacah.



Pencacah biner yang dibentuk dengan register TL1 akan mencacah naik seirama dengan sikluas sinyal denyut, mulai dari $F6 sampai $FF, saat pencacah melimpah dari $FF ke $00 bit TR1 pada register TCON akan menjadi ‘1’ dan TL1 secara otomatis di isi ulang dengan bilangan $F0 yang tersimpan pada register TH0. Hal ini akan terjadi terus menerus dan berulang setiap 10 siklus sinyal denyut ($F6, $F7, $F8, $F9, $FA, $FB, $FC, $FD, $FE, $FF kembali ke $00, total 10 siklus)

Instruksi BIT TR1,$ menunggu bit TR1 menjadi ‘1’, yakni saat pecacah biner melimpah dari $FF ke $00 yang dibahas di atas. Lepas dari penantian tersebut, P1.0 dibalik keadaanya dengan instruksi CPL P1.0, TR1 dikembalikan menjadi 0 (harus dikembalikan sendiri dengan instruksi ini), agar bisa ditunggu lagi sampai menjadi ‘1’ kembali setelah instruksi SJMP Ulangi.

Frekuensi dari sinyal di P1.0 sebesar 1 / 16 mikro-detik = 31,25 KHz.

Nilai awal yang diisikan ke pencacah biner di atas, adalah nilai negatip dari faktor pembagi yang dikehendaki. Dalam contoh di atas, bilangan pembaginya adalah 16 (atau $10 heksadesimal), nilai negatip dari $10 adalah $F0 (bilangan negatip komplemen 2 diturunkan dengan cara bilangan asal dibalik/di-not-kan kemudian ditambah 1, dalam hal ini $10 di-not-kan menjadi $EF dan ditambah 1 menjadi $F0).

Cara menentukan bilangan negatip di atas cukup merepotkan, tapi hal ini mudah diselesaikan dengan bantuan assembler, instruksi MOV TH1,#$F0 di atas bisa digantikan dengan MOV TH1,#-$10, assembler yang akan menghitung -$10 menjadi $F0.

Contoh pemakaian waktu tunda berikutnya adalah untuk mengatasi getaran saklar dalam membuat key pad (keyboard sederhana).

Pada saat saklar mekanis di tekan atau pada saat tekanan pada saklar dilepas, selama lebih kurang 30 mili-detik saklar tersebut akan bergetar atau sebelum mencapai keadaan stabil saklar tersebut akan on/off selama waktu lebih kurang 30 detik, mengakibatkan program mikrokontroller merasakan tombol berulang-ulang ditekan, meskipun sesungguhnya hanya ditekan satu kali saja.

Hal ini bisa diatasi dengan cara menunda waktu sekitar 50 mili-detik setelah program merasakan sebuah tombol ditekan, seperti berikut:

01: BacaTombol:

02: MOV TMOD,#010000 ; Timer 1 bekerja pada mode 1

03: JB T1,$ ; tunggu di sini sampai tombol ditekan

04: MOV TL1,#-50000/256 ; siapkan waktu tunda 50 mili-detik

05: MOV TH1,#-50000

06: CLR TF1 ; me-nol-kan bit limpahan

07: SETB TR1 ; timer mulai bekerja

08: JNB TF1,$ ; tunggu di sini sampai melimpah

09: CLR TR1 ; timer berhenti kerja

10: RET

Dalam program di atas, saklar dipasangkan antara kaki T1 dan Ground, pencacah biner yang dipakai adalah pencacah biner 16 yang sudah ditentukan dengan instruksi MOV TMOD,#010000. Pada baris berikut program menunggu saklar yang terhubung pada T1 ditekan, selama saklar belum ditekan mikrokontroller akan tertahan pada instruksi JB T1,$.

Dua baris berikutnya adalah cara mengisikan nilai –50000 yang terdiri dari 2 byte ke register TL1 dan TH1. Bit TF1 di-nol-kan dan akan kembali menjadi ‘1’ setelah Tl1/TH1 mencacah dari –50000 kembali menjadi $0000. Waktu tunda dimulai segera setelah instruksi SETB TR1, dan selesainya waktu tunda ditunggu dengan instruksi JNB TF1,$. Jika MCS51 bekerja dengan kristal 12 MHz, waktu tunda selama 50000 siklus sama dengan 50.000 x 1 mikro-detik = 50 mili-detik,

Setelah menunggu selama 50 mili-detik, pencacah biner kembali di-non-aktipkan dengan CLR TR1 dan berikutnya meninggalkan sub-rutin ini dengan instruksi RET. Dengan demikian mikrokontroller akan menungu saklar stabil, selama saklar masih bergetar mikrokontroller masih tertahan di dalam su-rutin BacaTombol.


Timer dan Counter dalam MCS51

Timer dan Counter merupakan sarana input yang kurang dapat perhatian pemakai mikrokontroller, dengan sarana input ini mikrokontroller dengan mudah bisa dipakai untuk mengukur lebar pulsa, membangkitkan pulsa dengan lebar yang pasti, dipakai dalam pengendalian tegangan secara PWM (Pulse Width Modulation) dan sangat diperlukan untuk aplikasi remote control dengan infra merah.

Pada dasarnya sarana input yang satu ini merupakan seperangkat pencacah biner (binary counter) yang terhubung langsung ke saluran-data mikrokontroller, sehingga mikrokontroller bisa membaca kedudukan pencacah, bila diperlukan mikrokontroller dapat pula merubah kedudukan pencacah tersebut.

Seperti layaknya pencacah biner, bilamana sinyal denyut (clock) yang diumpankan sudah melebihi kapasitas pencacah, maka pada bagian akhir untaian pencacah akan timbul sinyal limpahan, sinyal ini merupakan suatu hal yang penting sekali dalam pemakaian pencacah. Terjadinya limpahan pencacah ini dicatat dalam sebuah flip-flop tersendiri.

Di samping itu, sinyal denyut yang diumpankan ke pencacah harus pula bisa dikendalikan dengan mudah. Hal-hal yang dibicarakan di atas diringkas dalam Gambar 1.


Gambar 1
Konsep dasar Timer/Counter sebagai sarana input

Sinyal denyut yang diumpankan ke pencacah bisa dibedakan menjadi 2 macam, yang pertama yalah sinyal denyut dengan frekuensi tetap yang sudah diketahui besarnya dan yang kedua adalah sinyal denyut dengan frekuensi tidak tetap.

Jika sebuah pencacah bekerja dengan frekuensi tetap yang sudah diketahui besarnya, dikatakan pencacah tersebut bekerja sebagai timer, karena kedudukan pencacah tersebut setara dengan waktu yang bisa ditentukan dengan pasti.

Jika sebuah pencacah bekerja dengan frekuensi yang tidak tetap, dikatakan pencacah tersebut bekerja sebagai counter, kedudukan pencacah tersebut hanyalah menyatakan banyaknya pulsa yang sudah diterima pencacah.

Untaian pencacah biner yang dipakai, bisa merupakan pencacah biner menaik (count up binary counter) atau pencacah biner menurun (count down binary counter).

Timer/Counter sebagai sarana input banyak dijumpai dalam mikrokontroller, misalnya mikrokontroller keluarga MCS48, keluarga MCS51 ataupun MC68HC11 semuanya memiliki Timer/Counter di dalam chip sebagai sarana input. Di samping itu bisa pula dijumpai chip Timer/Counter yang berdiri sendiri sebagai penunjang kerja mikroprosesor, misalnya 8253/8254 Programmable Interval Timer buatan Intel, atau MC6840 Programmable Counter/Timer buatan Motorola.

Sarana Timer/Counter dalam MCS51

Keluarga mikrokontroller MCS51, misalnya AT89C51 dan AT89Cx051, dilengkapi dengan dua perangkat Timer/Counter, masing-masing dinamakan sebagai Timer 0 dan Timer 1. Sedangkan untuk jenis yang lebih besar, misalnya AT89C52, mempunyai tambahan satu perangkat Timer/Counter lagi yang dinamakan sebagai Timer 2.

Perangkat Timer/Counter tersebut merupakan perangkat keras yang menjadi satu dalam chip mikrokontroller MCS51, bagi pemakai mikrokontroller MCS51 perangkat tersebut dikenal sebagai SFR (Special Function Register) yang berkedudukan sebagai memori-data internal.

Pencacah biner untuk Timer 0 dibentuk dengan register TL0 (Timer 0 Low Byte, memori-data internal nomor $6A) dan register TH0 (Timer 0 High Byte, memori-data internal nomor $6C).

Pencacah biner untuk Timer 1 dibentuk dengan register TL1 (Timer 1 Low Byte, memori-data internal nomor $6B) dan register TH1 (Timer 1 High Byte, memori-data internal nomor $6D).

Pencacah biner pembentuk Timer/Counter MCS51 merupakan pencacah biner menaik (count up binary counter) yang mencacah dari $0000 sampai $FFFF, saat kedudukan pencacah berubah dari $FFFF kembali ke $0000 akan timbul sinyal limpahan.

Untuk mengatur kerja Timer/Counter dipakai 2 register tambahan yang dipakai bersama oleh Timer 0 dan Timer 1. Register tambahan tersebut adalah register TCON (Timer Control Register, memori-data internal nomor $88, bisa dialamat secara bit) dan register TMOD (Timer Mode Register, memori-data internal nomor $89).

Pencacah biner Timer 0 dan 1

TL0, TH0, TL1 dan TH1 merupakan SFR (Special Function Register) yang dipakai untuk membentuk pencacah biner perangkat Timer 0 dan Timer 1. Kapasitas keempat register tersebut masing-masing 8 bit, bisa disusun menjadi 4 macam Mode pencacah biner seperti terlihat dalam Gambar 2a sampai Gambar 2d.

Pada Mode 0, Mode 1 dan Mode 2 Timer 0 dan Timer 1 masing-masing bekerja sendiri, artinya bisa dibuat Timer 0 bekerja pada Mode 1 dan Timer 1 bekerja pada Mode 2, atau kombinasi mode lainnya sesuai dengan keperluan.

Pada Mode 3 TL0, TH0, TL1 dan TH1 dipakai bersama-sama untuk menyusun sistem timer yang tidak bisa di-kombinasi lain.

Susunan TL0, TH0, TL1 dan TH1 pada masing-masing mode adalah sebagai berikut:

Mode 0 – Pencacah Biner 13 bit


Gambar 2a
Mode 0 - Pencacah Biner 13 Bit

Pencacah biner dibentuk dengan TLx (maksudnya bisa TL0 atau TL1) sebagai pencacah biner 5 bit (meskipun kapasitas sesungguhnya 8 bit), limpahan dari pencacah biner 5 bit ini dihubungkan ke THx (maksudnya bisa TH0 atau TH1) membentuk sebuah untaian pencacah biner 13 bit, limpahan dari pencacah 13 bit ini ditampung di flip-flop TFx (maksudnya bisa TF0 atau TF1) yang berada di dalam register TCON.

Mode ini meneruskan sarana Timer yang ada pada mikrokontroller MCS48 (mikrokontroller pendahulu MCS51), dengan maksud rancangan alat yang dibuat dengan MCS48 bisa dengan mudah diadaptasikan ke MCS51. Mode ini tidak banyak dipakai lagi.

Mode 1 – Pencacah Biner 16 bit


Gambar 2b
Mode 1 - Pencacah Biner 16 Bit

Mode ini sama dengan Mode 0, hanya saja register TLx dipakai sepenuhnya sebagai pencacah biner 8 bit, sehingga kapasitas pencacah biner yang tersbentuk adalah 16 bit. Seiring dengan sinyal denyut, kedudukan pencacah biner 16 bit ini akan bergerak dari $0000 (biner 0000 0000 0000 0000), $0001, $0002 … sampai $FFFF (biner 1111 1111 1111 1111), kemudian melimpah kembali menjadi $0000.

Mode 2 – Pencacah Biner 8 bit dengan Isi Ulang


Gambar 2c
Mode 2 - Pencacah Biner 8 Bit dengan Isi Ulang

TLx dipakai sebagai pencacah biner 8 bit, sedangkan THx dipakai untuk menyimpan nilai yang diisikan ulang ke TLx, setiap kali kedudukan TLx melimpah (berubah dari $FF menjadi $00). Dengan cara ini bisa didapatkan sinyal limpahan yang frekuensinya ditentukan oleh nilai yang disimpan dalam TH0.


Mode 3 – Gabungan Pencacah Biner 16 bit dan 8 Bit


Gambar 2d
Mode 3 – Gabungan Pencacah Biner 16 Bit dan 8 Bit

Pada Mode 3 TL0, TH0, TL1 dan TH1 dipakai untuk membentuk 3 untaian pencacah, yang pertama adalah untaian pencacah biner 16 bit tanpa fasiltas pemantau sinyal limpahan yang dibentuk dengan TL1 dan TH1. Yang kedua adalah TL0 yang dipakai sebagai pencacah biner 8 bit dengan TF0 sebagai sarana pemantau limpahan. Pencacah biner ketiga adalah TH0 yang dipakai sebagai pencacah biner 8 bit dengan TF1 sebagai sarana pemantau limpahan.

Register Pengatur Timer

Register TMOD dan register TCON merupakan register pembantu untuk mengatur kerja Timer 0 dan Timer 1, kedua register ini dipakai bersama oleh Timer 0 dan Timer 1.


Gambar 3a
Denah susunan bit dalam register TMOD

Register TMOD dibagi menjadi 2 bagian secara simitris, bit 0 sampai 3 register TMOD (TMOD bit 0 .. TMOD bit 3) dipakai untuk mengatur Timer 0, bit 4 sampai 7 register TMODE (TMOD bit 4 .. TMOD bit 7) dipakai untuk mengatur Timer 1, pemakaiannya sebagai berikut :

· Bit M0/M1 dipakai untuk menentukan Mode Timer seperti yang terlihat dalam Tabel di Gambar 3a.

· Bit C/T* dipakai untuk mengatur sumber sinyal denyut yang diumpankan ke pencacah biner. Jika C/T*=0 sinyal denyut diperoleh dari osilator kristal yang frekuensinya sudah dibagi 12, sedangkan jika C/T*=1 maka sinyal denyut diperoleh dari kaki T0 (untuk Timer 0) atau kaki T1 (untuk Timer 1).

· Bit GATE merupakan bit pengatur saluran sinyal denyut. Bila bit GATE=0 saluran sinyal denyut hanya diatur oleh bit TRx (maksudnya adalah TR0 atau TR1 pada register TCON). Bila bit GATE=1 kaki INT0 (untuk Timer 0) atau kaki INT1 (untuk Timer 1) dipakai juga untuk mengatur saluran sinyal denyut (lihat Gambar 4).


Gambar 3b
Denah susunan bit dalam register TCON

Register TCON dibagi menjadi 2 bagian, 4 bit pertama (bit 0 .. bit 3, bagian yang diarsir dalam Gambar 3b) dipakai untuk keperluan mengatur kaki INT0 dan INT1, ke-empat bit ini dibahas dibagian lain.

Sisa 4 bit dari register TCON (bit 4..bit 7) dibagi menjadi 2 bagian secara simitris yang dipakai untuk mengatur Timer0/Timer 1, sebagai berikut:

· Bit TFx (maksudnya adalah TF0 atau TF1) merupakan bit penampung limpahan (lihat Gambar 2), TFx akan menjadi ‘1’ setiap kali pencacah biner yang terhubung padanya melimpah (kedudukan pencacah berubah dari $FFFF kembali menjadi $0000). Bit TFx di-nol-kan dengan istruksi CLR TF0 atau CLR TF1. Jika sarana interupsi dari Timer 0/Timer 1 dipakai, TRx di-nol-kan saat MCS51 menjalankan rutin layanan interupsi (ISRInterupt Service Routine).

· Bit TRx (maksudnya adalah TR0 atau TR1) merupakan bit pengatur saluran sinyal denyut, bila bit ini =0 sinyal denyut tidak disalurkan ke pencacah biner sehingga pencacah berhenti mencacah. Bila bit GATE pada register TMOD =1, maka saluran sinyal denyut ini diatur bersama oleh TRx dan sinyal pada kaki INT0/INT1 (lihat Gambar 4).

Gambar 4
Skema lengkap Timer 1 dalam Mode 1


Operasi Bit dengan MCS51

Pada umumnya mikrokontroller mengolah data 8 bit sekali gus, misalnya mengisi akumulator dengan data 8 bit sekali gus, isi akumulator yang 8 bit dijumlahkan dengan isi memori yang 8 bit dan lain sebagainya. MCS51 dilengkapi kemampuan mengolah data per bit, untuk keperluan ini bit Carry dalam PSW diperlakukan sebagai ‘akumulator bit’, dan dilengkapi dengan beberapa instruksi khusus untuk operasi Boolean.

Objek operasi Bit

Seperti sudah dibahas dibagian depan, memori-data nomor $20 sampai $2F bisa dipakai menampung informasi dalam level bit. Setiap byte memori di daerah ini bisa menampung 8 bit informasi yang masing-masing dinomori tersendiri, misalkan bit 0 dari memori-data nomor $20 bisa disebut sebagai bit nomor 0, bit 1 memori-data nomor $20 disebut sebagai bit nomor 1… seterusnya bit 0 dari memori-data nomor $21 disebut sebagai bit nomor 8, bit 7 memori-data nomor $21 disebut sebagai bit nomor 15 dan seterusnyanya.

Dengan demikian memori-data nomor $20 sampai dengan nomor $2F sebanyak 16 byte memori bisa dipakai untuk menyimpan 128 bit (16 x 8 bit) data Boolean yang dinomori dengan bit nomor $00 sampai $7F.

Di samping itu, operasi bit bisa pula belaku di memori-data nomor $80 sampai dengan $FF yang biasa disebut sebagai Special Function Register (SFR). Hanya SFR dengan nomor memori-data yang diakhiri dengan angka heksa-desimal 0 atau 8 yang bisa dipakai untuk operasi bit, bit pada memori-data daerah ini sebanyak 128 bit, mendapat nomor dari $80 sampai dengan $FF.

Secara keseluruhan operasi bit bisa diberlakukan pada 256 lokasi bit seperti terlihat dalam Gambar 6.


Gambar 6
Denah memori-bit

Operasi bit yang bisa ditangani oleh MCS51 antara lain mencakup : pemberian nilai pada data biner 1 bit, perpindahan data 1 bit, operasi logika 1 bit meliputi operasi AND, OR dan NOT, pengujian nilai data biner 1 bit.

Pemberian nilai data biner

Untuk keperluan ini disediakan 2 instruksi, yakni SETB (Set Bit) dipakai memberi nilai ‘1’ pada data biner 1 bit, dan CLR (Clear Bit) dipakai memberi nilai ‘0’ pada data biner 1 bit.

Contoh pemakaian instruksi ini sebagai berikut :

SETB ACC.0

SETB $E0

CLR P1.1

CLR $90

Instruksi SETB ACC.0 di atas membuat bit 0 dari akumulator (ACC.0) bernilai ‘1’, tapi mengingat nomor bit dari bit 0 akumulator adalah $E0 (lihat Gambar 6), maka hasil kerja kedua instruksi SETB di atas adalah sama.

Demikian pula dengan kedua instruksi CLR berikutnya, instruksi-instruksi ini akan mengakibatkan P1.1 bernilai ‘0’. Di samping itu perlu pula diingat, P1.1 terhubung ke kaki IC MCS51, jadi hasil kerja operasi SETB maupun CLR pada P0, P1, P2 dan P3 bisa langsung terukur dengan volt meter, atau operasi-operasi ini bisa langsung dipakai men-on/off-kan rangkaian di luar IC MCS51.

Perpindahan data biner

Dalam operasi bit, bit Carry di dalam Program Status Word (PSW, nomor $D0) diperlakukan sebagai akumulator.

256 data dalam level bit dalam MCS51, bisa dipindahkan dari satu posisi ke posisi yang lain, permindahan ini dilakukan dengan bantuan bit Carry yang mempunyai sifat sebagai ‘akumulator bit’.

Contoh permindahan data level bit ini bisa dilakukan sebagai berikut :

MOV C,P1.1

MOV P1.0,C

2 instruksi di atas akan meng-copy-kan tegangan pada kaki Port 1 bit 1 ke kaki Port 1 bit 0, dengan demikian tegangan pada kedua kaki IC MCS51 itu akan sama. Seluruh 256 bit data yang dibahas di atas, bisa dipindah-pindahkan dengan instruksi ini.

Operasi logika

Operasi logika pada umumnya mencakup empat hal, yaitu operasi AND, operasi OR, operasi EX-OR dan operasi NOT. MCS51 hanya bisa melaksanakan tiga jenis operasi logika yang ada, yakni intruksi ANL (AND Logical) untuk operasi AND instruksi ORL (OR Logical) untuk operasi OR, CPL (Complement bit) untuk operasi NOT.

Bit Carry pada PSW diperlakukan sebagai ‘akumulator bit’, dengan demikian operasi AND dan operasi OR dilakukan antara bit yang tersimpan pada bit Carry dengan salah satu dari 256 bit data yang dibahas di atas. Contoh dari instruksi-instruksi ini adalah :

ANL C,P1.1

ANL C,/P1.2

Instruksi ANL C,P1.1 meng-AND-kan nilai pada bit Carry dengan nilai Port 1 bit 1 (P1.1), dan hasil operasi tersebut ditampung pada bit Carry. Instruksi ANL C,/P1.1 persis sama dengan instruksi sebelumnya, hanya saja sebelum di-AND-kan, nilai P1.1 dibalik (complemented) lebih dulu, jika nilai P1.1=‘0’ maka yang di-AND-kan dengan bit Carry adalah ‘1’, demikian pula sebaliknya. Hal serupa berlaku pada instruksi ORL.

Instruksi CPL dipakai untuk membalik (complement) nilai semua 256 bit data yang dibahas di atas. Misalnya :

CPL C

CPL P1.0

CPL C akan membalik nilai biner dalam bit Carry (jangan lupa bit Carry merupakan salah satu bit yang ada dalam 256 bit yang dibahas di atas, yakni bit nomor $E7 atau PSW.7).

Pengujian nilai Boolean

Pengujian Nilai Boolean dilakukan dengan instruksi JUMP bersyarat, ada 5 instruksi yang dipakai untuk keperluan ini, yakni instruksi JB (JUMP if bit set), JNB (JUMP if bit Not Set), JC (JUMP if Carry Bit set), JNC (JUMP if Carry Bit Not Set) dan JBC (JUMP if Bit Set and Clear Bit).

Dalam instruksi JB dan JNB, salah satu dari 256 bit yang ada akan diperiksa, jika keadaannya (false atau true) memenuhi syarat, maka MCS51 akan menjalankan instruksi yang tersimpan di memori-program yang dimaksud. Alamat memori-program dinyatakan dengan bilangan relatip terhadap nilai Program Counter saat itu, dan cukup dinyatakan dengan angka 1 byte. Dengan demikian instruksi ini terdisi dari 3 byte, byte pertama adalah kode operasinya ($29 untuk JB dan $30 untuk JNB), byte kedua untuk menyatakan nomor bit yang harus diuji, dan byte ketiga adalah bilangan relatip untuk instruksi tujuan.

Contoh pemakaian instruksi JB dan JNB sebagai berikut :

JB P1.1,$

JNB P1.1,$

Instruksi-instruksi di atas memantau kedaan kaki IC MCS51 Port 1 bit 1. Instruksi pertama memantau P1.1, jika P1.1 bernilai ‘1’ maka MCS51 akan mengulang instruksi ini, (tanda $ mempunyai arti jika syarat terpenuhi kerjakan lagi instruksi bersangkutan). Instruksi berikutnya melakukan hal sebaliknya, yakni selama P1.1 bernilai ‘0’ maka MCS51 akan tertahan pada instruksi ini.

Bit Carry merupakan bit yang banyak sekali dipakai untuk keperluan operasi bit, untuk menghemat pemakaian memori-program disediakan 2 instruksi yang khusus untuk memeriksa keadaan bit Carry, yakni JC dan JNC. Karena bit akan diperiksa sudah pasti, yakni bit Carry, maka instruksi ini cukup dibentuk dengan 2 byte saja, dengan demikian bisa lebih menghemat memori program.

JC Periksa

JB PSW.7,Periksa

Hasil kerja kedua instruksi di atas sama, yakni MCS51 akan JUMP ke Periksa jika ternyata bit Carry bernilai ‘1’ (ingat bit Carry sama dengan PSW bit 7). Meskipun sama tapi instruksi JC Periksa lebih pendek dari instruksi JB PSW.7,Periksa, instruksi pertama dibentuk dengan 2 byte dan instruksi yang kedua 3 byte.

Instruksi JBC sama dengan instruksi JB, hanya saja jika ternyata bit yang diperiksa memang benar bernilai ‘1’, selain MCS51 akan JUMP ke instruksi lain yang dikehendaki MCS51 akan me-nol-kan bit yang baru saja diperiksa.

Pemakaian Instruksi operasi bit

Dengan ingtruksi-instruksi operasi bit yang ada, MCS51 bisa dipakai untuk mengimplementasi fungsi Boolean secara langsung, sebagai contoh persamaan Boolean berikut diimplementasikan dengan instruksi-instruksi MCS51.

Q = ( U· ( V + W )) + ( X·/Y ) + /Z

(Catatan : /Y artinya not Y dan /Z artinya not Z).

Misalkan U V W X Y dan Z masing-masing adalah besaran Boolean yang dimasukkan ke kaki Port 1 bit 0 sampai dengan 5, sedangkan Q merupakan besaran Boolean yang ditampilkan di Port 3 bit 0, seperti terlihat dalam Gambar 7 berikut.



Gambar 7
Rangkaian Q = ( U
·( V + W )) + ( X
·/Y ) + /Z

Dalam Potongan Program baris 1 sampai dengan 7, P1.0 P1.1 dan lainnya dinyatakan sebagai data bit dengan nama U, V dan selanjutnya, penamaan ini menggunakan perintah khusus untuk assembeler (Assembler Directive) BIT, hanya nama-nama yang dibentuk dengan assembler-directive BIT yang bisa dipakai untuk operasi bit.

















Mengatur Alur Program MCS51

Pada dasarnya program dijalankan intruksi demi instruksi, artinya selesai menjalankan satu instruksi mikrokontroller langsung menjalankan instruksi berikutnya, untuk keperluan ini mikrokontroller dilengkapi dengan Program Counter yang mengatur pengambilan intruksi secara berurutan. Meskipun demikian, program yang kerjanya hanya berurutan saja tidaklah banyak artinya, untuk keperluan ini mikrokontroller dilengkapi dengan instruksi-instruksi untuk mengatur alur program.

Secara umum kelompok instruksi yang dipakai untuk mengatur alur program terdiri atas instruksi-instruksi JUMP (setara dengan statemen GOTO dalam Pascal), instruksi-instruksi untuk membuat dan memakai sub-rutin/modul (setara dengan PROCEDURE dalam Pascal), instruksi-instruksi JUMP bersyarat (conditional Jump, setara dengan statemen IF .. THEN dalam Pascal). Di samping itu ada pula instruksi PUSH dan POP yang bisa memengaruhi alur program.

Karena Program Counter adalah satu-satunya register dalam mikrokontroller yang mengatur alur program, maka kelompok instruksi pengatur program yang dibicarakan di atas, semuanya merubah nilai Program Counter, sehingga pada saat kelompok instruksi ini dijalankan, nilai Program Counter akan tidak akan runtun dari nilai instruksi sebelumnya.

Selain karena instruksi-instruksi di atas, nilai Program Counter bisa pula berubah karena pengaruh perangkat keras, yaitu saat mikrokontroller di-reset atau menerima sinyal interupsi dari perangkat input/output. Hal ini akan dibicarakan secara detail dibagian lagi.

Kelompok Instruksi JUMP

Mikrokontroller menjalankan intruksi demi instruksi, selesai menjalankan satu instruksi mikrokontroller langsung menjalankan instruksi berikutnya, hal ini dilakukan dengan cara nilai Program Counter bertambah sebanyak jumlah byte yang membentuk instruksi yang sedang dijalankan, dengan demikian pada saat instruksi bersangkutan dijalankan Program Counter selalu menyimpan nomor memori-program yang menyimpan instruksi berikutnya.

Pada saat mikrokontroller menjalankan kelompok instruksi JUMP, nilai Program Counter yang runtun sesuai dengan alur program diganti dengan nomor memori-program baru yang dikehendaki programer.

Mikrokontroller MCS51 mempunyai 3 macam intruksi JUMP, yakni instruksi LJMP (Long Jump), instruksi AJMP (Absolute Jump) dan instruksi SJMP (Short Jump). Kerja dari ketiga instruksi ini persis sama, yakni memberi nilai baru pada Program Counter, kecepatan melaksanakan ketiga instruksi ini juga persis sama, yakni memerlukan waktu 2 periode instruksi (jika MCS51 bekerja pada frekuensi 12 MHz, maka instruksi ini dijalankan dalam waktu 2 mikro-detik), yang berbeda dalam jumlah byte pembentuk instruksinya, instruksi LJMP dibentuk dengan 3 byte, sedangkan instuksi AJMP dan SJMP cukup 2 byte.

Instruksi LJMP

Kode untuk instruksi LJMP adalah $02, nomor memori-program baru yang dituju dinyatakan dengan bilangan biner 16 bit, dengan demikian instruksi ini bisa menjangkau semua memori-program MCS51 yang jumlahnya 64 KiloByte. Instruksi LJMP terdiri atas 3 byte, yang bisa dinyatakan dengan bentuk umum 02 aa aa, aa yang pertama adalah nomor memori-program bit 8 sampai dengan bit 15, sedangkan aa yang kedua adalah nomor memori-program bit 0 sampai dengan bit 7.

Pemakaian instruksi LJMP bisa dipelajari dari potongan program berikut :

LJMP TugasBaru

ORG $2000

TugasBaru:

MOV A,P3.1

Dalam potongan program di atas, ORG adalah perintah pada assembler agar berikutnya assembler bekerja pada memori-program nomor yang disebut di belakang ORG (dalam hal ini minta assembler berikutnya bekerja pada memori-program nomor $2000). TugasBaru disebut sebagai LABEL, yakni sarana assembler untuk menandai/ menamai nomor memori-program. Dengan demikian, dalam potongan program di atas, memori-program nomor $2000 diberi nama TugasBaru, atau bisa juga dikatakan bahwa TugasBaru bernilai $2000. (Catatan : LABEL ditulis minimal satu huruf lebih kiri dari instruksi, artinya LABEL ditulis setelah menekan tombol Enter, tapi instruksi ditulis setelah menekan tombol Enter, kemudian diikuti dengan 1 tombol spasi atau tombol TAB).

Dengan demikian intruksi LJMP TugasBaru di atas, sama artinya dengan LJMP $2000 yang oleh assembler akan diterjemahkan menjadi 02 20 00 (heksadesimal).

Instruksi AJMP

Nomor memori-program baru yang dituju dinyatakan dengan bilangan biner 11 bit, dengan demikian instruksi ini hanya bisa menjangkau satu daerah memori-program MCS51 sejauh 2 KiloByte. Instruksi AJMP terdiri atas 2 byte, byte pertama merupakan kode untuk instruksi AJMP (00001b) yang digabung dengan nomor memori-program bit nomor 8 sampai dengan bit nomor 10, byte kedua dipakai untuk menyatakan nomor memori-program bit nomor 0 sampai dengan bit nomor 7.

Berikut ini adalah potongan program untuk menjelaskan pemakaian instruksi AJMP:

ORG $800

AJMP DaerahIni

AJMP DaerahLain

ORG $900

DaerahIni:

. . .

ORG $1000

DaerahLain:

. . .

Potongan program di atas dimulai di memori-program nomor $800, dengan demikian instruksi AJMP DaerahIni bisa dipakai, karena nomor-memori $800 (tempat instruksi AJMP DaerahIni) dan LABEL DaerahIni yang terletak di dalam satu daerah memori-progam 2 KiloByte yang sama dengan. (Dikatakan terletak di dalam satu daerah memori-program 2 KiloByte yang sama, karena bit nomor 11 sampai dengan bit nomor 15 dari nomor memorinya sama).

Tapi AJMP DaerahLain akan di-salah-kan oleh Assembler, karena DaerahLain yang terletak di memori-program nomor $1000 terletak di daerah memori-program 2 KiloByte yang lain.

Karena instruksi AJMP hanya terdiri dari 2 byte, sedangkan instruksi LJMP 3 byte, maka memakai instruksi AJMP lebih hemat memori-program dibanding dengan LJMP. Hanya saja karena jangkauan instrusksi AJMP hanya 2 KiloByte, pemakaiannya harus hati-hati.

Memori-program IC mikrokontroller AT89C1051 dan AT89C2051 masing-masing hanya 1 KiloByte dan 2 KiloByte, dengan demikian program untuk kedua mikrokontroller di atas tidak perlu memakai instruksi LJMP, karena program yang ditulis tidak mungkin menjangkau lebih dari 2 KiloByte memori-program.

Instruksi SJMP

Nomor memori-program dalam instruksi ini tidak dinyatakan dengan nomor memori-program yang sesungguhnya, tapi dinyatakan dengan ‘pergeseran relatip’ terhadap nilai Program Counter saat instruksi ini dilaksanakan.

Pergeseran relatip tersebut dinyatakan dengan 1 byte bilangan 2’s complement, yang bisa dipakai untuk menyakatakan nilai antara –128 sampai dengan +127. Nilai minus dipakai untuk menyatakan bergeser ke instruksi-instruksi sebelumnya, sedangkan nilai positip untuk menyatakan bergeser ke instruksi-instruksi sesudahnya.

Meskipun jangkauan instruksi SJMP hanya –128 sampai +127, tapi instruksi ini tidak dibatasi dengan pengertian daerah memori-program 2 KiloByte yang membatasi instruksi AJMP.

ORG $0F80

SJMP DaerahLain

. . .

ORG $1000

DaerahLain:

Dalam potongan program di atas, memori-program $0F80 tidak terletak dalam daerah memori-program 2 KiloByte yang sama dengan $1000, tapi instruksi SJMP DaerahLain tetap bisa dipakai, asalkan jarak antara instruksi itu dengan LABEL DaerahLain tidak lebih dari 127 byte.

Kelompok Instruksi untuk sub-rutin

Instruksi-instruksi untuk membuat dan memakai sub-rutin/modul program, selain melibatkan Program Counter, melibatkan pula Stack yang diatur oleh Register Stack Pointer.

Sub-rutin merupakan suatu potong program yang karena berbagai pertimbangan dipisahkan dari program utama. Bagian-bagian di program utama akan ‘memanggil’ (CALL) sub-rutin, artinya mikrokontroller sementara meninggalkan alur program utama untuk mengerjakan instruksi-instruksi dalam sub-rutin, selesai mengerjakan sub-rutin mikrokontroller kembali ke alur program utama.

Satu-satunya cara membentuk sub-rutin adalah memberi instruksi RET pada akhir potongan program sub-rutin. Program sub-rutin di-’panggil’ dengan instruksi ACALL atau LCALL.

Agar nantinya mikrokontroller bisa meneruskan alur program utama, pada saat menerima instruksi ACALL atau LCALL, sebelum mikrokontroller pergi mengerjakan sub-rutin, nilai Program Counter saat itu disimpan dulu ke dalam Stack (Stack adalah sebagian kecil dari memori-data yang dipakai untuk menyimpan nilai Program Counter secara otomatis, kerja dari Stack dikendalikan oleh Register Stack Poiner).

Selanjutnya mikrokontroller mengerjakan instruksi-instruksi di dalam sub-rutin sampai menjumpai instruksi RET yang berfungsi sebagai penutup dari sub-rutin. Saat menerima instruksi RET, nilai asal Program Counter sebelum mengerjakan sub-rutin yang disimpan di dalam Stack, dikembalikan ke Program Counter sehingga mikrokontroller bisa meneruskan pekerjaan di alur program utama.

Instruksi ACALL dipakai untuk me-‘manggil’ program sub-rutin dalam daerah memori-program 2 KiloByte yang sama, setara dengan instruksi AJMP yang sudah dibahas di atas. Sedangkan instruksi LCALL setara dengan instruksi LCALL, yang bisa menjangkau seluruh memori-program mikrokontroller MCS51 sebanyak 64 KiloByte. (Tapi tidak ada instrusk SCALL yang setara dengan instruksi SJMP).

Program untuk AT89C1051 dan AT89C2051 tidak perlu memakai instruksi LCALL.

Instruksi RET dipakai untuk mengakhiri program sub-rutin, di samping itu masih ada pula instruksi RETI, yakni instruksi yang dipakai untuk mengakhiri Program Layanan Interupsi (Interrupt Service Routine), yaitu semacam program sub-rutin yang dijalankan mikrokontroller pada saat mikrokontroller menerima sinyal permintaan interupsi.

Catatan : Saat mikrokontroller menerima sinyal permintaaan interupsi, mikrokontroller akan melakukan satu hal yang setara dengan intruksi LCALL untuk menjalankan Program Layanan Interupsi dari sinyal interupsi bersangkutan. Di samping itu, mikrokontroller juga me-‘mati’-kan sementara mekanisme layanan interupsi, sehingga permintaan interupsi berikutnya tidak dilayani. Saat menerima instruksi RETI, makanisme layanan interusi kembali diaktipkan dan mikrokontroller melaksanakan hal yang setara dengan instruksi RET.

Kelompok Instruksi Jump Bersyarat

Instruksi Jump bersyarat merupakan instruksi inti bagi mikrokontroller, tanpa kelompok instruksi ini program yang ditulis tidak banyak berarti. Instruksi-instruksi ini selain melibatkan Program Counter, melibatkan pula kondisi-kondisi tertentu yang biasanya dicatat dalam bit-bit tertentu yang dihimpun dalam Register tertentu.

Khusus untuk keluarga mikrokontroller MCS51 yang mempunyai kemampuan menangani operasi dalam level bit, instruksi jump bersyarat dalam MCS51 dikaitkan pula dengan kemampuan operasi bit MCS51.

Nomor memori-program baru yang harus dituju tidak dinyatakan dengan nomor memori-program yang sesungguhnya, tapi dinyatakan dengan ‘pergeseran relatip’ terhadap nilai Program Counter saat instruksi ini dilaksana­kan. Cara ini dipakai pula untuk instruksi SJMP.

Instruksi JZ / JNZ

Instruksi JZ (Jump if Zero) dan instruksi JNZ (Jump if not Zero) adalah instruksi JUMP bersyarat yang memantau nilai Akumulator A.

MOV A,#0

JNZ BukanNol

JZ Nol

. . .

BukanNol:

. . .

Nol :

. . .

Dalam contoh program di atas, MOV A,#0 membuat A bernilai nol, hal ini mengakibatkan instruksi JNZ BukanNol tidak akan pernah dikerjakan (JNZ artinya Jump kalau nilai A<>0, syarat ini tidak pernah dipenuhi karena saat instruksi ini dijalankan nilai A=0), sedangankan instruksi JZ Nol selalu dikerjakan karena syaratnya selalu dipenuhi.

Instruksi JC / JNC

Instruksi JC (Jump on Carry) dan instruksi JNC (Jump on no Carry) adalah instruksi jump bersyarat yang memantau nilai bit Carry di dalam Program Status Word (PSW).

Instruksi JB / JNB / JBC

Instruksi JB (Jump on Bit Set), instruksi JNB (Jump on not Bit Set) dan instruksi JBC (Jump on Bit Set Then Clear Bit) merupakan instruksi Jump bersyarat yang memantau nilai-nilai bit tertentu. Bit-bit tertentu bisa merupakan bit-bit dalam register status maupun kaki input mikrokontroller MCS51.

Kelompok Instruksi proses dan test

Instruksi-instruksi Jump bersyarat yang dibahas di atas, memantau kondisi yang sudah terjadi yang dicatat MCS51. Ada dua instruksi yang melakukan dulu suatu proses baru kemudian memantau hasil proses untuk menentukan apakah harus Jump. Kedua instruksi yang dimaksud adalah instruksi DJNZ dan instruksi CJNE.

Instruksi DJNZ

Instruksi DJNZ (Decrement and Jump if not Zero), merupakan instruksi yang akan mengurangi 1 nilai register serbaguna (R0..R7) atau memori-data, dan Jump jika ternyata setelah pengurangan 1 tersebut hasilnya tidak nol.

Contoh berikut merupakan potongan program untuk membentuk waktu tunda secara sederhana :

MOV R0,#$23

DJNZ R0,$

Instruksi MOV R0,#$23 memberi nilai $23 pada R0, selanjutnya setiap kali instruksi DJNZ R0,$ dikerjakan, MCS51 akan mengurangi nilai R0 dengan ‘1’, jika R0 belum menjadi nol maka MCS51 akan mengulang instruksi tersebut (tanda $ dalam instruksi ini maksudnya adalah kerjakan kembali instruksi ini). Selama mengerjakan 2 instruksi di atas, semua pekerjaan lain akan tertunda, waktu tundanya ditentukan oleh besarnya nilai yang diisikan ke R0.

Instruksi CJNE

Instruksi CJNE (Compare and Jump if Not Equal) membandingkan dua nilai yang disebut dan MCS akan Jump kalau kedua nilai tersebut tidak sama!

MOV A,P1

CJNE A,#$0A,TidakSama

...

SJMP EXIT

;

TidakSama:

...

Instruksi MOV A,P1 membaca nilai input dari Port 1, instruksi CJNE A,#$0A,Tidaksama memeriksa apakah nilai Port 1 yang sudah disimpan di A sama dengan $0A, jika tidak maka Jump ke TidakSama.


Dasar Pemrograman MCS51

Program pengendali mikrokontroller disusun dari kumpulan instruksi, instruksi tersebut setara dengan kalimat perintah bahasa manusia yang hanya terdiri atas predikat dan objek. Dengan demikian tahap pertama pembuatan program pengendali mikrokontroller dimulai dengan pengenalan dan pemahaman predikat (kata kerja) dan objek apa saja yang dimiliki mikrokontroller.

Objek dalam pemrograman mikrokontroller adalah data yang tersimpan di dalam memori, register dan input/output. Sedangkan ‘kata kerja’ yang dikenal pun secara umum dikelompokkan menjadi perintah untuk perpindahan data, arithmetik, operasi logika, pengaturan alur program dan beberapa hal khusus. Kombinasi dari ‘kata kerja’ dan objek itulah yang membentuk perintah pengatur kerja mikrokontroller.

Intruksi MOV A,$7F merupakan contoh sebuah intruksi dasar yang sangat spesifik, MOV merupakan ‘kata kerja’ yang memerintahkan peng-copy-an data, merupakan predikat dalam kalimat perintah ini. Sedangkan objeknya adalah data yang di-copy-kan, dalam hal ini adalah data yang ada di dalam memori nomor $7F di-copy-kan ke Akumulator A.

Penyebutan data dalam MCS51

Data bisa berada diberbagai tempat yang berlainan, dengan demikian dikenal beberapa cara untuk menyebut data (dalam bahasa Inggris sering disebut sebagai ‘Addressing Mode’), antara lain sebagai berikut:

· Penyebutan data konstan (immediate addressing mode): MOV A,#$20. Data konstan merupakan data yang berada di dalam instruksi. Contoh instruksi ini mempunyai makna data konstan $20 (sebagai data konstan ditandai dengan ‘#’) di-copy-kan ke Akumulator A. Yang perlu benar-benar diperhatikan dalam perintah ini adalah bilangan $20 merupakan bagian dari instruksi.

· Penyebutan data secara langsung (direct addressing mode), cara ini dipakai untuk menunjuk data yang berada di dalam memori dengan cara menyebut nomor memori tempat data tersebut berada : MOV A,$30. Contoh instruksi ini mempunyai makna data yang berada di dalam memori nomor $30 di-copy-kan ke Akumulator.

Sekilas intruksi ini sama dengan instruksi data konstan di atas, perbedaannya instruksi di atas memakai tanda ‘#’ yang menandai $20 adalah data konstan, sedangkan dalam instruksi ini karena tidak ada tanda ‘#’ maka $30 adalah nomor dari memori.

· Penyebutan data secara tidak langsung (indirect addressing mode), cara ini dipakai untuk menunjuk data yang berada di dalam memori, kalau memori penyimpan data ini letaknya berubah-rubah sehingga nomor memori tidak disebut secara langsung tapi di-‘titip’-kan ke register lain : MOV A,@R0.

Dalam instruksi ini register serba guna R0 dipakai untuk mencatat nomor memori, sehingga instruksi ini mempunyai makna memori yang nomornya tercatat dalam R0 isinya di-copy-kan ke Akumulator A.

Tanda ‘@’ dipakai untuk menandai nomor memori disimpan di dalam R0.

Bandingkan dengan instruksi penyebutan nomor memori secara langsung di atas, dalam instruksi ini nomor memori terlebih dulu disimpan di R0 dan R0 berperan menunjuk memori mana yang dipakai, sehingga kalau nilai R0 berubah memori yang ditunjuk juga akan berubah pula.

Dalam instruksi ini register serba guna R0 berfungsi dengan register penampung alamat (indirect address register), selain R0 register serba guna R1 juga bisa dipakai sebagai register penampung alamat.

· Penyebutan data dalam register (register addressing mode): MOV A,R5. Instruksi ini mempunyai makna data dalam register serba guna R5 di-copy-kan ke Akumulator A. Instruksi ini membuat register serba guna R0 sampai R7 sebagai tempat penyimpan data yang sangat praktis yang kerjanya sangat cepat.

· Data yang dimaksud dalam bahasan di atas semuanya berada di dalam memori data (termasuk register serba guna letaknya juga di dalam memori data). Dalam penulisan program, sering-sering diperlukan tabel baku yang disimpan bersama dengan program tersebut. Tabel semacam ini sesungguhnya merupakan data yang berada di dalam memori program!

Untuk keperluan ini, MCS51 mempunyai cara penyebutan data dalam memori program yang dilakukan secara indirect (code indirect addressing mode) : MOVC A,@A+DPTR.

Perhatikan dalam instruksi ini MOV digantikan dengan MOVC, tambahan huruf C tersebut dimaksud untuk membedakan bahwa instruksi ini dipakai di memori program. (MOV tanpa huruf C artinya instruksi dipakai di memori data).

Tanda ‘@’ dipakai untuk menandai A+DPTR dipakai untuk menyatakan nomor memori yang isinya di-copy-kan ke Akumulator A, dalam hal ini nilai yang tersimpan dalam DPTR (Data Pointer Register - 2 byte) ditambah dengan nilai yang tersimpan dalam Akumulator A (1 byte) dipakai untuk menunjuk nomor memori program.

‘Kata kerja’ dalam AT89Cx051

Secara keseluruhan AT89Cx051 mempunyai sebanyak 255 macam instruksi, yang dibentuk dengan mengkombinasikan ‘kata kerja’ dan objek. “Kata kerja’ tersebut secara kelompok dibahas sebagai berikut :

KELOMPOK PENG-COPY-AN DATA

Kode dasar untuk kelompok ini adalah MOV, singkatan dari MOVE yang artinya memindahkan, meskipun demikian lebih tepat dikatakan perintah ini mempunyai makna peng-copy-an data. Hal ini bisa dijelaskan berikut : setelah instruksi MOV A,R7 dikerjakan, Akumulator A dan register serba guna R7 berisikan data yang sama, yang asalnya tersimpan di dalam R7.

Perintah MOV dibedakan sesuai dengan jenis memori AT89Cx051. Perintah ini pada memori data dituliskan menjadi MOV, misalkan :

MOV A,$20

MOV A,@R1

MOV A,P1

MOV P3,A

Untuk pemakaian pada memori program, perintah ini dituliskan menjadi MOVC, hanya ada 2 jenis instruksi yang memakai MOVC, yakni:

MOVC A,@A+DPTR ; DPTR sebagai register indirect

MOVC A,@A+PC ; PC sebagai register indirect

Selain itu, masih dikenal pula perintah MOVX, yakni perintah yang dipakai untuk memori data eksternal (X singkatakan dari External). Perintah ini hanya dimiliki oleh anggota keluarga MCS51 yang mempunyai memori data eksternal, misalnya AT89C51 dan lain sebagainya, dan jelas tidak dikenal oleh kelompok AT89Cx051 yang tidam punya memori data eksternal. Hanya ada 6 macam instruksi yang memakai MOVX, instruksi-instruksi tersebut adalah:

MOVX A,@DPTR

MOVX A,@R0

MOVX A,@R1

MOVX @DPTR,A

MOVX @R0,A

MOVX @R1,A

KELOMPOK ARIMATIK (ADD, ADDC, SUBB, DA, MUL dan DIV)

Perintah ADD dan ADDC

Isi Akumulator A ditambah dengan bilangan 1 byte, hasil penjumlahan akan ditampung kembali dalam Akumulator. Dalam operasi ini bit Carry (C flag dalam PSWProgram Status Word) berfungsi sebagai penampung limpahan hasil penjumlahan. Jika hasil penjumlahan tersebut melimpah (nilainya lebih besar dari 255) bit Carry akan bernilai ‘1’, kalau tidak bit Carry bernilai ‘0’. ADDC sama dengan ADD, hanya saja dalam ADDC nilai bit Carry dalam proses sebelumnya ikut dijumlahkan bersama.

Bilangan 1 byte yang ditambahkan ke Akumulator, bisa berasal dari bilangan konstan, dari register serba guna, dari memori data yang nomor memorinya disebut secara langsung maupun tidak langsung, seperti terlihat dalam contoh berikut :

ADD A,R0 ; register serba guna

ADD A,#$23 ; bilangan konstan

ADD A,@R0 ; no memori tak langsung

ADD A,P1 ; no memori langsung (port 1)

Perintah SUBB

Isi Akumulator A dikurangi dengan bilangan 1 byte berikut dengan nilai bit Carry, hasil pengurangan akan ditampung kembali dalam Akumulator. Dalam operasi ini bit Carry juga berfungsi sebagai penampung limpahan hasil pengurangan. Jika hasil pengurangan tersebut melimpah (nilainya kurang dari 0) bit Carry akan bernilai ‘1’, kalau tidak bit Carry bernilai ‘0’.

SUBB A,R0 ; A = A - R0 - C

SUBB A,#$23 ; A = A - $23

SUBB A,@R1

SUBB A,P0

Perintah DA

Perintah DA (Decimal Adjust) dipakai setelah perintah ADD; ADDC atau SUBB, dipakai untuk merubah nilai biner 8 bit yang tersimpan dalam Akumulator menjadi 2 buah bilangan desimal yang masing-masing terdiri dari nilai biner 4 bit.

Perintah MUL AB

Bilangan biner 8 bit dalam Akumulator A dikalikan dengan bilangan biner 8 bit dalam register B. Hasil perkalian berupa bilangan biner 16 bit, 8 bit bilangan biner yang bobotnya lebih besar ditampung di register B, sedangkan 8 bit lainnya yang bobotnya lebih kecil ditampung di Akumulator A.

Bit OV dalam PSW (Program Status Word) dipakai untuk menandai nilai hasil perkalian yang ada dalam register B. Bit OV akan bernilai ‘0’ jika register B bernilai $00, kalau tidak bit OV bernilai ‘1’.

MOV A,#10

MOV B,#20

MUL AB

Perintah DIV AB

Bilangan biner 8 bit dalam Akumulator A dibagi dengan bilangan biner 8 bit dalam register B. Hasil pembagian berupa bilangan biner 8 bit ditampung di Akumulator, sedangkan sisa pembagian berupa bilangan biner 8 bit ditampung di register B.

Bit OV dalam PSW (Program Status Word) dipakai untuk menandai nilai sebelum pembagian yang ada dalam register B. Bit OV akan bernilai ‘1’ jika register B asalnya bernilai $00.

KELOMPOK LOGIKA (ANL, ORL dan XRL)

Kelompok perintah ini dipakai untuk melakukan operasi logika mikrokontroller MCS51, operasi logika yang bisa dilakukan adalah operasi AND (kode operasi ANL), operasi OR (kode operasi ORL) dan operasi Exclusive-OR (kode operasi XRL).

Data yang dipakai dalam operasi ini bisa berupa data yang berada dalam Akumulator atau data yang berada dalam memori-data, hal ini sedikit berlainan dengan operasi aritmatik yang harus melihatkan Akumulator secara aktip.

Hasil operasi ditampung di sumber data yang pertama.

· Operasi logika AND banyak dipakai untuk me-‘0’-kan beberapa bit tertentu dari sebuah bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data konstan yang di-ANL-kan bilangan asal. Bit yang ingin di-‘0’-kan diwakili dengan ‘0’ pada data konstan, sedangkan bit lainnya diberi nilai ‘1’, misalnya

Instruksi ANL P1,#%01111110 akan mengakibatkan bit 0 dan bit 7 dari Port 1 (P1) bernilai ‘0’ sedangkan bit-bit lainnya tetap tidak berubah nilai.

· Operasi logika OR banyak dipakai untuk me-‘1’-kan beberapa bit tertentu dari sebuah bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data konstan yang di-ORL-kan bilangan asal. Bit yang ingin di-‘1’-kan diwakili dengan ‘1’ pada data konstan, sedangkan bit lainnya diberi nilai ‘0’, misalnya

Instruksi ORL A,#%01111110 akan mengakibatkan bit 1 sampai dengan bit 6 dari Akumulator bernilai ‘1’ sedangkan bit-bit lainnya tetap tidak berubah nilai.

· Operasi logika Exclusive-OR banyak dipakai untuk membalik nilai (complement) beberapa bit tertentu dari sebuah bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data konstan yang di-XRL-kan bilangan asal. Bit yang ingin dibalik-nilai diwakili dengan ‘1’ pada data konstan, sedangkan bit lainnya diberi nilai ‘0’, misalnya

Instruksi XRL A,#%01111110 akan mengakibatkan bit 1 sampai dengan bit 6 dari Akumulator berbalik nilai, sedangkan bit-bit lainnya tetap tidak berubah nilai

Monday, June 4, 2007

UART

UART banyak digunakan dalam komunikasi data seri dengan format data yang spesifik.

IC 89C51 memiliki fasilitas cukup lengkap, salah satu fasilitas yang ada adalah UART pada IC ini yang dipakai untuk pengiriman dan penerimaan data secara seri (P3.0 sebagai Rx dan P3.1 sebagai Tx), namun dalam kenyataannya UART yang ada pada IC AT89C51 bukanlah UART yang sebenarnya, sehingga untuk keperluan alat peraga dibuat simulasi untuk membuat sebuah UART Software dengan menggunakan IC AT89C51 sehingga proses pengiriman data dengan menggunakan UART dapat dimengerti dengan baik, juga diketahu kesalahan yang mungkin terjadi pada proses transmisi. Untuk mendukung UART Software yang dibuat, dibuat juga modul UART, dimana modul ini terdapat 4 buah tampilan 7 ruas untuk mengetahui data yang dikirim dan diterima. SW1 berupa DIP Switch dipakai untuk memberikan input data yang akan dikirim, sedangkan switch yang lain digunakan untuk mengontrol status dari data yang akan dikirim dan diterima. Push button yang digunakan berfungsi untuk menandakan pengiriman data (Strobe Data). Selain itu juga diberikan indikator kesalahan dari data yang diterima berupa LED dan status data yang diterima.

Adapun Gambar panel dari modul UART yang dibuat dapat dilihat sebagai berikut:


Gambar 1

Panel Modul UART


Serial Input dan Serial Output

Dalam keadaan mula-mula tanpa sinyal (tidak ada data yang dikirim ataupun tidak ada data yang diterima), serial port (Tx dan RX) dalam keadaan high (logic ‘1’) dikenal dengan Marking State, namun apabila terdapat pengiriman data secara serial asinkron terjadi pengiriman data dengan format tertentu yaitu seperti yang terlihat pada gambar 2 di bawah:


Gambar 2

Format Data Transmisi Serial Asinkron

Pengiriman data selalu diawali dengan start bit (selalu low ‘0’) kemudian selalu diakhiri dengan bit (selalu high ‘1’), Dalam pengiriman Data secara serial dikenal dengan Baudrate yaitu banyaknya bit yang dikirimkan dalam waktu satu detik. Misalnya baudrate suatu sistem serial adalah 9600 berarti dalam 1 detik terdapat pengiriman sebanyak 9600 bit. Baudrate ini harus sama antara pengirim dan penerina agar kesalahan tidak terjadi. Baudrate standard antara lain adalah 19200, 9600, 4800, 2400,1200, 600, 300, 150, 110, 100 dan 75.

Untuk mensinkronkan antara pemancar dan penerima digunakan start bit. Setelah start bit, bit-bit data dikirimkan satu persatu secara bergantian dimulai dari LSB (Least Significant Bit) hingga MSB (Most Significant Bit) Kemudian bila perlu dikirimkan parity untuk mendeteksi bilamana terdapat kesalahan dalam transmisi. Kemudian akan berlogika ‘1’ selama waktu paling sedikit 1 bit untuk menunjukan bahwa data karakter sudah berakhir. Bit terakhir ini dikenal dengan stop bit.

Dari gambar 2 di atas dapat dilihat bahwa data yang hendak dikirim diletakkan dalam sebuah bingkai (frame) yaitu start bit dan stop bit dan pengirimannya dilakukan per bit melalui start bit, sampai stop bit yang terakhir. Oleh karena itu data yang dikirim harus digeser setiap kali telah terjadi pengiriman 1 bit data. Berikut ini adalah potongan program untuk mengirimkan data per bit melalui P3.1 kemudian menggeser data tersebut.

Potongan Program 1 – Pengiriman Data

1 : PENGIRIMAN_DATA:

2 : SETB ENDOFTX

3 : CJNE R0,#0,KIRIMDATA

4 : CLR P3.1

5 : CLR PULSER

6 : SETB PULSER

7 : CLR PULSER

8 : INC R0

9 : MOV COUNT1,#KONSTANTA

10 : SJMP CHECKAGAIN

11 : KIRIMDATA:

12 : DJNZ COUNT1,CHECKAGAIN

13 : MOV COUNT1,#KONSTANTA

14 : CJNE R0,#9,K_STOPBIT

15 : MOV C,T_DATA9

16 : MOV P3.1,C

17 : CLR PULSER

18 : SETB PULSER

19 : CLR PULSER

20 : INC R0

21 : SJMP CHECKAGAIN

22 : K_STOPBIT:

23 : CJNE R0,#10,K_STOPBIT2

24 : JNB NO_PAR,DATA10

25 : JB STOP,DATA10

26 : MOV R0,#0

27 : CLR TRANSMIT

28 : CLR ENDOFTX

29 : SJMP CHECKAGAIN

30 : DATA10:

31 : MOV C,T_DATA10

32 : MOV P3.1,C

33 : CLR PULSER

34 : SETB PULSER

35 : CLR PULSER

36 : INC R0

37 : SJMP CHECKAGAIN

38 : K_STOPBIT2:

39 : CJNE R0,#11,SELESAIKIRIM

40 : JB NO_PAR,SELESAI

41 : JB STOP,DATA11

42 : SELESAI:

43 : SETB P3.1

44 : CLR PULSER

45 : SETB PULSER

46 : CLR PULSER

47 : MOV R0,#0

48 : CLR TRANSMIT

49 : CLR ENDOFTX

50 : SJMP CHECKAGAIN

51 : DATA11:

52 : MOV C,T_DATA11 ;KIRIM T_DATA11

53 : MOV P3.1,C

54 : CLR PULSER ;BUAT PULSA UNTUK LA

55 : SETB PULSER

56 : CLR PULSER

57 : INC R0 ;FLAG DATA DINAIKKAN

58 : SJMP CHECKAGAIN ;CHECK RECEIVE

59 : SELESAIKIRIM:

60 : CJNE R0,#12,DATAYANGDIKIRIM

61 : MOV R0,#0 ;SEMUA FLAG DIBERSIHKAN

62 : CLR TRANSMIT

63 : CLR ENDOFTX

64 : CHECKAGAIN:

65 : RET

Potongan Program 2 – Penerimaan Data

1: PENERIAMAAN_DATA:

2: INC R1

3: MOV C,P3.0

4: MOV A.7,C

5: ANL A,#10000000B

6: ORL A,BUFFER2

7: MOV BUFFER2,A

8: RET

Program di atas dapat dijelaskan sebagai berikut: R1 digunakan sebagai tanda jumlah bit yang telah diterima. Data pada port Rx akan disimpan pada buffer2 melalui MSB dan dengan menggunakan sifat dari gerbang OR dan AND maka data akan digeser terus sampai waktu tertentu (tergantung konfigurasi yang ditentukan). Program ini juga harus diletakan pada interupsi timer agar terbentuk baudrate yang tetap sehingga data yang diterima adalah benar.

Data Input dan Status Input

Untuk mengirimkan data pada serial port, hal yang harus dilakukan pertama kali adalah memberikan data input dan status data yang akan dikirimkan. Untuk mengambil data digunakan Dip Switch-8 sedangkan untuk mengambil status dari data digunakan Switch DPDT yang masing-masing dihubungkan pada port 0 dan port 2 dari AT89C51.

Proses pengambilan data dan status dapat dilihat pada potongan program sebagai berikut:

Potongan Program 3 – CheckD_Strobe

1: CHECKD_STROBE:

2: JB D_STROBE,ENDD_STROBE

3: MOV A,P0

4: CPL A

5: MOV DATAKIRIM,A

6: MOV BUFFER1,DATAKIRIM

7: ACALL ISIDATA9

8: ACALL PECAHKAN_DATA_OUT

9: SETB TRANSMIT

10: ENDD_STROBE:

11: RET

Apabila potongan program ini dipanggil akan melihat apakah pada D_STROBE adalah low, apabila low maka data akan disimpan pada variabel DATAKIRIM, setelah itu akan diletakan pada BUFFER1, sebagai tempat untuk menggeser data agar data dapat dikirim secara bit per bit. Namun sebelumnya perlu dibangkitkan dahulu data ke 9 ke 10 dan ke 11 dari data yang akan dikirim berupa parity, dan stop bit. Hal ini dapat dilihat pada baris ke 7 dari potongan program di atas, dimana pada baris ke 7 ini akan dipanggil sub-rutin untuk mengisikan data ke 9, ke 10 dan ke 11 dari data yang akan dikirimkan.

Pada baris ke 8 akan dipanggil sub-rutin untuk memecahkan data yang akan dikirim agar dapat ditampilkan pada tampilan 7 ruas seperti yang telah dijelaskan pada potongan program 1. Pada baris ke 9 Flag untuk transmit diaktifkan untuk menandakan bahwa terdapat data yang akan dikirimkan.

Potongan Program 4 – CheckC_Strobe

1: CHECKC_STROBE:

2: JB C_STROBE,ENDC_STROBE

3: MOV C,P2.1

4: MOV STOP,C

5: MOV C,P2.2

6: MOV PAR,C

7: MOV C,P2.3

8: MOV NO_PAR,C

9: ENDC_STROBE:

10: RET

Potongan program di atas dapat dijelaskan sebagai berikut: STOP, PAR dan NO_PAR merupakan variabel penampung status data. Namun sebelum disimpan pada masing-masing variabel, dilihat dulu apakah pada C_STROBE adalah low (baris ke 2 dari potongan program), apabila low baru semua status disimpan. Hal ini dimaksudkan agar status dari data tidak berubah-ubah.


Tampilan 7 Ruas

Untuk menampilkan data yang dikirim digunakan 2 buah tampilan 7 ruas LED yang dibentuk dengan D1 dan D2 sedangkan untuk menampilkan data yang diterima digunakan 2 buah lagi tampilan 7 ruas LED yang dibentuk dengan D3 dan D4. Keempat display 7 ruas itu dinyalakan secara bergantian dengan frekuensi yang tinggi dengan menggunakan prinsip multipeks, sehingga seolah-olah akan nampak nyala secara terus menerus.

Proses pengaturan sistem tampilan itu semuanya diatur melalui program yang telah disimpan dalam ROM AT89C51. Potongan program itu seperti berikut:

Potongan Program 6 – Program Timer1Interupt:

1: TIMER1INTERUPT:

2: MOV P1,KIRIM1

3: ACALL DELAY

4: MOV P1,KIRIM2

5: ACALL DELAY

6: MOV P1,TERIMA1

7: ACALL DELAY

8: MOV P1,TERIMA2

9: DELAY:

10: PUSH A

11: MOV A,#3

12: DJNZ A,*

13: POP A

14: RET

Potongan program di atas dapat dijelaskan sebagai berikut :kirim1, kirim2, terima1 dan terima2 merupakan variabel yang berfungsi untuk menampung kombinasi tertentu yang akan menampilkan display tertentu pada tampilan 7 ruas, dimana isi dari variabel ini dirubah pada bagian lain dari program sesuai dengan perubahan yang terjadi pada variabel ini. Kemudian isi dari variabel ini diumpankan pada port 1 (baris 2, 4, 6 dan 8 pada potongan program di atas), untuk mengendalikan sistem tampilan pada modul ini.

Delay merupakan sub-rutin yang berfungsi untuk menunda waktu, agar angka yang ditampilkan bisa tertahan sesaat sebelum berganti. Pada baris ke 10 aliran program dikembalikan ke program utama. Dimana potongan program ini diletakan pada interrupt timer 1 sehingga akan terus dipanggil apabila telah terjadi interrupt pada timer 1.


Output LED

Pada modul serial yang dibuat ini terdapat output LED yang memberikan tanda berupa parity yang diterima dan error yang terjadi apabila terjadi error. Error yang diperiksa adalah parity error, framing error dan overrun error. Parity Error akan terjadi apabila parity yang diterima dalah tidak sama dengan parity yang dibangkitkan oleh AT89C51 terhadap konfigurasi modul. Framming error adalah error yang terjadi karena stop bit yang diterima adalah salah. Sedangkan Overrun Error adalah error yang terjadi karena data pada buffer belum dipindahkan namun telah terjadi penerimaan data baru (data tertumpuk). Berikut ini adalah potongan program yang berfungsi untuk menampilakan output LED

Potongan Program 7 – Out

1: OUT:

2: CLR O_FLAG

3: JB NO_PAR,NOPARITYSELECT

4: SJMP PARITYSELECT

5: NOPARITYSELECT:

6: SETB PARITY

7: SETB P_ERROR

8: SJMP ERR_YG_LAIN

9: PARITYSELECT:

10: MOV C,R_DATA9

11: MOV PARITY,C

12: JC SATU

13: JNB PAR,NOLGENAP

14: JB PARBANGKIT0,TERJADIP_ERROR

15: SJMP NO_PAR_ERROR

16: NOLGENAP:

17: JB PARBANGKIT,TERJADIP_ERROR

18: SJMP NO_PAR_ERROR

19: SATU:

20: JNB PAR,SATUGENAP

21: JNB PARBANGKIT0,TERJADIP_ERROR

22: SJMP NO_PAR_ERROR

23: SATUGENAP:

24: JNB PARBANGKIT0,TERJADIP_ERROR

25: SJMP NO_PAR_ERROR

26: TERJADIP_ERROR:

27: CLR ERROR1

28: SJMP ERR_YG_LAIN

29: NO_PAR_ERROR:

30: SETB ERROR2

31: ERR_YG_LAIN:

32: ACALL FRAMMING_CHECK

33: ACALL OVERRUN_CHECK

34: END_TOTAL:

35: MOV C,ERROR1

36: MOV P_ERROR,C

37: MOV C,ERROR2

38: MOV O_ERROR,C

39: MOV C,ERROR3

40: MOV F_ERROR,C

Penjelasan program adalah sebagai berikut : pada baris 3 akan dilihat dulu konfigurasi dari status data, apabila no-parity maka parity dan parity error akan tidak aktif. Apabila ada parity maka akan dibangkitkan parity berdasar pada data yang telah diterima dan akan dibandingkan dengan parity yang diterima (baris 14, baris 17, baris 21, dan baris 24) apabila terjadi error maka LED akan dinyalakan dengan perintah ‘CLR ERROR1’. Kemudian akan dipanggilkan rutin framming_check dan overrun_check

Potongan Program 8 – Frame _Check:

1: FRAME_CHECK:

2: JNB NO_PAR,DATAKE9

3: JB STOP,SBITADA21

4: JNB R_DATA10,TERJADIFRAMMING

5: SJMP TIDAKTERJADIFRAMMING

6: SBITADA21:

7: JNB R_DATA10,TERJADIFRAMMING

8: JNB R_DATA11,TERJADIFRAMMING

9: SJMP TIDAKTERJADIFRAMMING

10: DATAKE9:

11: JB STOP,SBITADA2

12: JNB R_DATA9,TERJADIFRAMMING

13: SJMP TIDAKTERJADIFRAMMING

14: SBITADA2:

15: JNB R_DATA9,TERJADIFRAMMING

16: JNB R_DATA10,TERJADIFRAMMING

17: TIDAKTERJADIFRAMMING:

18: SETB ERROR3

19: SJMP KEMBALIFRAMMING

20: TERJADIFRAMMING:

21: CLR ERROR3

22: KEMBALIFRAMMING:

23: RET

Potongan program di atas hanya melihat apakah stop bit yang diterima adalah ‘1’ apabila ‘0’ maka akan ditampilakan pesan kesalahan, namun sebelum itu perlu dilihat dulu dimana letak stop bit dan ada berapa buah stop bit yang ada. Pengecekan jumlah stop bit dapat dilihat pada baris 3 dan baris 11. Sedangkan pengecekan awal stop bit dapat dilihat pada baris ke 2. Pada baris 18 dan baris 21 memberikan tampilan kesalahan pada LED.

Materi lain yang dapat di download :

1. Assembly Listing

2. Skematik rangkaian Modul UART dalam format PDF (Portable Data Format).



Struktur Program Assembly

Program sumber assembly

Program-sumber assembly (assembly source program) merupakan kumpulan dari baris-baris perintah yang ditulis dengan program penyunting-teks (text editor) sederhana, misalnya program EDIT.COM dalam DOS, atau program NOTEPAD dalam Windows. Kumpulan baris-printah tersebut biasanya disimpan ke dalam file dengan nama ekstensi *.ASM atau nama lain misalnya *.A51 dan lain sebagainya, tergantung pada program Assembler yang akan dipakai untuk mengolah program-sumber assembly tersebut.

Setiap baris-perintah merupakan sebuah perintah yang utuh, artinya sebuah perintah tidak mungkin dipecah menjadi lebih dari satu baris. Satu baris perintah bisa terdiri atas 4 bagian, bagian pertama dikenali sebagai label atau sering juga disebut sebagai symbol, bagian kedua dikenali sebagai kode operasi, bagian ketiga adalah operand dan bagian terakhir adalah komentar.

Antara bagian-bagian tersebut dipisahkan dengan sebuah spasi atau tabulator.

Bagian label

Label dipakai untuk memberi nama pada sebuah baris-perintah, agar bisa mudah menyebitnya dalam penulisan program. Label bisa ditulis apa saja asalkan diawali dengan huruf, biasa panjangnya tidak lebih dari 16 huruf. Huruf-huruf berikutnya boleh merupakan angka atau tanda titik dan tanda garis bawah. Kalau sebuah baris-perintah tidak memiliki bagian label, maka bagian ini boleh tidak ditulis namun spasi atau tabulator sebagai pemisah antara label dan bagian berikutnya mutlak tetap harus ditulis.

Dalam sebuah program sumber bisa terdapat banyak sekali label, tapi tidak boleh ada label yang kembar.

Sering sebuah baris-perintah hanya terdiri dari bagian label saja, baris demikian itu memang tidak bisa dikatakan sebagai baris-perintah yang sesungguhnya, tapi hanya sekedar memberi nama pada baris bersangkutan.

Bagian label sering disebut juga sebagai bagian symbol, hal ini terjadi kalau label tersebut tidak dipakai untuk menandai bagian program, melainkan dipakai untuk menandai bagian data.

Bagian kode operasi

Kode operasi (operation code atau sering disingkat sebagai OpCode) merupakan bagian perintah yang harus dikerjakan. Dalam hal ini dikenal dua macam kode operasi, yang pertama adalah kode-operasi untuk mengatur kerja mikroprosesor / mikrokontroler. Jenis kedua dipakai untuk mengatur kerja program assembler, sering dinamakan sebagai assembler directive.

Kode-operasi ditulis dalam bentuk mnemonic, yakni bentuk singkatan-singkatan yang relatip mudah diingat, misalnya adalah MOV, ACALL, RET dan lain sebagainya. Kode-operasi ini ditentukan oleh pabrik pembuat mikroprosesor/mikrokontroler, dengan demikian setiap prosesor mempunyai kode-operasi yang berlainan.

Kode-operasi berbentuk mnemonic tidak dikenal mikroprosesor/mikrokontroler, agar program yang ditulis dengan kode mnemonic bisa dipakai untuk mengendalikan prosesor, program semacam itu diterjemahkan menjadi program yang dibentuk dari kode-operasi kode-biner, yang dikenali oleh mikroprosesor/mikrokontroler.

Tugas penerjemahan tersebut dilakukan oleh program yang dinamakan sebagai Program Assembler.

Di luar kode-operasi yang ditentukan pabrik pembuat mikroprosesor/mikrokontroler, ada pula kode-operasi untuk mengatur kerja dari program assembler, misalnya dipakai untuk menentukan letak program dalam memori (ORG), dipakai untuk membentuk variabel (DS), membentuk tabel dan data konstan (DB, DW) dan lain sebagainya.

Bagian operand

Operand merupakan pelengkap bagian kode operasi, namun tidak semua kode operasi memerlukan operand, dengan demikian bisa terjadi sebuah baris perintah hanya terdiri dari kode operasi tanpa operand. Sebaliknya ada pula kode operasi yang perlu lebih dari satu operand, dalam hal ini antara operand satu dengan yang lain dipisahkan dengan tanda koma.

Bentuk operand sangat bervariasi, bisa berupa kode-kode yang dipakai untuk menyatakan Register dalam prosesor, bisa berupa nomor-memori (alamat memori) yang dinyatakan dengan bilangan atau pun nama label, bisa berupa data yang siap di-operasi-kan. Semuanya disesuaikan dengan keperluan dari kode-operasi.

Untuk membedakan operand yang berupa nomor-memori atau operand yang berupa data yang siap di-operasi-kan, dipakai tanda-tanda khusus atau cara penulisan yang berlainan.

Di samping itu operand bisa berupa persamaan matematis sederhana atau persamaan Boolean, dalam hal semacam ini program Assembler akan menghitung nilai dari persamaan-persamaan dalam operand, selanjutnya merubah hasil perhitungan tersebut ke kode biner yang dimengerti oleh prosesor. Jadi perhitungan di dalam operand dilakukan oleh program assembler bukan oleh prosesor!

Bagian komentar

Bagian komentar merupakan catatan-catatan penulis program, bagian ini meskipun tidak mutlak diperlukan tapi sangat membantu masalah dokumentasi. Membaca komentar-komentar pada setiap baris-perintah, dengan mudah bisa dimengerti maksud tujuan baris bersangkutan, hal ini sangat membantu orang lain yang membaca program.

Pemisah bagian komentar dengan bagian sebelumnya adalah tanda spasi atau tabulator, meskipun demikian huruf pertama dari komentar sering-sering berupa tanda titik-koma, merupakan tanda pemisah khusus untuk komentar.

Untuk keperluan dokumentasi yang intensip, sering-sering sebuah baris yang merupakan komentar saja, dalam hal ini huruf pertama dari baris bersangkutan adalah tanda titik-koma.

Pembahasan di atas diringkas dalam Gambar 1.


Gambar 1
Program-sumber assembly

Assembly Listing

Program-sumber assembly di atas, setelah selesai ditulis diserahkan ke program Assembler untuk diterjemahkan. Setiap prosesor mempunyai program assembler tersendiri, bahkan satu macam prosesor bisa memiliki beberapa macam program Assembler buatan pabrik perangkat lunak yang berlainan.

Hasil utama pengolahan program Assembler adalah program-obyek. Program-obyek ini bisa berupa sebuah file tersendiri, berisikan kode-kode yang siap dikirimkan ke memori-program mikroprosesor/mikrokontroler, tapi ada juga program-obyek yang disisipkan pada program-sumber assembly seperti terlihat dalam Assembly Listing di Gambar 2.

Bagian kanan Gambar 2 merupakan program-sumber Assembly karya asli penulis program, setelah diterjemahkan oleh program Assembler kode-kode yang dihasilkan berikut dengan nomor-nomor memori tempat penyimpanan kode-kode tadi, disisipkan pada bagian kiri setiap baris perintah, sehingga bentuk program ini tidak lagi dikatakan sebagai program-sumber assembly tapi dikatakan sebagai Assembly Listing.

Membaca Assembly Listing bisa memberikan gambaran yang lebih jelas bagi program yang ditulis, bagi pemula Assembly Listing memberi pengertian yang lebih mendalam tentang isi memori-program, sehingga bisa lebih dibayangkan bagaimana kerja dari sebuah program.



Gambar 2
Assembly Listing

Program Obyek format HEX

Selain Assembly Listing, hasil kerja program Asembler lainnya adalah program obyek yang dipakai untuk mengendalikan sebuah mikroprosesor/mikrokontroler, program obyek disimpan dalam file. Terdapat dua macam bentuk file penyimpan program obyek, yang pertama adalah file yang berisikan kode biner murni, dan yang satu lagi adalah file biner yang sudah diolah menjadi file teks.

File jenis pertama biasanya dinamakan sebagai binary object file, biasanya memakai ekstensi *.BIN. File semacam ini hanya berisikan angka-angka biner yang akan diisikan ke dalam memori tanpa informasi lain, sehingga selalu dianggap bahwa bahwa file tersebut berisikan kode-kode biner yang nantinya ditempatkan mulai dari memori nomor 0. Kalau ternyata kode-kode biner diisikan mulai dari memori nomor 8000h, maka mulai posisi 0 sampai 7FFFh akan diisi dengan bilangan biner 00h, baru setelah itu menyusul kode biner yang sesungguhnya. File semacam ini banyak dipakai untuk EPROM Programmer model lama.

File jenis kedua dinamakan Hexadecimal format object file, biasanya memakai ekstensi *.BIN . Data biner dirubah ke dalam bentuk heksadesimal dan yang disimpan ke dalam file adalah kode ASCII dari bilangan heksadesimal tersebut. Misalnya data biner 00111010, atau heksadesimal 3Ah, dituliskan ke dalam file menjai 33h (kode ASCIInya angka 3) dan 41h (kode ASCIInya huruf A). Dengan cara ini isi dari file tersebut bisa dengan mudah dibaca dengan program penyunting teks (text editor) biasa, bahkan bisa di-cetak di atas kertas seperti terlihat dalam Gambar 3, file semacam itu bisa dibaca dengan text editor biasa, misalnya EDIT.COM dalam DOS, atau NOTEPAD dalam Windows.

Dalam file format HEX semacam ini, selain disimpan data biner yang akan diisikan ke ROM, berisikan pula nomor-nomor memori tempat penyimpanan data biner tersebut. EPROM programer baru umumnya memakai format file obyek semacam ini.


Gambar 3
Program obyek format HEX

Format HEX dari Intel

Ada beberapa macam format untuk membentuk file program obyek dengan format HEX (Hexadecimal format object file), meskipun demikian hanya 2 yang banyak dipakai, yakni format buatan Motorola yang dinamakan sebagai format S19 dan format buatan Intel yang biasa disebut sebagai format HEX dari Intel.

Berikut ini adalah pembahasan file program obyek dengan format HEX dari Intel yang dipakai MCS51, format ini didefinisikan dalam artikel dari Intel dengan judul Hexadecimal Object File Format Specification (http://alds.stts.edu/appnote/#MCS51).



Gambar 4
Anatomi baris-baris dalam file format HEX

File program obyek dengan format HEX dari Intel berisikan baris-baris tulisan seperti terlihat dalam Gambar 4.

Setiap baris mengandung informasi tentang berapa banyak data dalam baris tersebut, alamat awal tempat penyimpanan data dalam baris tersebut, jenis baris dan sarana untuk memastikan kebenaran data yang dinamakan sebagai check sum. Dalam baris tersebut, setiap huruf (kecuali huruf pertama) mewakili satu bilangan heksa-desimal, dengan demikian setiap 2 huruf membentuk data satu byte yang terdiri dari 2 bilangan heksadesimal.

Rincian dari format tersebut sebagai berikut :

1. Huruf pertama dalam baris, selalu berisi tanda “:”, merupakan kode identitas yang menyatakan baris tersebut berisikan kode-kode biner yang disimpan dalam format HEX dari Intel.

2. Huruf ke-2 dan ke-3 dipakai untuk menyatakan banyaknya data dalam baris yang dinyatakan dengan 2 angka heksa-desimal, sehingga banyaknya data dalam 1 baris maksimal adalah 255 (atau heksa-demimal FF).

3. Huruf ke 4 sampai 7, merupakan 4 angka heksa-desimal yang dipakai untuk menyatakan alamat awal tempat penyimpanan kode-kode dalam baris teks bersangkutan.

4. Huruf 8 dan 9 dipakai untuk menyatakan jenis teks data. Nilai 00 dipakai untuk menyatakan baris tersebut berisikan data biasa, 01 menyatakan baris tersebut merupakan baris terakhir.

5. Huruf ke 10 dan seterusnya adalah data. Setiap 2 huruf mewakili data 1 byte, sehingga jumlah huruf pada bagian ini adalah dua kali banyaknya data yang disebut pada butir 2 di atas.

6. 2 huruf terakhir dalam baris merupakan check sum. Byte-byte yang disebut dalam butir 2 sampai 5 di atas dijumlahkan, hasil penjumlahan di-balik (inverted) sebagai bilangan check sum. (Hasil penjumlahan bisa menghasilkan nilai yang lebih besar dari 2 bilangan heksadesimal, namun hanya 2 bilangan heksa-desimal yang bobotnya terkecil yang dipakai).


Dasar Program Assembly

Bahasa Assembly adalah bahasa komputer yang kedudukannya di antara bahasa mesin dan bahasa level tinggi misalnya bahasa C atau Pascal. Bahasa C atau Pascal dikatakan sebagai bahasa level tinggi karena memakai kata-kata dan pernyataan yang mudah dimengerti manusia, meskipun masih jauh berbeda dengan bahasa manusia sesungguhnya. Bahasa mesin adalah kumpulan kode biner yang merupakan instruksi yang bisa dijalankan oleh komputer. Sedangkan bahasa Assembly memakai kode Mnemonic untuk menggantikan kode biner, agar lebih mudah diingat sehingga lebih memudahkan penulisan program.

Program yang ditulis dengan bahasa Assembly terdiri dari label; kode mnemonic dan lain sebagainya, pada umumnya dinamakan sebagai program sumber (Source Code) yang belum bisa diterima oleh prosesor untuk dijalankan sebagai program, tapi harus diterjemahkan dulu menjadi bahasa mesin dalam bentuk kode biner.

Program sumber dibuat dengan program editor biasa, misalnya Notepad pada Windows atau SideKick pada DOS, selanjutnya program sumber diterjemahkan ke bahasa mesin dengan menggunakan program Assembler. Hasil kerja program Assembler adalah “program objek” dan juga “assembly listing”.

Program Objek berisikan kode kode bahasa mesin, kode-kode bahasa mesin inilah yang diumpankan ke memori-program prosesor. Dalam dunia mikrokontroler biasanya program objek ini diisikan ke UV EPROM, dan khusus untuk mikrokontroler buatan Atmel, program ini diisikan ke dalam Flash PEROM yang ada di dalam chip AT89C51 atau AT89C2051.

Assembly Listing merupakan naskah yang berasal dari program sumber, dalam naskah tersebut pada bagian sebelah setiap baris dari program sumber diberi tambahan hasil terjemahan program Assembler. Tambahan tersebut berupa nomor memori-program berikut dengan kode yang akan diisikan pada memori-program bersangkutan. Naskah ini sangat berguna untuk dokumentasi dan sarana untuk menelusuri program yang ditulis.

Yang perlu diperhatikan adalah setiap prosesor mempunyai konstruksi yang berlainan, instruksi untuk mengendalikan masing-masing prosesor juga berlainan, dengan demikian bahasa Assembly untuk masing-masing prosesor juga berlainan, yang sama hanyalah pola dasar cara penulisan program Assembly saja.



Gambar 7
Proses Assembly

Konstruksi Program Assembly

Program sumber dalam bahasa Assembly menganut prinsip 1 baris untuk satu perintah, setiap baris perintah tersebut bisa terdiri atas beberapa bagian (field), yakni bagian Label, bagian mnemonic, bagian operand yang bisa lebih dari satu dan terakhir bagian komentar. Untuk membedakan masing-masing bagian tersebut dibuat ketentuan sebagian berikut:

o Masing-masing bagian dipisahkan dengan spasi atau TAB, khusus untuk operand yang lebih dari satu masing-masing operand dipisahkan dengan koma.

o Bagian-bagian tersebut tidak harus semuanya ada dalam sebuah baris, jika ada satu bagian yang tidak ada maka spasi atau TAB sebagai pemisah bagian tetap harus ditulis.

· Bagian Label ditulis mulai huruf pertama dari baris, jika baris bersangkutan tidak mengandung Label maka label tersebut digantikan dengan spasi atau TAB, yakni sebagai tanda pemisah antara bagian Label dan bagian mnemonic.

Label mewakili nomor memori-program dari instruksi pada baris bersangkutan, pada saat menulis instruksi JUMP, Label ini ditulis dalam bagian operand untuk menyatakan nomor memori-program yang dituju. Dengan demikian Label selalu mewakili nomor memori-program dan harus ditulis dibagian awal baris instruksi.

Disamping Label dikenal pula Symbol, yakni satu nama untuk mewakili satu nilai tertentu dan nilai yang diwakili bisa apa saja tidak harus nomor memori-program. Cara penulisan Symbol sama dengan cara penulisan Label, harus dimulai di huruf pertama dari baris instruksi.

Mnemonic (arttinya sesuatu yang memudahkan diingat) merupakan singkatan perintah, dikenal dua macam mnemonic, yakni manemonic yang dipakai sebagai instruksi mengendalikan prosesor, misalnya ADD, MOV, DJNZ dan lain sebagainya. Ada pula mnemonic yang dipakai untuk mengatur kerja dari program Assembler misalnya ORG, EQU atau DB, mnemonis untuk mengatur kerja dari program Assembler ini dinamakan sebagai ‘Assembler Directive’.

Operand adalah bagian yang letaknya di belakang bagian mnemonic, merupakan pelangkap bagi mnemonic. Kalau sebuah instrksi di-ibaratkan sebagai kalimat perintah, maka mnemonic merupakan subjek (kata kerja) dan operand merupakan objek (kata benda) dari kalimat perintah tersebut.

Tergantung pada jenis instruksinya, operand bisa berupa berbagai macam hal. Pada instruksi JUMP operand berupa Label yang mewakili nomor memori-program yang dituju misalnya LJMP Start, pada instruksi untuk pemindahan/pengolahan data, operand bisa berupa Symbol yang mewakili data tersebut, misalnya ADD A,#Offset. Banyak instruksi yang operandnya adalah register dari prosesor, misalnya MOV A,R1. Bahkan ada pula instruksi yang tidak mempunyai operand, misalnya RET.

Komentar merupakan bagian yang sekedar sebagai catatan, tidak berpengaruh pada prosesor juga tidak berpengaruh pada kerja program Assembler, tapi bagian ini sangat penting untuk keperluan dokumentasi.

Assembler Directive

Seperti sudah dibahas di atas, bagian Mnemonic dari sebuah baris perintah bisa merupakan instruksi untuk prosesor, maupun berupa Assembler Directive untuk mengatur kerja dari program Assembler. Mnemonic untuk instruksi prosesor, sangat tergantung pada prosesor yang dipakai, sedangkan mnemonic untuk Assembler Directive tergantung pada program Assembler yang dipakai. Meskipun demikian, terdapat beberapa Assembler Directive yang umum, yang sama untuk banyak macam program Assembler.

Assembler Directive yang bersifat umum tersebut, antara lain adalah

o ORG – singkatan dari ORIGIN, untuk menyatakan nomor memori yang dipakai setelah perintah itu, misalnya ORG $1000 maka memori berikutnya yang dipakai Assembler adalah $1000. ORG berlaku untuk memori program maupun memori-data. Dalam hal penomoran memori, dikenal tanda $ sebagai awalan untuk menyatakan nomor memori dari baris bersangkutan. Misalnya :

ORG 1000

LJMP $+1000

Operand $+$500 mempunyai arti nomor memori-program bersangkutan ditambah dengan $500, karena instruksi LJMP ini terletak persis di bawah ORG $1000 maka nomor memori-program baris ini adalah $1000, sehingga operand $+$500 bernilai $1500 dan instruksi ini indentik dengan LJMP $1500

o EQU – singkatan dari EQUATE, dipakai untuk menentukan nilai sebuah Symbol.

Misalnya Angka88 EQU 88 memberi nilai 88 pada Symbol Angka88, atau CR EQU $0D mempunyai makna kode ASCII dari CR (Caarriage Return) adalah $08.

o DB – singkatan dari DEFINE BYTE, dipakai untuk memberi nilai tertentu pada memori-program. Nilai tersebut merupakan nilai 1 byte, bisa berupa angka ataupun kode ASCII. DB merupakan Assembler Directive yang dipakai untuk membentuk teks maupun tabel.

ORG $0200

STRING DB ‘Atmel AT89C2051’

PANJANG EQU $-STRING

o ORG $0200 memerintahkan program Assembler agar bekerja mulai dari memori-program nomor $0200, instruksi selanjutnya memerintahkan program Assembler agar mengisi memori-program nomor $0200 dan berikutnya dengan tulisan ‘Atmel AT89C2051’’ (yang diisikan adalah kode ASCII dari ‘A’, ‘t’ dan seterusnya), PANJANG dari STRING bisa dihitung dengan cara PANJANG EQU $-STRING, yakni selisih dari nomor memori-program baris bersangkutan dikurangi dengan nomor awal memori-program yang diisi STRING.

o DW – singkatan dari DEFINE WORD, dipakai untuk memberi nilai 2 byte ke memori-program pada baris bersangkutan. Assembler Directive ini biasa dipakai untuk membentuk suatu tabel yang isinya adalah nomor-nomor memori-program.

o DS – singkatan dari Define Storage, Assembler Directive ini dipakai untuk membentuk variable. Sebagai variabel tentu saja memori yang dipakai adalah memori-data (RAM) bukan memori-program (ROM). Hal ini harus benar-benar dibedakan dengan Assembler Directive DB dan DW yang membentuk kode di memori-program. Dan karena DS bekerja di RAM, maka DS hanya sekedar menyediakan tempat di memori, tapi tidak mengisi nilai pada memori bersangkutan.

Oleh Budhy Sutanto


Jam Digital

Mungkin bagi sebagian pembaca Jam Digital merupakan hal yang sangat sederhana atau sudah terlalu umum, tapi dari Jam Digital bisa dipelajari prinsip-prinsip dasar kontrol dengan microcontroller, antara lain sistem tampilan 7 ruas dan pemakaian ti­mer.



Gambar 1
Jam Digital dengan AT89C2051

Rangkaian lengkap Jam Digital ini terlihat pada Gambar 1, dilengkapi 4 buah tampilan 7 ruas LED untuk menampilkan waktu, terdiri atas angka-angka puluhan jam, satuan jam, puluhan menit dan satuan menit. Tombol SW1 dan SW2 dipakai untuk mengatur tampilan waktu, saat SW1 ditekan angka pada tampilan jam akan bertambah setiap detik, sedangkan SW2 dipakai untuk mengatur angka tampilan menit dengan cara yang sama.

Kristal 12 MHz dan kapasitor C1 dan C2 membentuk rangkaian oscilator pembangkit frekuensi kerja AT89C2051, rangkaian ini merupakan rangkaian baku, artinya bentuk rangkaian oscilator ini selalu seperti ini untuk semua rangkaian AT89C51, kecuali untuk keperluan yang lain nilai kristalnya saja yang mungkin berbeda.

Kombinasi kapasitor C3 dan tahanan R8 juga merupakan rangkaian baku, komponen ini dipakai untuk membentuk rangkaian ‘power on reset’, artinya rangkaian yang akan otomatis me-reset AT89C2051 setiap kali AT89C2051 mulai menerima sumber daya listrik.

Melihat rangkaian pada Gambar 1, memang tidak bisa dijelaskan bagaimana Jam Digital ini bekerja, karena rangkaian itu hanyalah bagian tampilan dan tombol pengatur waktu waktu saja, ‘Jam’ yang sesungguh­nya berupa program yang disimpan di dalam ROM yang ada di dalam IC AT89C2051.

Sistem tampilan 7 ruas


Untuk menampilkan waktu dipakai 4 buah tampilan 7 ruas LED yang dibentuk dengan IC2 dan IC3 (masing-masing IC berisikan 2 tampilan angka), dengan demikian untuk menampilkan 4 buah angka diperlukan 28 LED, kalau ke-28 LED ini dinyala-padamkan dengan cara biasa, maka diperlukan 28 saklar dan rangkaian menjadi rumit sekali. Cara yang umum dipakai adalah sistem tampilan 7 ruas yang di-multiplek seperti nampak dalam Gambar 1, sedangkan Gambar 2 memperlihatkan detil sistem tampilan ini.



Gambar 2
Sistem Tampilan 7 Ruas

Setiap tampilan angka dibentuk dengan 7 buah LED (Light Emitting Diode), masing-masing diode itu ditandai sebagai ruas ‘a’ sampai dengan ‘g’, anode dari ketujuh LED itu sudah dihubungkan jadi satu di dalam IC. Katode ruas ‘a’ dari angka puluhan jam dihubungkan dengan katode ruas ‘a’ dari angka satuan jam dan seterusnya. Demikian pula dengan ruas ‘b’; ruas ‘c’ dan lain sebagainya.

Saklar Ruas P10..P16 dipakai untuk menentukan ruas mana yang akan dinyalakan, misalkan untuk membentuk angka 1 maka saklar P11 (ruas b) dan saklar P12 (ruas c) dalam posisi ‘on’. Sedangkan Skalar Digit dipakai untuk menentukan tampilan angka mana yang dipakai, misalkan angka 1 tadi ingin ditampilkan pada tampilan puluhan jam, maka posisi skalar pada Q1.

Jika posisi ‘on’ pada Saklar Digit digilir dari Q1, Q2, Q3 dan Q4 kemudian kembali ke Q1 dan seterusnya secara cepat, maka angka 1 di atas akan nampak pada semua tampilan angka!

Selanjutnya, andaikan sebelum merubah posisi Saklar Digit kombinasi Skalar Ruas diatur terlebih dulu, maka angka yang tertampil dalam sistem tampilan 7 ruas ini bisa diatur dengan tepat.

Dalam Gambar 1 terlihat Saklar Ruas dibentuk dengan kaki P1.0 sampai kaki P1.6 AT89C2051, sedangkan Saklar Digit dibentuk dengan sebuah transistor PNP dan sebuah tahanan yang masing-masing dikendalikan lewat kaki P3.0 sampai kaki P3.3.

Proses pengaturan sistem tampilan seperti yang dibahas diatas, diatur oleh AT89C2051 lewat potongan program yang biasanya dinamakan sebagai ScanDisplay seperti berikut :

1 ScanDisplay:

2 MOV P1,RuasJam10

3 MOV P3,#%11110111

4 ACALL TungguSebentar

5 ;

6 MOV P1,RuasJam1

7 MOV P3,#%11111011

8 ACALL TungguSebentar

9 ;

10 MOV P1,RuasMenit10

11 MOV P3,#%11111101

12 ACALL TungguSebentar

13 ;

14 MOV P1,RuasMenit1

15 MOV P3,#%11111110

16 ACALL TungguSebentar

17 SJMP ScanDisplay

Potongan program di atas bisa dijelaskan sebagai berikut : RuasJam10, RuasJam1, RuasMenit10 dan RuasMenit1 merupakan variabel tempat menampung kombinasi ruas dari angka yang akan ditampilkan, isi dari variabel ini akan dirubah dibagian lain dari program sesuai dengan perubahan waktu. Isi variabel–variabel ini diumpankan langsung ke Port 1 (baris 2, 6, 10 dan 14 pada potongan program di atas), untuk mengendalikan Saklar Ruas.

Saklar Digit dibentuk dengan transistor PNP, jadi untuk meng-on-kan diperlukan tegangan ‘0’ pada salah satu kaki Port 3, seperti terlihat pada baris 3, 7, 22 dan 15. Perhatikan posisi angka ‘0’ pada keempat baris itu, akan nampak ‘0’ tersebut ber-‘jalan’ dari kiri ke kanan yang setara dengan Saklar Digit bergilir ‘on’ dari Q1 sampai Q4.

TungguSebentar merupakan sub-rutin yang berfungsi untuk menunda waktu (delay), agar angka yang ditampilkan bisa tertahan sesaat sebelum berganti. Pada baris 17, aliran program di alihkan kembali ke baris 1, sehingga potongan program ini akan bekerja terus menerus tanpa henti menampilkan angka.

Jam Digital

Jam Digital dalam proyek ini, sesungguhnya hanya berupa program. Pada dasarnya Jam Digital adalah sistem pencacah (counter) bertingkat, dimulai dari pencacah menit yang mencacah dari 0 sampai 59 dan melimpah kembali ke 0, dan pencacah jam dari 0 sampai 23 yang mencacah setiap kali ada limpahan dari pencacah menit, hal ini bisa direalisasikan dengan program berikut:

1 JamDigital:

2 INC Menit

3 MOV A,Menit

4 CJNE A,#60,Keluar

5 MOV Menit,#0

6 INC JAM

7 MOV A,Jam

8 CJNE A,#24,Keluar

9 MOV Jam,#0

10 Keluar:

11 RET

Menit dan Jam pada potongan program ini, adalah variabel yang berfungsi sebagai pencacah menit dan pencacah jam. Sub-rutin JamDigital ini akan dijalankan setiap menit sekali, sehingga perubahan nilai pada variable Menit dan variable Jam persis mencerminkan perubahan waktu.



Interupsi Timer

Setelah membentuk sub-rutin JamDigital di atas, persoalan berikutnya adalah bagaimana agar sub-rutin itu benar-benar bisa dijalankan satu kali setiap menit, untuk keperluan ini dipakai fasilitas timer yang dimiliki AT89C2051.

Jam Digital yang dibuat selalu menjalankan program ScanDisplay terus menerus tanpa henti, dengan mengggunakan fasilitas interupsi dari timer, program ScanDisplay di atas dihentikan sebentar setiap 50 mili detik, pada saat itu AT89AT2051 menggerakan untaian pencacah 20 dan pencacah 60, pencacah 20 akan melimpah sekali per detik, dan pencacah 60 akan melimpah sekali per menit. Pada saat terjadi limpahan pencacah 60, AT89C2051 akan menjalankan sub-rutin JamDigital di atas.

1 TimerInterrupt:

2 MOV TL0,#-50000

3 MOV TH0,#>-50000/256

4 DJNZ Pencacah20,Terus

5 MOV Pencacah20,#20

6 DJNZ Pencacah60,Terus

7 MOV Pencacah60,#60

8 ACALL JamDigital

9 Terus:

10 RETI

Baris 2 dan 3 di atas yang mempertahankan agar AT89C2051 menjalankan rutin TimerInterrupt setiap 20 mili detik, baris 4 sampai 7 merupakan untaian pencacah 20 dan pencacah 60, saat pencacah 60 melimpah pada baris 8 AT89C2051 menjalankan sub-rutin JamDigital.

Agar mekanisme interupsi timer ini bisa bekerja seperti apa yang diharapkan, pada awal program ditambahkan potongan program berikut :

1 ANL TMOD,#%11110000

2 ORL TMOD,#000001

3 MOV TL0,#-50000

4 MOV TLH,#-50000/256

5 SETB ET0

6 SETB EA

7 SETB TR0

Baris 1 dan 2 menentukan mode kerja dari Timer 0, Baris 3 dan 4 yang menentukan agar AT89C2051 menjalankan rutin TimerInterrupt setiap 20 mili detik, baris 5 mengaktipkan interupsi Timer 0, baris 6 mengaktipkan sistem interupsi AT89C2051 dan baris 7 menjalankan Timer 0. Bagian ini kelak akan dijelaskan lebih mendetil dalam artikel tersendiri.


Special Function Register (SFR) AT89Cx051

Random Access Memory (RAM) dalam AT89Cx051 hanya 256 byte, hanya setengahnya yang dipakai sebagai memori-data biasa, setengahnya lagi dipakai untuk register-register untuk mengatur perilaku MCS51 dalam hal-hal khusus, misalnya tempat untuk berhubungan dengan port paralel P1 atau P3, dan sarana input/output lainnya, tapi tidak dipakai untuk menyimpan data seperti layaknya memori-data. Meskipun demikian, dalam hal penulisan program SFR diperlakukan persis sama dengan memori-data.

Nomor memori-data yang disediakan untuk Special Function Register mulai dari $80 sampai dengan $FF, area sebanyak 128 byte ini tidak semuanya dipakai, hal ini digambarkan dalam Denah Special Function Register, Gambar 5. Masing-masing register dalam Special Function Register mempunyai nomor dan nama.

Dianjurkan agar nomor-nomor yang tidak dipakai jangan dipergunakan, karena bisa mengakibatkan terjadinya sesuatu yang tidak terduga.

Sebagian register dalam Special Function Register sudah dibicarakan sebagai Register Dasar, merupakan piranti dasar untuk penulisan program. Register-register dasar tersebut antara lain adalah Akumulator (ACC), Stack Pointer Register (SP), Program Status Register (PSW), Register B, Data Pointer High Byte (DPH) dan Data Pointer Low Byte (DPL). Di dalam area Special Function Register. Register-register ini diperlakukan sebagai memori dengan nomor yang sudah tertentu.

Akumulator menempati memori-data nomor $E0, Stack Pointer Register menempati memori-data nomor $81, Program Status Register ada di $D0, Register B di $F0, DPL di $82 dan DPH di $83.

Kemampuan MCS51 untuk menomori memori-data dalam level bit, dipakai juga dalam Special Function Register. Secara keseluruhan nomor bit yang disediakan dalam MCS51 sebanyak 256, nomor bit 0 sampai 127 sudah dipakai untuk nomor bit memori-data nomor $20 sampai $2F, sisanya sebanyak 128 nomor dipakai di Special Function Register.

Special Function Register yang bisa dinomori dengan nomor bit, adalah yang mempunyai nomor memori dengan digit heksadesimal kedua adalah 0 atau 8, misalnya nomor $80, $88, $90, $98..$F0 dan $F8.

Akumulator merupakan Special Function Register dengan nomor $E0, sehingga semua bit dalam Akumulator bisa di-nomor-i satu per satu. Dalam penulisan program bit 0 Akumulator bisa dituliskan sebagai A.0, bit 1 Akumulator ditulis sebagai A.1 dan seterusnya. Instuksi SETB A.0 mengakibatkan bit 0 dari Akumulator menjadi ‘1’ sedangkan bit-bit lainnya tidak terpengaruh. Instruksi CLR A.6 mengakibatkan bit 6 dari Akumulator menjadi ‘0’ tapi tidak memengaruhi bit-bit yang lain.

Pengelompokan SFR

Selain register yang berfungsi sebagai register dasar yang sudah dibicarakan diatas, register-register dalam SFR dipakai untuk mengatur Input/Output dari MCS51 yang dikelompokan menjadi :

· Register Penampung Data Input/Output, misalnya data yang diisikan ke register P1 akan diteruskan (di-output-kan) ke Port 1 yang terdapat di kaki IC AT89Cx051.

· Register Pengatur Input/Output dan Register Status Input/Output, misalnya register SCON dipakai untuk mengatur UART dan dipakai untuk memantau kondisi UART, register TCON dipakai untuk mengatur kerja Timer.


Gambar 5
Denah Special Function Register

Uraian Singkat SFR

Berikut ini dibahas secara singkat fungsi dan sifat masing-masing register dalam Special Function Register, pembahasan secara rinci akan dilakukan dibagian lain.

P1 (Port 1, nomor $90, bisa dinomori dengan nomor bit): merupakan sarana input/output port 1, masing-masing bit dalam register ini setara dengan salah satu kaki IC AT89Cx051. Misalnya bit 3 dari register P1 terhubung ke kaki P1.3 (kaki nomor 15 AT89Cx051), instruksi SETB P1.3 mengakibatkan kaki nomor 15 tersebut menjadi ‘1’ dan instruksi CLR P1.3 akan membuatnya menjadi ‘0’.

P3 (Port 3, nomor $B0, bisa dinomori dengan nomor bit): merupakan sarana input/output port 3, masing-masing bit dalam register ini setara dengan salah satu kaki IC AT89Cx051. Misalnya bit 5 dari register P3 terhubung ke kaki P3.5 (kaki nomor 9 AT89Cx051), instruksi SETB P3.5 mengakibatkan kaki nomor 9 tersebut menjadi ‘1’ dan instruksi CLR P3.5 akan membuatnya menjadi ‘0’.

SBUF (Serial Buffer, nomor $99): Register Serial Buffer (SBUF) dipakai untuk mengirim data dan menerima data dengan UART yang terdapat dalam IC AT89Cx051. Angka yang disimpan ke SBUF akan dikirim keluar secara seri lewat kaki TXD (kaki nomor 3 IC AT89Cx051). Sebaliknya data seri yang diterima di kaki RXD (kaki nomor 2 IC AT89Cx051) bisa diambil di register SBUF. Jadi SBUF akan berfungsi sebagai port output pada saat register ini diisi data, dan SBUF akan menjadi port input kalau isinya diambil.

SCON (Serial Control, nomor $98, bisa dinomori dengan nomor bit): register SCON dipakai untuk mengatur perilaku UART di dalam IC AT89Cx051, hal-hal yang diatur meliputi penentuan kecepatan pengiriman data seri (baud rate); mengakitpkan fasilitas penerimaan data seri (fasilitas pengiriman data seri tidak perlu di atur), disamping itu register ini dipakai pula untuk memantau proses pengiriman data seri dan proses penerimaan data seri.

TL0/TH0 (Timer 0 Low/High, nomor $8A/$8C): Kedua register ini bersama membentuk Timer 0, yang merupakan pencacah naik (count up counter). Perilaku kedua register ini diatur oleh register TMOD dan register TCON. Hal-hal yang bisa diatur antara lain adalah sumber clock untuk pencacah, nilai awal pencacah, bilamana proses pencacahan mulai atau berhenti, dan lain sebagainya.

TL1/TH1 (Timer 1 Low/High, nomor $8B/$8D): Kedua register ini bersama membentuk Timer 1, yang merupakan pencacah naik (count up counter). Perilaku kedua register ini diatur oleh register TMOD dan register TCON. Hal-hal yang bisa diatur antara lain adalah sumber clock untuk pencacah, nilai awal pencacah, bilamana proses pencacahan mulai atau berhenti, dan lain sebagainya.

TMOD (Timer Mode, nomor $89): register TMOD dipakai untuk mengatur mode kerja Timer 0 dan Timer 1, lewat register ini masing-masing timer bisa diatur menjadi timer 16-bit, timer 13-bit, timer 8-bit yang bisa isi ulang secara otomatis, atau 2 buah timer 8 bit yang terpisah. Di samping itu bisa diatur agar proses proses pencacahan timer bisa dikendalikan lewat sinyal dari luar IC AT89Cx051, atau timer dipakai untuk mencacah sinyal-sinyal dari luar IC.

TCON (Timer Control, nomor $88, bisa dinomori dengan nomor bit): register TCON dipakai untuk memulai atau menghentikan proses pencacahan timer dan dipakai untuk memantau apakah terjadi limpahan dalam proses pencacahan. Disamping itu masih tersisa 4 bit dalam register TCON yang tidak dipakai untuk mengatur Timer, melainkan dipakai untuk mengatur sinyal interupsi yang diterima di INT0 (kaki nomor 6) atau INT1 (kaki nomor 7), dan dipakai untuk memantau apakah ada permintaan interupsi pada kedua kaki itu.

IE (Interrupt Enable, nomor $A8, bisa dinomori dengan nomor bit): register ini dipakai untuk mengaktipkan atau me-non-aktipkan sarana interupsi, bit 0 sampai bit 6 dari register IE (IE.0..IE.6) dipakai untuk mengatur masing-masing sumber interupsi (sesungguhnya IE.6 tidak dipakai) sedangkan IE.7 dipakai untuk mengatur sistem interupsi secara keseluruhan, jika IE.7 =’0’ akan sistem interupsi menjadi non-aktip tidak mempedulikan keadaan IE.0.. IE.6.

IP (Interrupt Priority, nomor $B8, bisa dinomori dengan nomor bit): register ini dipakai untuk mengatur perioritas dari masing-masing sumber interupsi. Masing-masing sumber interupsi bisa diberi perioritas tinggi dengan memberi nilai ‘1’ pada bit bersangkutan dalam register ini. Sumber interupsi yang perioritasnya tinggi bisa menginterupsi proses interupsi dari sumber interupsi yang perioritasnya lebih rendah.

PCON (Power Control, nomor $87): Register PCON dipakai untuk mengatur pemakaian daya IC AT89Cx051, dengan cara ‘menidurkan’ IC tersebut sehingga memerlukan arus kerja yang sangat kecil. Satu satu bit dalam register ini dipakai untuk menggandakan kecepatan pengiriman data seri (baud rate) dari UART di dalam AT89Cx051.

Variasi dari SFR

Seperti sering disebut, MCS51 merupakan satu keluarga IC mikrokontroler yang terdiri dari ratusan macam IC, ratusan macam IC tersebut umumnya mempunyai fasilitas input/output yang berlainan. Keragaman ini ditampung dalam Special Function Register.

Register baku dalam keluarga MCS51, ada yang tidak dimiliki oleh keluarga AT89Cx051, register-register tersebut antara lain adalah :

P0 (Port 0, nomor $80, bisa dinomori dengan nomor bit): merupakan sarana input/output port 0, masing-masing bit dalam register ini setara dengan salah satu kaki IC AT89C51. Sifat Port 0 mirip sekali dengan sifat Port 1 dan Port 3 milik AT89Cx051.

P2 (Port 2, nomor $A0, bisa dinomori dengan nomor bit): merupakan sarana input/output port 2, masing-masing bit dalam register ini setara dengan salah satu kaki IC AT89C51. Sifat Port 2 mirip sekali dengan sifat Port 1 dan Port 3 milik AT89Cx051

Kaki IC AT89Cx051 hanya 20, hanya setengah dari jumlah kaki AT89C51, berkurangnya kaki ini mengakibatkan AT89Cx051 tidak punya Port 0 dan Port 2 dan dengan demikian juga tidak punya register P0 dan register P2.

Di samping dipakai sebagai port input/output, Port 0 dan Port 2 bisa pula dipakai untuk saluran-data (data bus) dan saluran-alamat (address bus) yang diperlukan AT89C51 untuk bisa menambah memori diluar chip.



RAM dan Register dalam AT89Cx051

Bagi mereka yang sudah terbiasa memakai komputer, kapasitas Random Access Memory (RAM) yang dimiliki AT89Cx051 ‘mengerikan’ karena sangat sedikit, hanya 256 byte! Itupun tidak semuanya bisa dipakai sebagai memori penyimpan biasa, lebih dari setengahnya merupakan memori dengan keperluan khusus yang biasa dikenal sebagai register. Meskipun demikian bagi mikrokontroler kapasitas itu sudah mencukupi.

Dalam pengertian MCS51, Random Access Memory dalam chip AT89Cx051 adalah memori-data, yaitu memori yang dipakai untuk menyimpan data, sedangkan Flash PEROM merupakan memori penampung program pengendali AT89Cx051, dikenal sebagai memori-program.

Karena kedua memori itu memang dibedakan dengan tegas, maka kedua memori itu mempunyai penomoran yang terpisah. Memori-program dinomori sendiri, pada AT89C2051 mulai dari nomor $0000 sampai $07FF. Sedangkan memori-data yang hanya 256 byte dinomori dari nomor $00 sampai $FF.


Gambar 3
Denah Memori-data

Seperti terlihat dalam denah memori-data Gambar 3, memori-data dibagi menjadi dua bagian, memori nomor $00 sampai $7F merupakan memori seperti RAM selayaknya meskipun beberapa bagian mempunyai kegunaan khusus, sedangkan memori nomor $80 sampai $FF dipakai sangat khusus yang dinamakan sebagai Special Function Register (akan dibahas tersendiri dibagian lain).

Memori-data nomor $00 sampai $7F bisa dipakai sebagai memori penyimpan data biasa, dibagi menjadi 3 bagian:

· Memori nomor $00 sampai $18 selain sebagai memori-data biasa, bisa pula dipakai sebagai Register Serba Guna (General Purpose Register).

· Memori nomor $20 sampai $2F selain sebagai memori-data biasa, bisa dipakai untuk menyimpan informasi dalam level bit.

· Memori nomor $30 sampai $7F (sebanyak 80 byte) merupakan memori-data biasa, bisa dipakai untuk menyimpan data maupun dipakai sebagai Stack.

Register Serba Guna

Register Serba Guna (General Purpose Register) menempati memori-data nomor $00 sampai $18, memori sebanyak 32 byte ini dikelompokkan menjadi 4 Kelompok Register (Register Bank), 8 byte memori dari masing-masing Kelompok itu dikenali sebagai Register 0, Register 1 .. Register 7 (R0, R1, R2, R3, R4, R5, R6 dan R7).

Dalam penulisan program memori-memori ini bisa langsung disebut sebagai R0, R1, R2, R3, R4, R5, R6 dan R7, tidak lagi dengan nomor memori. Dengan cara ini instruksi yang terbentuk bisa lebih sederhana dan bekerja lebih cepat. Pengertian ini bisa diperjelas dengan contoh 2 instruksi berikut :

MOV A,$04

MOV A,R4

Instruksi pertama mempunyai makna isi memori-data nomor 4 di-copy-kan ke Akumulator A, sedangkan instruksi kedua artinya isi R4 di-copy-kan ke Akumulator A. Karena R4 menempati memori-data nomor 4, jadi kedua instruksi itu berakibat sama bagi Akumulator A.

Tapi saat diterjemahkan ke kode mesin, intruksi pertama dirubah menjadi E5 04 (heksadesimal) dan instruksi kedua menjadi E6 (heksadesimal), jadi instruksi kedua lebih sederhana dari instruksi pertama.

Selain itu, khusus untuk Register 0 dan Register 1 (R0 dan R1) masih punya mempunyai kemampuan lain, kedua register ini bisa dipakai sebagai register penampung alamat yang dipakai dalam penyebutan memori secara tidak langsung (indirect memori addressing), hal ini akan dibicarakan lebih lanjut di belakang.

Empat kelompok Register Serba Guna itu tidak bisa dipakai secara bersamaan, saat setelah reset yang aktip dipakai adalah Kelompok Register 0 (Register Bank 0).

Kalau yang diaktipkan adalah Kelompok Register 1, maka yang dianggap sebagai R0 bukan lagi memori-data nomor 0 melainkan memori-data nomor 8, demikian pula kalau yang diaktipkan Kelompok Register 3 maka memori-data nomor 18h yang menjadi R0.

Kelompok Register yang aktip dipilih dengan cara mengatur bit RS0 dan RS1 yang ada di dalam Register PSW (Program Status Word), hal ini akan dibicarakan lebih lanjut di bagian lain.

Memori level Bit

Memori-data nomor $20 sampai $2F bisa dipakai menampung informasi dalam level bit. Setiap byte memori di daerah ini bisa dipakai menampung 8 bit informasi yang masing-masing dinomori tersendiri, dengan demikian dari 16 byte memori yang ada bisa dipakai untuk menyimpan 128 bit (16 x 8 bit) yang dinomori dengan bit nomor $00 sampai $7F.

Informasi dalam level bit tersebut masing-masing bisa di-‘1’-kan, di - ‘0’-kan dengan instruksi.

Pengertian di atas bisa dipikirkan seolah-olah MCS51 mempunyai jenis memori yang lain, tapi sesungguhnya kedua jenis memori itu tetap sama, hanya saja cara penyebutannya saja yang berlainan.

Instruksi SETB $00 mengakibatkan memori-bit nomor 0 menjadi ‘1’, atau sama dengan membuat bit nomor 0 dari memori-data nomor $20 menjadi ‘1’, sedangkan bit-bit lainnya dalam memori nomor $20 tidak berubah nilai.

Sedangkan instruksi CLR $7F mengakibatkan memori-bit nomor $7F menjadi ‘0’, satau sama dengan membuat bit nomor 7 dari memori-data nomor $2F menjadi ‘0’, sedangkan bit-bit lainnya dalam memori nomor $2F tidak berubah nilai.

Pengertian ini dipertegas dengn intsruksi-instruksi berikut:

MOV $21,#$0F

Sama dengan hasil kerja instruksi-instruksi berikut :

SETB $08

SETB $09

SETB $0A

SETB $0B

CLR $0C

CLR $0D

CLR $0E

CLR $0F

Instruksi MOV $21,#$0F mempunyai makna mengisi memori-data nomor $21 dengan nilai $0F (atau bilangan biner 00001111), berarti mengisi memori-bit nomor $0F sampai $08 dengan bilangan biner 00001111 yang bisa dinyatakan dengan 8 baris instruksi berikutnya.

Special Function Register (SFR)

Register Khusus (SFR - Special Function Register) adalah satu daerah RAM dalam IC keluarga MCS51 yang dipakai untuk mengatur perilaku MCS51 dalam hal-hal khusus, misalnya tempat untuk berhubungan dengan port paralel P1 atau P3, dan sarana input/output lainnya, tapi tidak umum dipakai untuk menyimpan data seperti layaknya memori-data.

Meskipun demikian, dalam hal penulisan program SFR diperlakukan persis sama dengan memori-data. Untuk mengisi memori-data nomor $60 dengan bilangan $0F, instruksi yang dipergunakan adalah :

MOV $60,#$0F

Sedangkan untuk memenyimpan $0F ke Port 1 yang di SFR menempati memori-data nomor $90, instruksi yang dipergunakan adalah :

MOV $90,#$0F

Membandingkan kedua instruksi di atas bisa dimengerti dalam segi penulisan program SFR diperlakukan persis sama dengan memori-data.

Meskipun demikian, dalam menyebut memori-data bisa dipakai dua cara, yakni penyebutan nomor memori secara langsung (direct memory addressing) dan penyebutan nomor memori secara tidak langsung (indirect memory addressing) lewat bantuan R0 dan R1. Tapi untuk SFR hanya bisa dipakai penyebutan nomor memori secara langsung (direct memory addressing) saja. Hal ini akan dibahas lebih lanjut di bagian lain.

Register Dasar MCS51

Untuk keperluan penulisan program, setiap mikroprosesor/mikrokontroler selalu dilengkapi dengan Register Dasar. Ada beberapa macam register merupakan register baku yang bisa dijumpai disemua jenis mikroprosesor/ mikrokontroler, ada register yang spesifik pada masing-masing prosesor.

Yang termasuk Register Baku antara lain Program Counter, Akumulator, Stack Pointer Register, Program Status Register. MCS51 mempunyai semua register baku ini.

Sebagai register yang khas MCS51, antara lain adalah Register B, Data Pointer High Byte dan Data Pointer Low Byte. Semua ini digambarkan dalam Gambar 4.

Di samping itu MCS51 masih mempunyai Register Serba Guna R0..R7 yang sudah disebut dibagian atas.

Dalam mikroprosesor/mikrokontroler yang lain, register-register dasar biasanya ditempatkan ditempat ter­sendiri dalam inti prosesor, tapi dalam MCS51 register-register itu ditempatkan secara terpisah.

· Program Counter ditempatkan ditempat tersendiri di dalam inti prosesor

· Register Serba Guna R0..R7 ditempatkan di salah satu bagian dari memori-data

· Register lainnya ditempatkan dalam Special Function Register (SFR).



Gambar 4
Susunan Register Dasar MCS51

Kegunaan dan pemakaian register-register dasar tersebut antara lain sebagai berikut:

Program Counter

Program Counter (PC) dalam AT89C2051 merupakan register dengan kapasitas 11 bit (dalam AT89C51 atau keluarga MCS51 lainnya kapasitas PC adalah 16 bit). Di dalam PC dicatat nomor memori-program yang menyimpan instruksi berikutnya yang akan diambil (fetch) sebagai instruksi untuk dikerjakan (execute).

Saat setelah reset PC bernilai 0000h, berarti MCS51 akan segera mengambil isi memori-program nomor 0 sebagai instruksi. Nilai PC otomatis bertambah 1 setelah prosesor mengambil instruksi 1 byte. Ada instruksi yang hanya 1 byte, ada instruksi yang sampai 4 byte, dengan demikian pertambahan nilai PC setelah menjalankan instruksi, tergantung pada jumlah byte instruksi bersangkutan.

Akumulator

Sesuai dengan namanya, Akumulator adalah sebuah register yang berfungsi untuk menampung (accumulate) hasil hasil pengolahan data dari banyak instruksi MCS51. Akumulator bisa menampung data 8 bit (1 byte) dan merupakan register yang paling banyak kegunaannya, lebih dari setengah instruksi-instruksi MCS51 melibatkan Akumulator.

Instruksi-instruksi berikut memperjelas pengertian di atas :

MOV A,#$20

ADD A,#$30

Instruksi pertama menyimpan nilai $20 ke Akumulator, instruksi kedua menambahkan bilangan $30 ke Akumulator, hasil penjumlahan sebesar $50 ditampung di Akumulator.

Stack Pointer Register

Salah satu bagian dari memori-data dipakai sebagai Stack, yaitu tempat yang dipakai untuk menyimpan sementara nilai PC sebelum prosesor menjalankan sub-rutin, nilai tersebut akan diambil kembali dari Stack dan dikembalikan ke PC saat prosesor selesai menjalankan sub-rutin.

Stack Pointer Register adalah register yang berfungsi untuk mengatur kerja stack, dalam Stack Pointer Register disimpan nomor memori-data yang dipakai untuk operasi Stack berikutnya.

Program Status Word

Program Status Word (PSW) berfungsi mencatat kondisi prosesor setelah melaksanakan instruksi. Pembahasan tentang PSW secara rinci akan dilakukan dibagian lain.

Register B

Merupakan register dengan kapasitas 8 bit, merupakan register pembantu Akumulator saat menjalankan instruk perkalian dan pembagian.

DPH dan DPL

Data Pointer High Byte (DPH) dan Data Pointer Low Byte (DPL) masing-masing merupakan register dengan kapasitas 8 bit, tapi dalam pemakaiannya kedua register ini digabungkan menjadi satu register 16 bit yang dinamakan sebagai Data Pointer Register (DPTR).

Sesuai dengan namanya, Register ini dipakai untuk mengalamati data dalam jangkauan yang luas.


Pengetahuan Dasar Mikrokontroller AT89Cx051

Meskipun termasuk tua, keluarga Mikrokontroler MCS51 adalah Mikrokontroler yang paling populer saat ini. Keluarga ini diawali oleh Intel yang mengenalkan IC Mikrokontroler type 8051 pada awal tahun 1980-an, 8051 termasuk sederhana dan harganya murah sehingga banyak digemari, banyak pabrik IC besar lain yang ikut memproduksnya, tentu saja masing-masing pabrik menambahkan kemampuan pada mikrokontroler buatannya meskipun semuanya masih dibuat berdasarkan 8051. Sampai kini sudah ada lebih 100 macam mikrokontroler turunan 8051, sehingga terbentuklah sebuah ‘keluarga besar mikrokontroler’ dan biasa disebut sebagai MCS51.

Belakangan ini, pabrik IC Atmel ikut menambah anggota keluarga MCS51. Atmel merupakan pabrik IC yang sangat menguasai teknologi pembuatan Flash PEROM, jadi sudah selayaknya kalau Atmel memasukkan Flash PEROM ke dalam mikrokontroler buatannya. Usaha Atmel ini ternyatakan bagaikan menambah ‘darah’ baru bagi keluarga MCS51, dengan adanya Flash PEROM yang harganya murah maka tercapailah angan-angan banyak orang untuk membuat alat berbasis mikrokontroler yang sesederhana mungkin dan semurah mungkin.

Produksi mikrokontroler MCS51 Atmel dibagi dua macam, yang berkaki 40 setara dengan 8051 yang asli, bedanya mikrokontroler Atmel berisikan Flash PEROM dengan kapasitas berlainan. AT89C51 mempunyai Flash PEROM dengan kapasitas 2 Kilo Byte, AT89C52 4 Kilo Byte, AT89C53 12 Kilo Byte, AT89C55 20 Kilo Byte dan AT89C8252 berisikan 8 Kilo Byte Flash PEROM dan 2 Kilo Byte EEPROM.

Yang berkaki 20 adalah MCS51 yang disederhanakan, penyederhanaan dilakukan dengan cara mengurangi jalur untuk input/output paralel, kemampuan yang lain sama sekali tidak mengalami pengurangan. Penederhanaan ini dimaksudkan untuk membentuk mikrokontroler yang bentuk fisiknya sekecil mungkin tapi mempunyai kemampuan sama. Atmel memproduksi 3 buah mikrokontroler ‘mini’ ini, masing-masing adalah AT89C1051 dengan kapasitas Flash PEROM 1 Kilo Byte, AT89C2051 2 Kilo Byte dan AT89C4051 4 Kilo Byte. Ketiga mikrokontroler ini secara umum disebut sebagai AT89Cx051.


Gambar 1
Susunan kaki AT89Cx051 dan kontruksi dalam chip

Konstruksi AT89Cx051

Gambar 1 memperlihatkan susunan kaki AT89C2051, susunan kaki ini sama persis dengan AT89C1051 dan AT89C4051. Demikian pula ketiga IC mempunyai konstruksi di dalam chip yang sama persis, perbedaannya hanya terletak pada kapasitas Flash PEROM.

IC AT89Cx051 hanya memerlukan tambahan 3 kapasitor, 1 resistor dan 1 Xtal serta catu daya 5 Volt. Kapasitor 10 mikro-Farad dan resistor 10 Kilo Ohm dipakai untuk membentuk rangkaian reset, dengan adanya rangkaian reset ini AT89Cx051 otomatis di-reset begitu rangkaian menerima catu daya. Xtal dengan frekuensi maksimum 24 MHz dan 2 kapasitor 30 pico-Farad dipakai untuk melengkapi rangkaian oscilator pembentuk clock yang menentukan kecepatan kerja mikrokontroler.

Memori merupakan bagian yang sangat penting bagi mikrokontroler, diperlukan 2 macam memori yang sifatnya berbeda.

Read Only Memory (ROM) yang isinya tidak berubah meskipun IC kehilangan catu daya, dipakai untuk menyimpan program, begitu di-reset mikrokontroler akan langsung bekerja dengan program dalam ROM tersebut. Sesuai dengan keperluannya, dalam susunan MCS51 memori penyimpan program ini dinamakan sebagai MEMORI PROGRAM.

Random Access Memory (RAM) isinya akan sirna begitu IC kehilangan catu daya, dipakai untuk menyimpan data pada saat program bekerja. Di samping untuk data, RAM dipakai pula untuk Stack. RAM yang dipakai untuk menyimpan data ini disebut pula sebagai MEMORI DATA.

Ada berbagai jenis ROM. Untuk mikrokontroler dengan program yang sudah baku dan diproduksi secara massal, program diisikan ke dalam ROM pada saat IC mikrokontroler dicetak di pabrik IC. Untuk keperluan yang jumlahnya tidak banyak biasanya tidak dipakai ROM, tapi dipakai ROM yang bisa di-isi-ulang atau Programable-Eraseable ROM (disingkat menjadi PEROM atau PROM). Dulu banyak dipakai UV-EPROM (Ultra Violet Eraseable Programable ROM) yang kemudian dinilai mahal harganya dan ditinggalkan setelah ada Flash PEROM yang harganya jauh lebih murah.

Jenis memori yang dipakai untuk Memori Program AT89Cx051 adalah Flash PEROM, program untuk mengendalikan mikrokontroler diisikan ke memori itu lewat bantuan alat yang dinamakan sebagai AT89Cx051 Flash PEROM Programmer.

Memori Data yang disediakan dalam chip AT89Cx051 sebesar 128 byte, meskipun hanya kecil saja tapi untuk banyak keperluan memori kapasitas itusudah mencukupi.

Sarana Input/Output yang disediakan cukup banyak dan bervariasi. AT89Cx051 mempunyai 17 jalur Input/Output paralel. Jalur Input/Output paralel ini dikenal sebagai Port 1 (P1.0..P1.7) dan Port 3 (P3.0..P3.5 dan P3.7).

AT89Cx051 dilengkapi UART (Universal Asynchronous Receiver/Transmiter) yang biasa dipakai untuk komunikasi data secara seri. Jalur untuk komunikasi data seri (RXD dan TXD) diletakan berhimpitan dengan P1.0 dan P1.1 di kaki nomor 2 dan 3, sehingga kalau sarana UART ini dipakai maka P1.0 dan P1.1 tidak lagi bisa dipakai untuk jalur input/output paralel.

Timer 0 dan Timer 1 masing-masing adalah untaian pencacah biner 16 bit (16 bit binary counter) di dalam chip yang dipakai sebagai sarana input/output yang bekerja menurut fungsi waktu. Clock penggerak untaian pencacah ini bisa berasal dari oscilator kristal atau clock yang diumpan dari luar lewat T0 dan T1. T0 dan T1 berhimpitan dengan P3.4 dan P3.5, sehingga P3.4 dan P3.5 tidak bisa dipakai untuk jalur input/output paralel kalau T0 dan T1 dipakai.

AT89Cx051 mempunyai 5 sumber pembangkit interupsi, 2 diantaranya adalah sinyal interupsi yang diumpankan ke kaki INT0 dan INT1, kedua kaki ini berhimpitan dengan P3.2 dan P3.3 sehingga tidak bisa dipakai sebagai jalur input/output paralel kalau INT0 dan INT1 dipakai untuk menerima sinyal interupsi.

3 sumber interupsi yang lain berasal dan sarana komunikasi data seri dan dari sistem Timer 0 dan Timer 1.

Port 1, Port 2, UART, Timer 0, Timer 1 dan sarana lainnya merupakan register yang secara fisik merupakan RAM khusus, yang ditempatkan di Special Function Register (SFR).

Dasar kerja program

Program untuk mengendalikan kerja dari mikrokontroler disimpan di dalam memori program. Program pengendali tersebut merupakan kumpulan dari instruksi kerja mikrokontroler, 1 instruksi MCS51 merupakan kode yang panjangnya bisa satu sampai empat byte.

Sepanjang mikrokontroler bekerja, instruksi tersebut byte demi byte diambil ke CPU dan selanjutnya dipakai untuk mengatur kerja mikrokontroler. Proses pengambilan instruksi dari memori program dikatakan sebagai ‘fetch cycles’ dan saat-saat CPU melaksanakan instruksi disebuat sebagai ‘execute cycles’.

Semua mikrokontroler maupun mikroprosesor dilengkapi sebuah register yang berfungsi khsus untuk mengatur ‘fetch cycles’, register tersebut dinamakan sebagai Program Counter. Nilai Program Counter secara otomatis bertambah satu setiap kali selesai mengambil 1 byte isi memori program, dengan demikian isi memori program bisa berurutan diumpankan ke CPU.

Saat MCS51 di-reset, isi Program Counter di-reset menjadi 0000. Artinya sesaat setelah reset isi dari memori program nomor 0 dan seterusnya akan diambil ke CPU dan diperlakukan sebagai instruksi yang akan mengatur kerja mikrokontroler. Dengan demikian, awal dari program pengendali MCS51 harus ditempatkan di memori nomor 0, setelah reset MCS51 menjalankan program mulai dari memori-program nomor 0000, dengan melakukan proses ‘fetch cycles’ dan ‘execute cycles’ terus menerus tanpa henti.

Jika sarana interupsi diaktipkan, dan tegangan di kaki INT0 (kaki nomor 6) merubah dari ‘1’ menjadi ‘0’, maka proses menjalankan program di atas akan dihentikan sebentar, mikrokontroler melayani dulu permintaan interupsi, selesai melayani permintaan interupsi CPU akan melanjutkan mengerjakan program utama lagi.

Untuk melaksanakan hal tersebut, pertama-tama CPU menyimpan nilai Program Counter ke Stack (Stack merupakan satu bagian kecil dari data memori – RAM), kemudian mengganti isi Program Counter dengan 0003. Artinya MCS51 akan melaksanakan program yang ditempatkan di memori program mulai byte ke 3 untuk melayani interupsi yang diterima dari kaki INT0. Adalah tugas programer untuk mengatur agar program yang dipakai untuk melayani interupsi lewat INT0 diletakkan disitu.

Selesai melayani interupsi, nilai Program Counter yang tadi disimpan ke dalam Stack akan dikembalikan ke Program Counter, dengan demikian CPU bisa melanjutkan pekerjaan di program Utama.

Selain INT0, AT89Cx051 bisa menerima interupsi dari INT1, dari UART dan dari Timer. Agar permintaan interupsi itu bisa dilayani dengan program yang berlainan, maka masing-masing sumber interupsi itu mempunyai nomor awal program untuk layanan interupsi yang berlainan. Nomor-nomor awal tersebut digambarkan dalam Gambar 2.


Gambar 2
Peta Memori Program



DAC dan Keypad


Board rangkaian Keypad dan DAC

Gambar Skematik rangkaian Keypad dan DAC

ADC dan Serial Com

Gambar Board rangkaian ADC dan Serial Komunikasi


Gambar Skematik rangkaian ADC dan Serial Komunikasi


Make Blok LCD and Printer Board


Sebenarnya blok ini terserah kamu mau jadikan satu atau sendiri-sendiri.

Design rangkain yang bagus akan membuat efisiensi dan mengurangi ruwetnya kabel pada board blok. Tapi bila dibuat per-blok akan lebih mudah bagi kita untuk menganalisa dan memperbaiki apabila ada kesalahan.

Di sini adalah blok tampilan LCD dan koneksi LPT ke port printer.



Gambar Skematik rangkaian LCD Character dan Koneksi ke LPT

Make target mikrokontroller

Target = rumahnya mikrokontroller.



Ini hanya rangkaian dasar target, rangkaiannya bisa kamu modifikasi sesuai dengan port yang kamu pakai dan schematic rangkaian yang kamu rancang.



Gambar Skematik Rangkaian Target Mikrokontroler 89s51



Tidak ada komentar:

Posting Komentar