
BAHASA ASEMBLY MCS51
Sebuah mikrokontroller tidak akan bekerja
bila tidak diberikan program kepadanya. Program tersebut
memberitahukan mikrokontroller apa yang harus dia lakukan.
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.
KONSTRUKSI PROGRAM ASSEMBLY
Bentuk umum semua instruksi dalam assembler MCS51 Intel
dapat ditulis sebagai berikut:
[label:]
Mnemonik [operand][,operand][,operand]
1.
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.
2.
Mnemonic (artinya
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’.
3.
Operand,
yaitu 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.
4.
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.
SIMBOL ASSEMBLER KHUSUS
Assembler telah menyediakan beberapa simbol untuk menunjukkan
register-register tertentu sebagai operand. Simbol assembler
khusu tersebut adalah :
Simbol Khusus
|
Arti
|
A
R0-R7
DPTR
PC
C
AB
|
Akumulator
Register serbaguna
Data pointer, register 16 bit
Program Counter
Carry Flag
Akumulator/register B
|
PENYEBUTAN DATA DALAM MCS51
Data
bisa berada diberbagai tempat yang berlainan, dengan demikian
dikenal beberapa cara untuk menyebut data ( ‘Addressing
Mode’), antara lain sebagai berikut:
1.
Pengalamatan Tak Langsung
Operand
pengalamatan tak langsung menunjuk ke sebuah register yang
berisi lokasi alamat memori yang akan digunakan dalam operasi.
untuk melaksanakan engalamatan tak langsung digunakan simbol
@.
contoh
:
ADD
A,@R0 ;Tambahkan
isi RAM yang lokasinya ditunjukan olehregister R0 ke akumulator
DEC
@R1
;Kurangi
satu isi RAM yang alamatnya ditunjukan oleh register R1
MOVX
@DPT,A ;Pidahkan
isi dari akumulator ke momori luar yang lokasinya ditunjukan
oleh data pointer (DPTR)
2.
Pengalamatan Langsung
Pengalamatan
langsung dilakukan dengan memberikan nilai ke suatu register
secara langsug. untuk melaksanakan hal tersebut digunakan
tanda #.
conttoh:
MOV
A,#01H ;Isi
akumuator dengan bilangan 01H
MOV
DPTR,19AH ;Isi
register DPTR dengan bilangan 19AH
3.
Pengalamatan Bit
Pengalamatan
Bit adalah penunjukan alamat lokasi bit .Untuk melaksanakan
pengalamatan bit dilakukan dengan tanda titik (.).
Contoh;
SETB
TR1 ;
Set TR1
(logika 1 pada TR1)
SETB
P1.0 ; Logika
1 pada P1.0
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 AT8951. 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
INSTRUKSI JUMP
Instruksi ini mengubah urautan normal pelaksanaan suatu
program. Dengan instruksi ini program yang sedang dilaksanakan
akan mencabang ke suatu alamat tertentu.
Jump adalah mnemonik untuk instruksi jump (lompat),
yang memberitahukan mikrokontroller untuk mengambil instruksi
berikutnya dari lokasi memori yang telah ditunjuk alamatnya
2000H
-----------
-----------
-----------
2005H
Jump 3000H
2006H
----------
----------
:
:
3000H
----------
----------
Mikrokontroler 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
bisa menjangkau semua memori-program MCS51 yang jumlahnya
64 KiloByte. Instruksi AJMP menjangkau satu daerah memori-program
MCS51 sejauh 2 KiloByte, sedangakan instruksi SJMP
dapat menjangkau
jarak antara instruksi itu dengan
LABEL
DaerahLain
asal tidak lebih dari 127 byte
INSTRUKSI CALL
Call adalah mnemonik untuk instruksi “call the subroutine”
(panggil subrutin). Setiap instruksi call harus diikuti
label yang berisi alamat tertentu dari sub rutin yang dikehendaki.
Misalnya jika ada subrutin akar kuadarat dengan label program
akar, maka eksekusi dari instruksi :
CALL Akar
akan menyebabkan lompatan ke sub rutin akar kuadrat.
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 mikrokontroler
MCS51 sebanyak 64 KiloByte.
Pada setiap subrutin yang siap dipanggil selalu diakhiri
dengan mnemonik
RET. RET
adalah mnemonik untuk instruksi “return” (kembali).
Ini memberitahukan Program Counter untuk kembali ke progam
semula yang telah ditinggalkan.
------------
------------
CALL Akar
------------
-----------
:
:
Akar:
------------
------------
-----------
RET
TIMER
Pada kontrol internal, timer dihidup matikan dengan men-set
TR) (kontrol software). Pada kntrol eksternal, timer dihidup
matikan dengan memberikan logika 0 pada pena INT0 atau INT1.
Berikut adalah tabel pengaturan Timer Mode (TMOD)
yang akan bermanfaat pada saat pembuatan program dengan
memanfaatkan fasilitaas Timer/Counter MCS51.
Sebagai Timer
Mode
|
Fungsi TIMER 0
|
Kontrol internal
|
Kontrol Eksternal
|
0
1
2
3
|
13 bit timer
16 bit timer
8 bit auto reload
Dua bit timer
|
00H
01H
02H
03H
|
08H
09H
0AH
0BH
|
Mode
|
Fungsi TIMER 1
|
Kontrol internal
|
Kontrol Eksternal
|
0
1
2
3
|
13 bit timer
16 bit timer
8 bit auto reload
-
|
00H
10H
20H
30H
|
80H
90H
A0H
B0H
|
Sebagai Counter
Mode
|
Fungsi
COUNTER 0
|
Kontrol internal
|
Kontrol Eksternal
|
0
1
2
3
|
13 bit timer
16 bit timer
8 bit auto reload
Satu bit timer
|
04H
05H
06H
07H
|
0CH
0DH
0EH
0FH
|
Mode
|
Fungsi
COUNTER 1
|
Kontrol internal
|
Kontrol Eksternal
|
0
1
2
|
13 bit timer
16 bit timer
8 bit auto reload
|
40H
50H
60H
|
C0H
D0H
E0H
|
Salah satu penggunaan fasilitas Timer adalah untuk pembangkitan
waktu tuda
dan pembangkitan frekuesni.
Program di atas bisa pula dibuat dengan memakai Timer
1 sebagai pengatur waktu tunda sebagai berikut :
01:
MOV TMOD,#%00100000 ; 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 $F6 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,
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. 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.
INTERUPSI
Apabila mikrokontroller sedang melaksanakan suatu program
kita bisa menghentikan pelaksanaan program tersebut secara
sementara dengan meminta interupsi. Apabila mikrokotroller
mendapat permintaan interupsi, program counter akan diisi
alamat dari vektor inteerupsi. Mikrokontroller kemudian
melaksanakan rutin pelayanan interupsi mulai dari alamat
terseut. Bila rutin pelayanan interupsi selesai dilakukan,
mikrokontroller kembali ke pelaksanaan program utama yang
ditinggalkan.
Contoh Program:
gelobang persegi menggunakan Timer Interupts
timer interupt dapat terjadi apabila timer register (TL1/TH1)
melimpah dan men-set berdera limphan (TFx)
ORG
0
LJMP MAIN
ORG 000BH ; VEKTRO INTERUPSI
TIMER 0
T0ISR: CPL P1.0 ;BALIK LOGIKA P1.0
RETI ; KEMBALI
MAIN: MOV TMOD,#02H
;TIMER 0 MODE 2
MOV TH0,#-50
SETB TR0 ; START TIMER
MOV IE,#82 ; AKTIFKAN TIMER
0 INTERUPSI
SJMP $ ; TIDAK MENGERJAKAN APA-APA
END
Setelah terjadi reset program counter menuju alamat 00H.
Eksekusi pertama yangdilakukan adalah melompat ke label
main. instruksi selanjutnya adalahmenginisialisasi timer
0 dengan mode 2 yatu 8 bit auto reload. pengisian TH0 dengankonstanta
-50 berarti akan mengeset limphan setiap 50 mikro detik.
Instruksi MOV IE,82H adalah untuk mengaktifkan sumber interupsi
Timer 0. Sehingga setiap teradi limpahan maka akan terjadi
permintaan interupsi. Permintaan interupsi dalam program
diatas terjadi setiap 50 mikro detik. Rutin pelayanan interupsi
adalah membalikan logika P1.0. Sehingga terbentuklah suatu
gelombang perrsegi dengan perioda sebesar 50 mikro detik.
|