Berikut ini ditunjukkan frekuensi kristal untuk tiga system berbasis 8051
berbeda. Cari perioda dari siklus mesin masing-masing ..
(a) 12 MHz (b) 16 MHz (c) 20 MHz
Jawaban:
Untuk system 8051 dengan 12 MHz, cari berapa panjang waktu untuk mengeksekusi
setiap instruksi di bawah ini
Siklus mesin untuk system 11.0592 MHz adalah 1.085 uS seperti yang ditunjukkan pada Contoh 3-13.
Tabvel A-1 lampiran A menunjukkan siklus mesin dari masing-masing instruksi adalah.
MOV A,#55h
LAGI: MOV P1,A
ACALL DELAY
CPL A
SJMP LAGI
;——Tundaan Waktu
Berdasarkan Datasheet 8051 kita mendapatkan siklus mesin dari masing-masing perintah
dalam subrutin DELAY.
Siklus Mesin
DELAY: MOV R3,200 1
ULANG: DJNZ R3,ULANG 2
RET 1
Pada contoh 3, nilai tertinggi dari register R3 adalah 255, sehingga salah
satu cara untuk memperpanjang tundaan adalah dengan menambahkan
instruksi NOP pada bagian loop. NOP adalah berarti No Operation, yang
berarti setidaknya membuang waktu 1 siklus mesin. Hal ini dicontokan
pada contoh 4
Loop Tundaan di dalam Loop
Untuk loop ULANG, kita akan mendapatkan (4 x 250) 1 s = 1000 s. dan LANJUT
mengulang loop ULANG sebanyak 200 kali, sehingga kita mendapatkan 200 x 1000 =
200000, hal itu jika kita memasukkkan kelebihan waktu overhead. Namun instruksi
“MOV R3,#250” dan “DJNZ R3,LANJUT” di awal dan diakhir loop ULANG tambahkan
(3 x 200 x 1 s) = 600 s kelebihan waktu. Sehingga panjang sebenarnya dari ke dua
loop adalah 200000 + 600 = 200600 s = 200,600 mS. Adapun perhitungan tersebut
masih mengabaikan perintah diawal dan diakhir subrutin yaitu CALL dan RET, yang
masing-masing membutuhkan 2 s.
P1 equ 090 h ; menandakan P1 = 090h (alamat P1)
Org 0000h ; memulai alamat awal 0000h
mulai: Mov P1, #0fh ; menyalinkan data 0fh ke port 1
Call Tunda ; memanggil sub program Tunda
Mov P1, #0f0h ; menyalinkan data 0f0h ke port 1
Call Tunda ; memanggil sub program Tunda
Jmp mulai ; kembali mengulang dari label mulai
; subroutine tunda
Tunda: Mov R1, #0ffh ; mengisikan data ffh ke R1
Tnd: Mov R2, # 0f5h ; mengisikan data f5h ke R2
Djnz R2,$ ; mengurangi 1 isi R2 dan mengulagi lagi jika isi R2 tidak sama dengan nol
Djnz R1,Tnd ; mengurangi 1 isi R1 dan mengulagi lagi dari Label Tnd jika isi R1 tidak nol
Ret ; kembali ke main program (setelah instruksi Call)
End ; mengakhiri program
Tugas : Hitunglah jumlah waktu tunda dalam satuan detik subroutin berikut
; subroutine tunda
Tunda: Mov R1, #0ffh
Tnd: Mov R2, # 0f5h
Djnz R2,$
Djnz R1,Tnd
Ret
End