[bab 8] program subrutin

15
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

Upload: nur-alifah-apriliany

Post on 14-Sep-2015

27 views

Category:

Documents


4 download

DESCRIPTION

Subrutin

TRANSCRIPT

  • 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