[bab 8] program subrutin
DESCRIPTION
SubrutinTRANSCRIPT
-
100
Bab 8 Subrutin Delay
8.1 PENGERTIAN SUBRUTIN
Subrutin adalah program singkat yang dibuat dan dapat dipanggil oleh program
utama melalui intruksi tertentu. Program subrutin dibuat pada alamat tertentu yang berbeda
dengan alamat program utama. Pada programnya, subrutin selalu diakhiri dengan intruksi
RET (return).
Program subrutin akan berjalan jika kita memanggilnya dengan intruksi CALL dan
diiringi oleh alamat awal program tersebut disimpan. Ketika mikroprosesor menerima
instuksi CALL maka akan menghentikan secara sementara instruksi yang sedang
dilaksanakan kemudian menyimpan alamat setelah instruksi yang telah dihentikannya
kedalam Stack Pointer (SP) dan mengganti/mengisi alamat pada Programable Counter (PC)
dengan alamat awal subrutin tersebut. Dan program subrutin akan berakhir ketika kita
program menemukan intruksi RET. Maka, program akan kembali menuju program utama.
Program yang biasa dijadikan subrutin delay adalah sebagai berikut:
Delay
Fungsi
Formula, dll.
8.2 SUBRUTIN DELAY
Subrutin delay adalah suatu subrutin yang digunakan untuk men-delay suatu
program utama. Kita dapat membuat dan merancang suatu subrutin delay dengan waktu-
waktu yang dibutuhkan oleh program utama atau sesuai dengan keinginan kita.
Subrutin Delay
-
101
Bab 8 Subrutin Delay
Dalam perancangannya, kita harus mengetahui berapa besar Periode Clock/Time
Clock (Tc) yang dimiliki oleh masing-masing intruksi yang ada pada Trainer MIDICOM
i8085. Berikut merupakan tabel klasifikasi set instruksi berdasarkan jumlah Tc nya :
NO. MNEMONIC KETERANGAN Tc
1 ADD B A A+ B
4
2 ADC D A A + D + CY
3 SUB D A A D
4 SBB C A A C CY
5 INR C C C+ 1
6 DCR B B B 1
7 DAA A BCD
8 CMP D A D
9 ANA D A A D
10 XRA B A A VD
11 ORA C A A VD
12 CMA A NOT A
13 CMC CY NOT CY
14 STC CY 1
15 RAR Rotate Accumulator Right
16 RAL Rotate Accumulator Left
17 RRC Rotate Right Trough Carry
18 RLC Rotate Left Trough Carry
19 EI Enable Interrupt
20 DI Dissable Interrupt
21 NOP No Operation
22 RIM Read Inteerpt Mask
23 SIM Set Interrupt Mask
24 HLT Halt 5
25 INX H HL HL +1
6
26 INX B BC BC +1
27 INX D DE DE +1
28 INX SP SP SP +1
29 DCX B BC BC 1
30 DCX D DE DE 1
31 DCX H HL HL 1
32 DCX SP SP SP 1
33 PCHL PC HL
34 SPHL SP HL
35 RZ Mengakhiri prog. subrutin atau prog.
interupsi, kembali melanjutkan program
-
102
Bab 8 Subrutin Delay
utama jika Z=1
6/12
36 RNZ
Mengakhiri prog. subrutin atau prog.
interupsi, kembali melanjutkan program
utama jika Z=0
37 RC
Mengakhiri prog. subrutin atau prog.
interupsi, kembali melanjutkan program
utama jika CY=1
38 RNC
Mengakhiri prog. subrutin atau prog.
interupsi, kembali melanjutkan program
utama jika CY=0
39 RPE
Mengakhiri prog. subrutin atau prog.
interupsi, kembali melanjutkan program
utama jika PE=1
40 RPO
Mengakhiri prog. subrutin atau prog.
interupsi, kembali melanjutkan program
utama jika PE=0
41 RM
Mengakhiri prog. subrutin atau prog.
interupsi, kembali melanjutkan program
utama jika S=1
42 RP
Mengakhiri prog. subrutin atau prog.
interupsi, kembali melanjutkan program
utama jika S=0
43 MOV A,M A M
7
44 MOV M,C M C
45 MVI A,34 A 34
46 MVI D,6F D 6F
47 LDAX B A [BC]
48 LDAX D A [DE]
49 STAX B [BC] A
50 STAX D [DE] A
51 XCHG DE HL
52 ADD M A A + M
53 ADI 55 A A+ 55
54 ADC M A A+ M + CY
55 ACI 77 A A+ 77 + CY
56 SUB M A A M
57 SUI 89 A A 89
58 SBB M A A M CY
59 SBI 45 A A 45 CY
60 ANA M A A M
61 ANI 88 A A 88
62 XRA M A A VM
-
103
Bab 8 Subrutin Delay
63 XRI 77 A A V77
64 ORA M A A VM
65 ORI 44 A A V44
66 JZ 7788 Lompat ke alamat 7788 jika Z=1
7/10
67 JNZ 7788 Lompat ke alamat 7788 jika Z=0
68 JC 8899 Lompat ke alamat 8899 jika CY=1
69 JNC 8899 Lompat ke alamat 8899 jika CY=0
70 JPE 8877 Lompat ke alamat 8877 jika PE=1
71 JPO 7766 Lompat ke alamat 7766 jika PE=0
72 JM 8866 Lompat ke alamat 8866 jika S=1
73 JP 9944 Lompat ke alamat 9944 jika S=0
74 CZ 7788 Memanggil subrutin pada alamat 7788
jika Z=1
9/18
75 CNZ 7788 Memanggil subrutin pada alamat 7788
jika Z=0
76 CC 8899 Memanggil subrutin pada alamat 8899
jika CY=1
77 CNC 8899 Memanggil subrutin pada alamat
8899jika CY=0
78 CPE 7755 Memanggil subrutin pada alamat 7755
jika PE=1
79 CPO7766 Memanggil subrutin pada alamat 7788
jika PE=0
80 CM 8866 Memanggil subrutin pada alamat 7788
jika S=1
81 CP 9944 Memanggil subrutin pada alamat 7788
jika S=0
82 INR M A M + 1
10
83 DCR M M M 1
84 MVI M,66 M 66
85 LXI H,8977 HL 8977
86 LXI B,ABCD BC ABCD
87 LXI D,A579 DE A579
88 LXI SP,FFFF SP FFFF
89 DAD B HL HL +BC
90 DAD D HL HL +DE
91 DAD H HL HL +HL
91 DAD SP HL HL +SP
92 JMP 8877 Lompat tanpa syarat ke alamat 8877
93 RET
Mengakhiri prog. subrutin atau prog.
interupsi, kembali melanjutkan program
utama
-
104
Bab 8 Subrutin Delay
94 POP B
Mengembalikan data 16 bit dari puncak
STACK ke pasangan register BC
BC TOS
10
95 POP D
Mengembalikan data 16 bit dari puncak
STACK ke pasangan register DE
DE TOS
96 POP H
Mengembalikan data 16 bit dari puncak
STACK ke pasangan register HL
HL TOS
97 POP PSW
Mengembalikan data 16 bit dari puncak
STACK ke pasangan register A & F
A & F TOS
98 IN 51
Membaca data 8 bit dari input Port
alamat 51H.
A PORT INPUT 51
99 OUT 50
Mengirim data 8 bit ke port output
alamat 50H.
PORT 50 H A
100 RST n RESTART n
n(0-7)
12
101 PUSH B
Mengamankan isi pasangan REG. BC ke
STACK
TOS BC
102 PUSH D
Mengamankan isi pasangan REG. DE ke
STACK
TOS DE
103 PUSH H
Mengamankan isi pasangan REG. HL ke
STACK
TOS HL
104 PUSH PSW
Mengamankan isi pasangan REG. A & F
ke STACK
TOS A & F
105 LDA 7890 A [7890] 13
106 STA 7788 [7788] A
107 XTHL HL TOS
16 108 LHLD 7788
L [7788]
H [7789]
109 SHLD 9977 [9977] A
[9978] A
110 CALL 8899 Memanggil subrutin pada alamat 8899 18
Tabel 8.1 Klasifikasi Set Instruksi 8085 berdasarkan jumlah Tc
-
105
Bab 8 Subrutin Delay
8.3 MACAM-MACAM SUBRUTIN DELAY
a. Subrutin Delay dengan 1 Register 8 bit
Dari diagram alir diatas, dapat ditentukan Rumus Umum untuk delay dengan 1
register 8 bit, yaitu :
Delay 1R8 = ( 7 + 10 +18 ) + 4n + (10n-3)
= 35 + 4n + 10n-3
Maka, Rumus Umumnya adalah :
Trainer Midicom memiliki nilai frekuensi clock (fc) sebesar 3,072 MHz. Maka
besarnya periode clock :
Dengan acuan seperti di atas kita ketahui bahwa :
Delay minimum diperoleh saat n = 1
Delay maksimum diperoleh saat n = 0, n = 256
RU D1R8 = (14n+32) Tc
= 14( 256 ) + 32
= 3616 Tc = (3616 x 0,326 x 10-6) = 1,178816 ms
n =1 n =2
18 Tc
7 Tc
4 Tc
10 Tc
7 Tc
10 Tc
18 Tc
7 Tc
2x4 Tc
(10+7) Tc
10 Tc
18
7
4n
10( n 1 ) + 7
10
RU D1R8 = (14n + 32) Tc
-
106
Bab 8 Subrutin Delay
Rancang subrutin delay 255 s!
Penyelesaian :
Mencari nilai periode clock dalam Tc
Catatan : Jika angka di belakang koma 5 maka bulatkan ke atas dan sebaliknya jika
< 5 maka bulatkan ke bawah.
Masukan ke rumus umum delay 1 register, untuk mencari nilai n.
782 Tc = (14n+32) Tc
n = ( )
n = 53.571428 (53)10 = (35)16
Catatan : Nilai n harus selalu dibulatkan ke bawah.
Substitusikan nilai n (dalam decimal) ke rumus umum delay 1 Register 8 bit. Jika n =
53 maka :
D1R8 = (14n+32) Tc
= (14 x 53 + 32) Tc
= = 242.544 s
Mencari selisih waktu atau kekurangan waktu.
Selisih waktu = (782 + 774) Tc
= 8 Tc
Untuk menutupi kekurangan waktu tersebut kita harus menyisipkan instruksi-
instruksi yang sesuai jumlah Tc nya. Karena kekurangan waktunya sebesar 8 Tc maka
kita cukup menyisipkan instruksi NOP sebanyak 2 kali sebelum RET.
Catatan : Jika besar selisih waktunya tidak ada sisipan yang pas, kurangi nilai n.
Menghitung presentasi kesalahan (error) dari subrutin delay yang dibuat.
% error = ( )
x 100 %
= 4.88 %
Contoh
-
107
Bab 8 Subrutin Delay
Rancangan subrutin delay 255 s :
B!35
B!B-1
Z = 0
RET
Y
Delay 1R
NOP
NOP
T
b. Subrutin Delay dengan 2 Register 8 bit
Dari diagram alir diatas, dapat ditentukan Rumus Umum untuk delay dengan
12register 8 bit, yaitu :
Delay 2R8 = ( 7 + 10 +18 ) + 7r +4rp +10rp-3r+ 10r-3+4r
n =1
18 Tc
7 Tc
7 Tc
4 Tc
10 Tc
7 Tc
4 Tc
10 Tc
7 Tc
10 Tc
18
7
7 r
4 rp
(10p-3)r
4r
(10r-3)
10
Analisa :
Register B diisi dengan nilai n yang telah kita hitung
sebelumnya, yaitu 35 (heksadesimal dari 53). Perlu diingat
bahwa niali n yang diinputkan ke dalam program harus
dalam bentuk bilangan heksadesimal karena prosesor hanya
menerima bilangan heksadesimal. Register B dikurangi sat
uterus menerus sampai zeroflagnya sama dengan 1.
Dilanjutnkan ke insturksi sisipan yang sebelumnya telah
kita cari. Subrutin di return ke program utama.
-
108
Bab 8 Subrutin Delay
Maka, Rumus Umumnya adalah :
Delay minimum diperoleh saat n = 1
Delay maksimum diperoleh saat n = 0, n = 256
RU D2R8 = (14rp +18r+ 32) Tc
= (14x2562 +18x256+ 32) Tc
= 922144Tc = (922144 x 0,326 x 10-6) = 300.6 ms
Rancang subrutin delay 2.3 ms!
Penyelesaian :
Mencari nilai periode clock dalam Tc
Buat pemisalan nilai p, untuk mencari nilai r dengan cara dimasukan ke rumus umum
delay 2 register.
Misal, p = (50)10 = (32)16
7055 Tc = (14rp +18r+ 32) Tc
= (14x50r +18r+ 32) Tc
r = 9.78 9
Catatan : Nilai r harus 256 maka nilai pemisalan p harus ditambah.
Substitusikan nilai r (dalam decimal) ke rumus umum delay 2 Register 8 bit. Jika n = 9
maka :
D1R8 = (14rp +18r+ 32)
= (14x9x50 +18x9+ 32)
= 6494 Tc
Mencari selisih waktu atau kekurangan waktu.
Selisih waktu = (7055 + 6494) Tc
= 561 Tc
Kekurangan waktu terlalu besar, butuh sisipan instruksi-instruksi yang banyak.
Maka dari itu, kita harus merancang lagi subrutin delay 561 Tc dengan 1 Register 8 bit.
Contoh
RU D2R8 = (14rp +18r+ 32) Tc
-
109
Bab 8 Subrutin Delay
Masukan ke rumus umum delay 1 register, untuk mencari nilai n.
561 Tc = (14n+32) Tc
n = ( )
n = 37.78 (37)10 = (25)16
Substitusikan nilai n (dalam decimal) ke rumus umum delay 1 Register 8 bit. Jika n =
37 maka :
D1R8 = (14n+32) Tc
= (14 x 37 + 32) Tc
= 550 Tc
Mencari selisih waktu atau kekurangan waktu.
Selisih waktu = (561 + 550) Tc
= 11 Tc
Untuk menutupi kekurangan waktu tersebut kita harus menyisipkan instruksi-
instruksi yang sesuai jumlah Tc nya. Karena kekurangan waktunya sebesar 11 Tc maka
kita cukup menyisipkan instruksi NOP sebanyak 4 kali dan MVI B, 00 sebanyak satu
kali sebelum RET.
Rancangan subrutin delay 2.3 ms :
B!09
C!32
C!C-1
Z = 0
B!B-1
Z = 0
RET
Y
T
Y
T
Delay 2R
CALL Delay 1R
B!25
B!B-1
Z = 0
RET
Y
Delay 1R
T
NOP
NOP
NOP
NOP
B!00
-
110
Bab 8 Subrutin Delay
c. Subrutin Delay dengan 2 Register 8 bit
Dari diagram alir diatas, dapat ditentukan Rumus Umum untuk delay dengan 3
register 8 bit, yaitu :
Delay minimum diperoleh saat n = 1
Delay maksimum diperoleh saat n = 0, n = 256
RU D2R8 = (14kts + 18kt + 18k + 32) Tc
= (14x2563 + 18 x2562 + 18 x256+ 32) Tc Tc
= 236065312 Tc = (236065312 x 0,326 x 10-6) = 76.96 s
n =1
18 Tc
7 Tc
7 Tc
7 Tc
4 Tc
10 Tc
7 Tc
4 Tc
10 Tc
7 Tc
18
7
7 k
7 kt
10 kts -3 kt
4 kts
4 Tc
10 Tc
7 Tc
4 kt
10 kt -3 k
4 k
10-3k
Tc
10 Tc 10
RU D3R8 = (14kts + 18kt + 18k + 32) Tc
-
111
Bab 8 Subrutin Delay
Rancang subrutin delay 3 s!
Penyelesaian :
Mencari nilai periode clock dalam Tc
Buat pemisalan nilai t dan s, untuk mencari nilai k dengan cara dimasukan ke rumus
umum delay 3 register.
Misal, t = s = (60)10 = (3C)16
9202454 Tc = (14kts + 18kt + 18k + 32) Tc
= (14(60)2k + 18(60)k + 18k + 32) Tc
k = 178.6947454 (178)10 = (B2)16
Substitusikan nilai k (dalam decimal) ke rumus umum delay 3 Register 8 bit. Jika n =
178 maka :
D1R8 = (14(60)2(178) + 18(60) (178) + 18(178)+ 32) Tc
= 91666676 Tc
Mencari selisih waktu atau kekurangan waktu.
Selisih waktu = (9202454 + 91666676) Tc
= 35778 Tc
Kita harus merancang lagi subrutin delay 35778 Tc dengan 2 Register 8 bit.
Buat pemisalan nilai p, untuk mencari nilai r dengan cara dimasukan ke rumus umum
delay 2 register.
Misal, p = (60)10 = (3C)16
35778 Tc = (14rp +18r+ 32) Tc
= (14x60r +18r+ 32) Tc
r = 41.66200466 (41)10 = (29)16
Substitusikan nilai r (dalam decimal) ke rumus umum delay 3 Register 8 bit. Jika n =
41 maka :
D1R8 = (14(60)(41) + 18(41)+ 32) Tc
= 35210 Tc
Mencari selisih waktu atau kekurangan waktu.
Selisih waktu = (35778 35210) Tc
= 568 Tc
Contoh
-
112
Bab 8 Subrutin Delay
Kita harus merancang lagi subrutin delay 568 Tc dengan 1 Register 8 bit.
Masukan ke rumus umum delay 1 register, untuk mencari nilai n.
568 Tc = (14n+32) Tc
n = ( )
n = 38.28571429 (38)10 = (26)16
Substitusikan nilai n (dalam decimal) ke rumus umum delay 1 Register 8 bit. Jika n =
38 maka :
D1R8 = (14n+32) Tc
= (14 x 38 + 32) Tc
= 564 Tc
Mencari selisih waktu atau kekurangan waktu.
Selisih waktu = (568 564) Tc
= 4 Tc
Karena kekurangan waktunya sebesar 4 Tc maka kita cukup menyisipkan instruksi
NOP sebanyak 1 sebelum RET.
Rancangan subrutin delay 3 s :
B!B2
C!3C
D!D-1
Z = 0
C!C-1
Z = 0
RET
Y
Y
T
Delay 3R8
D!3C
B!B-1
Z = 0
Y
T
T
CALL Delay 2R8
CALL Delay 1R8
-
113
Bab 8 Subrutin Delay
d. Subrutin Delay dengan 1 Register Pair 16 bit
Dari diagram alir diatas, dapat ditentukan Rumus Umum untuk delay dengan 1
register pair 16 bit, yaitu :
Delay minimum diperoleh saat n = 1
Delay maksimum diperoleh saat n = 0, n = 65536
RU D1RP = (16n + 51) Tc
= (16x65536 + 51) Tc
= 1048627 Tc = (1048627 x 0,326 x 10-6) = 341 ms
n =1
18 Tc
10Tc
6 Tc
10 Tc
7 Tc
10 Tc
18
10
6n+6
(10n+7) Tc
10 Tc
RU D1RP = (16n + 51) Tc
-
114
Bab 8 Subrutin Delay
e. Subrutin Delay dengan 2 Register Pair 32 bit
Dari diagram alir diatas, dapat ditentukan Rumus Umum untuk delay dengan 2
register pair 16 bit, yaitu :
Delay minimum diperoleh saat n = 1
Delay maksimum diperoleh saat n = 0, n = 65536
RU D1RP = (16rp + 39r + 51) Tc
= (16x655362 + 3965536 + 51) Tc
= 6.872203269x1010 Tc
= (6.872203269x1010 x 0,326 x 10-6) = 22403.38266 s
10 Tc
10Tc
10 Tc
10 Tc
7 Tc
6 Tc
10 Tc
7 Tc
10 Tc
18 Tc
10
10r
6rp + 6r
10pr+ 7r
6r + 6
10r + 7
10 Tc
18
RU D2RP = (16rp + 39r + 51) Tc