pertanyaan yang bikin penasaran..oke
kali ini saya akan mencoba menyimpulkan sedikit tentang "CALL DELAY"
pada bahasa pemograman tingkat rendah/assembly yang berkaitan dengan
mikrokontroller.
apa itu call delay dan mengapa call
delay ini dibutuhkan pada code assembly.
Instruksi mesin dinyatakan dengan
pola 0 dan l. Pola semacam itu sangat sulit untuk dijelaskan pada saat membahas
atau menyiapkan program. Oleh karena itu, kita menggunakan nama simbolik untuk
menyatakan pola tersebut. Sejauh ini kita telah menggunakan kata-kata biasa
seperti Move, Add, Increment, dan Branch, untuk instruksi operasi yang
menyatakan pola kode biner yang sesuai. Pada saat menulis program untuk
komputer tertentu, katakata tersebut biasanya diganti dengan akronim yang
disebut mnemonic, seperti MOV, ADD, INC, dan BR Serupa dengan kita menggunakan
notasi R3 untuk mengacu pada register 3, dan LOC untuk mengacu pada lokasi
memori. Set lengkap nama simbolik semacam dan aturan penggunaannya membentuk
bahasa pemrograman, yang biasanya disebut sebagai bahasa assembly. Set aturan
untuk menggunakan mnemonic dalam spesifikasi instruksi dan program lengkap
disebut syntax bahasa.
Program yang ditulis dalam bahasa
assembly dapat secara otomatis ditranslasikan ke rangkaian instruksi mesin oleh
suatu program yang disebut assembler. Program assembler adalah salah satu
kumpulan program yang merupakan bagian dari software sistem. Assembler, seperti
halnya program yang lain, disimpan sebagai rangkaian instruksi mesin dalam
memori komputer. Program user biasanya dimasukkan ke dalam komputer melalui
keyboard dan disimpan dalam memori atau disk magnetik. Pada titik ini, program
user hanyalah kumpulan baris karakter alfanumerik. Pada saat program assembler
dieksekusi, program tersebut membaca program user, menganalisanya, dan kemudian
menghasilkan program bahasa mesin yang diinginkan. Bahasa mesin tersebut berisi
pola 0 dan 1 yang menetapkan instruksi yang akan dieksekusi oleh komputer
tersebut. Program user dalam format teks alfanumerik aslinya disebut source
program, dan program bahasa mesin yang diassemble disebut object program.
Bahasa assembly untuk suatu komputer
mungkin case sensitive atau mungkin tidak, sehingga, komputer tersebut bisa
membedakan antara huruf kapital dan huruf kecil atau tidak dapat
Kita akan menggunakan huruf
kapital mark menunjukkan semua nama dan label dalam contoh kita untuk dapat
meningkatkan kemudahan pembacaan teks. Misalnya, kita akan menuliskan instruksi
Move sebagai berikut MOVE R0, SUM MOVE mnemonic menyatakan pola biner, atau OP
code, untuk operasi yang dilakukan oleh instruksi tersebut. Assembler
mentranslasi rnnemonic ini menjadi OP code biner yang dipahatni komputer.
Mnemonic OP code diikuti oleh setidaknya satu karakter spasi kosong. Kemudian
informasi yang menyatakan operand ditetapkan. Dalam contoh kita, source operand
berada dalam register R0. Informasi ini diikuti oleh spesifikasi destination
operand, dipisah dari source operand dengan koma, tanpa jeda kosong.
Secara harfiah dari gambar diatas
kita dapat mengartikan call delay sebagai panggilan tunda.kenapa panggilan
tunda ini dibutuhkan pada contoh program ini ? karena menurut saya program
membutuhkan rentang waktu untuk memanggil kembali program yang akan dijalan kan
setelahnya.
Setelah menjalankan program
pertama,dengan mencari informasi kembali ke processor dan membongkar isi
memory,prosessor membutuhkan rentang waktu untuk mengolah perintah kedua dan
kembali melakukan perintah kembali ke memori maka dariitu dibutuhkan syntak
fungsi callmemanggil fungdi delay/penundaan yang terkait dengan fungsi timer.
Dari gambar kedua,kita kembali
mendapat penjelasan tentang fungsi waktu tunda,dari sumber e-book yang saya
dapat secara jelas dituliskan bahwa fungsi ini disediakan untuk menangani
berbagai hal dengan cara pemanggilan fungsi-fungsi yang telah dideklarasikan
didalam file tersebut.
Jadi secara tidak langsung syntak
ini memang sudah dipersiapkan untuk nantinya membantu jika dalam pembuatan
program terdapat kendala-kendala seperti pemanggilan ulang program atau
pengoperasian 2 program berurut secara langsung dan memberikan rentang waktu
bagi prosesor untuk mengolah program tersebut.
Dan dari sumber yang ketiga ini
lebih memperjelas lagi tentang kegunaan dari CALL DELAY. Dibicarakan pada pembahasan tentang LCALL atau long call.
“Ini adalah instruksi 3-byte. Byte
pertama adalah opcode, sedang 2-byte lainnya adalah alamat 16-bit yang dituju.
Saat instruksi LCALL ini dijalankan, CPU tidak lagi mengeksekusi instruksi-instruksi
di bawah LCALL, namun segera melompat pada alamat yang dituju. Namun berbeda
dengan LJMP yang hanya melompat begitu saja. Sementara itu LCALL digunakan
untuk menjalankan blok rutin di tempat lain sampai selasai, dan kemudian
kembali menjalankan instruksi-instruksi dibawah instruksi LCALL tadi, yang
sempat ditinggalkannya.
Setelah LCALL dieksekusi, dan CPU
hendak melompat ke alamat yang dituju, sebelumnya CPU akan menyimpan alamat
kode dari instruksi yang letaknnya persis di bawah LCALL tersebut, ke dalam
stack memory. Dan kemudian CPU akan mengeksekusi blok rutin yang dipangggil
sampai selesai, yakni dijalankannya instruksi RET (return) yang menandakan
akhir dari subrutin. Ingat setiap subrutin selalu diakhiri oleh instruksi RET.
Kemudian CPU akan mengambil alamat kode program yang tadi disimpan dalam stack
memory, diletakkan pada PC, dan kembali menjalankan kode mulai dari alamat PC
yang baru, yakni alamat kode instruksi persis di bawah LCALL tadi.
Saya jelaskan sekali lagi. Saat
subrutin hendak dijalankan, CPU akan menyimpan PC (Progam Counter) ke dalam
stack, kontrol program akan berpindah ke alamat subrutin yang dituju, dan
kemudian subrutin yang letakknya ditempat yang jauh itu segera dijalankan.
Sampai kemudian CPU menemukan instruksi RET, yang berarti akhir dari subrutin,
maka CPU mengembalikan kontrol program yang tadi ditinggalkannya.
>>contoh dari kasus yang
menggunakan CALL DELAY
Tulis program yang men-toggle
(bolak-balik) setiap bit pada port 1 dengan menuliskan 55h dan Aah secara terus
menerus. Gunakan tundaan waktu setiap setelah menulis port. Program ini
dugunakan untuk menguji port pada 8051 yang akan dibahas pada bab selanjutnya.
Jawaban:
ORG 0
LAGI:
MOV A,#55h
;Isi A dengan 55h
MOV P1,A
;salin A pada P1
ACALL DELAY ;Tunda
MOV A,#0AAh ;Isi A
dengan AAh
MOV
P1,A ;salin A
pada P1
ACALL DELAY ;Tunda
SJMP
LAGI ;Ulang
;——Tundaan Waktu
ORG 300h
DELAY:
MOV R5,#0FFh ;R5 = FFh
sebagai pencacah counter
ULANG: DJNZ
R5,ULANG ;Tunggu sampai R5 = 0
RET
END
Beberapa hal yang harus kita
perhatikan untuk program pada contoh 3-8.
1. perhatikan
subrutin DELAY. Setelah instruksi “LCALL DELAY” dibaca dan hendak dijalankan,
alamat pada instruksi tepat di bawahnya, yakni “MOV A,#044h“, di simpan (push)
ke dalam stack. Kemudian CPU mulai menjalankan instruksi mulai dari alamat 300h.
2. Pada
subrutin DELAY, pertama counter R5 di-set menjadi 255 (R5=FFh); sehingga, loop
akan diulang 256 kali. Saat R5 menjadi 0, kontrol menuju instruksi RET, di mana
dengan mengeksekusi RET ini alamat yang tadi disimpan pada stack, dikeluarkan
lagi (pop) dan diletakkan kembali pada PC (program Counter). PC kemudian
menunjukan alamat instruksi tepat di bawah CALL. Dan program dilanjutkan
kembali.
Berapa waktu tundaan yang bisa kita
dapatkan tergantung dari frekuensi osilator kristal pada system 8051. Untuk
menghitung waktu yang benar akan kita bahas lebihjelas pada BAB 4. Namun
bagaimanapun juga, kita dapat menambah waktu tundaan dengan menggunakan nested
loop seperti yang ditunjukkan di bawah ini.
TUNDAAN:
;pangkal(nested) dari subruitn
MOV
R4,#255 ;R4 = 255 (FFh)
LANJUT:
MOV R5,#255 ;R5 = 255 (FFh)
ULANG:
DJNZ R5,ULANG ;tetap di sini smp R4=0
DJNZ R4,ULANG ;decrement R4
;isi terus R5 smp R4=0
RET
;kembali ke pemanggil
0 komentar:
Post a Comment