0% menganggap dokumen ini bermanfaat (0 suara)
68 tayangan138 halaman

Konversi Bilangan dalam Komputasi

Dokumen tersebut merupakan ringkasan bab pengenalan komputasi yang membahas sistem bilangan biner, heksadesimal, dan desimal beserta konversi antara sistem-sistem tersebut. Juga dibahas mengenai operasi logika AND, OR, NOT, XOR, serta definisi bit, byte, dan kilobyte.

Diunggah oleh

Indra Negara
Hak Cipta
© Attribution Non-Commercial (BY-NC)
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai DOC, PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
68 tayangan138 halaman

Konversi Bilangan dalam Komputasi

Dokumen tersebut merupakan ringkasan bab pengenalan komputasi yang membahas sistem bilangan biner, heksadesimal, dan desimal beserta konversi antara sistem-sistem tersebut. Juga dibahas mengenai operasi logika AND, OR, NOT, XOR, serta definisi bit, byte, dan kilobyte.

Diunggah oleh

Indra Negara
Hak Cipta
© Attribution Non-Commercial (BY-NC)
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai DOC, PDF, TXT atau baca online di Scribd

Tutorial MCS-51 Pengenalan Komputasi

February 23rd, 2011 Musbikhin

BAB 0 Pengenalan Komputasi


Sasaran

Setelah anda menamatkan bab ini, diharapkan anda dapat : - Mengkonversi nilai bilangan dari/ke basis-2, basis-10, dan basis-16. - Menambah dan mengurangi bilangan Hex. - Menambah bilangan biner - Menjabarkan bilangan-bilangan biner dalam komplement ke2. - Menjabarkan string alphanumeric ke dalam kode ASCII. - Menjelaskan operasi dari gerbang-gerbang AND, OR, NOT, XOR, NAND, NOR. - Menggunakan gerbang logika untuk membuat rangkaian sederhana. - Menjelaskan pebedaan antara Bit, Nibble, Byte dan Word. - Memberikan definisi matematik yang akurat tentang terminologi kilobyte, megabyte, gigabyte, dan terabyte. - Memaparkan kegunaan komponen utama dan menjelaskan kegunaan type-type bus. - Mejelaskan aturan yang digunakan CPU dalam System komputer. Untuk mengerti software dan hardware dari system yang berbasis mikrokontroller, sesorang paling pertama harus memahami konsep paling dasar yang digunakan pada desain komputer. Pada bab ini (yang pada tradisi pada bilangan system komputer selalu dimulai dari 0 dan bukanlah 1), hal mendasar adalah membahas bilangan dan system coding. Setelah mengenalkan pada gerbang logika, kita akan mengulas proses kerja di dalam komputer. Dan terkahir adalah kita akan memberikan sejarah dari arsitektur CPU. Sehingga pembaca yang budiman kemudian dapat memiliki latar belakang yang cukup sebelum beranjak pada bab selanjutnya, yakni dengan membaca bab ini dengan seksama dan menyeluruh.

SubBAB 0.1:

Numbering anda Coding Systems

Di mana manusia selalu menggunakan aritmatika berbasis 10 (desimal), sementara itu sebuah komputer menggunakan state, dan berbasis 2. Dalam bab ini kita akan menjelaskan bagaimana mengubah system desimal menjadi system biner, dan juga sebaliknya. Dan padanan yang setara dari bilanganbilangan biner, disebut dengan heksa-desimal, juga akan kita bahas. Dan terakhir adalah format biner pada kode alphanumeric, yang disebut dengan ASCII, akan kita gali kemudian.

Decimal and binary number systems Konon kabarnya ada splekulasi bahwa kita manusia menggunakan bilangan berbasis 10, karena dipadankan dengan jumlah jari manusia yang berjumlah 10 itu. Namun di luar hal itu, system bilangan biner yang digunakan oleh komputer bukanlah karangan dan spekulasi. System biner dalam komputer digunakan karena 1 dan 0 adalah representasi dari status level tegangan sebagai On atau Off. Di mana basis-10 memiliki beberapa symbol, 0, 1, 2, 3, ,9. Sedangkan dalam basis-2 hanya menggunakan simbol 1 dan 0. Hal ini juga yang mewakili pada masing-masing digit. 1 digit dalam basis-10 bisa diwakili oleh simbol 0 s/d 9. Sedang 1 digit pada bilangan biner hanya diwakili nilai 0 atau 1. Nah.. dari digit biner inilah kemudian diingatkan orang menyebutnya menjadi bit (Biner digit).

Mengubah Desimal menjadi Biner Satu metode pengubahan yang digunakan pada konversi desimal ke biner adalah membagi bilangan desimal dengan 2 secara berulang-ulang. Dengan terus memantau sisa dari pengurangannya. Proses ini terus dilakukan sampai bilangan

menjadi 0 atau Zero. Sedang sisanya kemudian dituliskan pada angka yang terakhir. Hal ini di-demontrasi-kan pada Contoh 0-1. Contoh 0-1 Ubah 25 desimal (atau 2510 ) menjadi biner. Jawaban: 25/2 = 12/2 = 6/2 = 2/2 = 1/2 = Hasil 12 6 3 1 0 0 1 1 Sisa 1 0 LSB (Least Significant bit)

MSB (Most Significant bit)

Jadi, 2510 = 110012.

Mengubah Biner ke Desimal Untuk mengubah bilangan biner ke desimal, hal terpenting adalah mengerti konsep dari besaran setiap posisi digit. Pertama dengan analoginyaa, menyimak bersaran nilai dalam basis-10, seperti yang ada pada diagram di bawah ini. 74068310 3 8 6 0 4 7 = x x x x x x 100 101 102 103 104 105 = = = = = + 740683 1101012 1 x 20 0 x 20 1 x 20 0 x 20 1 x 20 ====== = 11 = 02 = 14 = 08 = 116
Desimal Biner

= 3 80 600 0000 40000

700000

= = = = =

1 0 4 0 16

1 00 100 0000 10000

1 x 20

=
0

132 = 32 + 53

100000

110101

Mengerti besaran dari setiap bit dalam bilangan biner membuatnya menjadi mudah untuk menambahkan mereka semua untuk mendapatkan persamaannya dalam desimal, seperti yang ditunjukkan pada Contoh 0-2. Contoh 0-2 Ubahlah bilangan biner 110012 menjadi desimal Jawaban : Besaran: 24 23 22 21 20
Digit: 1 1 0 0 1 Jumlah: 16 + 8 + 0 + 0 + 1 = 2510

Mengerti besaran yang sesuai untuk setiap posisi bit bilangan biner membuat sesorang mudah untuk mengkonversi bilangan desimal menjadi bilangan biner secara langsung melalui proses pembagian berulang. Hal ini dicontohkan pada Contoh 0-3 Contoh 0-3
Ubahlah bilangan desimal 3910 menjadi biner Jawaban : Jumlah: 32 + 0 + 0 + 4 + 2 + 1 = 39 Besaran: 24 24 23 22 21 20Digit: 1 0 hasilnya adalah 1001112 0 1 1 1

asdasdasd (rbk) halaman 3

System Heksadesimal System heksadesimal ini dalam literatur komputer juga disebut dengan Basis-16, digunakan untuk merepresentasikan

bilangan biner dengan baik ke dalam bilangan manusia yang mudah diingat dan lebih ringkas. Misalnya manusia akan lebih untuk mengingat dan memahami bilangan 896h dibanding dengan bilangan yang sama, yakni biner 100010010110. System biner memliki simbol 0 dan 1 untuk merepresntasikan keadaannya. Sementara itu dalam bilangan basis-10, terdapat 10 buah simbol mulai dari 0 s/d 9. Sedang pada heksadesimal (basis-16) memiliki 16 simbol. Yang simbol pertamanya adalah seperti basis-10 yakni 0 s/d 9 sementara itu 6 symbol berikutnya adalah A, B, C, D, E, dan F. Table 0-1 menunjukkan persamaan dari bilangan biner, desimal, dan heksadesimal untuk merepresentasikan nilai 0 s/d 15.
Tabel 0-1: System bilangan Basis-16

Desimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Biner 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

Hex 0 1 2 3 4 5 6 7 8 9 A B C D E F

Mengubah antara Biner dan Hex Untuk mengubah kembali bilangan biner sebagaimana ekuivalensinya sebagai bilangan haksadesimal, dimulai dari kanan, dan mengelompokkan setiap 4 digit, dan menggantikan 4-bit biner tersebut dengan persamaannya sebagai bilangan Hex sepeti yang ditunjukkan pada tabel 0-1. Utuk mengubah dari hex ke biner setiap digit hex harus diganti dengan persamaannya sebagai 4 bit biner seperti pada table 0-1. Lihat contoh 0-4 dan 0-5

Contoh 0-4 Ubah biner 100111110101 dalam Hex. Jawaban: Pertama nilai di kelompokkan dalam rangkaian 4-bit menjadi: 1001 1111 0101 Kemudian setiap kelompok diganti dengan padanannya dalam hex, menjadi: 1001 1111 0101 9 F 5 Sehingga, 100111110101 biner = 9F5 heksadesimal

Contoh 0-5 Ubah bilangan Hex 29B menjadi biner. Jawaban: = 2 9 B 0010 1001 1011

kemudian mengabaikan digit-digit 0 di depan, maka menjadi 29Bh = 1010011011b

Mengubah bilengan desimal ke hex Untuk mengubah nilai bilangan hex dapat dilakukan dengan dua cara. 1. Ubahlah desimal menjadi biner. Dan kemudian menjadi Hex. Seperti yang ditunjukkan pada Contoh 0-6. 2. Mengubah langsung dari desimal menjadi hex dengan melakukan pembagian terus, dengan memantau isi sisa. Percobaan ini saya serahkan pada para pembaca yang budiman. Contoh 0-6 (a) Ubah 4510 menjadi Hex.

Seperti pada contih 0-1 maka diketemukan


32 16 8 4 2 1

mengubah menjadi biner 32 + 8 + 4 + 1 = 45

4510 = 001011012 = 2D hex (b) Ubah 62910 menjadi Hex. Seperti pada contih 0-1 maka diketemukan
512 256 128 64 32 16 8 4 2 1

menjadi biner 1 0

62910 = (512 + 64 + 32 + 16 + 4 + 1) =0010 0111 01012 = 275 hex (a) Ubah 171410 menjadi Hex. Seperti pada contih 0-1 maka diketemukan
1024 1 512 256 128 64 32 16 8 4 2

1 1 0

171410 = (1024 + 512 + 128 + 32 + 16 + 2) =0110 1011 00102 = 6B2 hex

Mengubah bilengan hex ke desimal Untuk mengubah nilai bilangan hex dapat dilakukan dengan dua cara. 1. Ubahlah hex menjadi biner. Dan kemudian menjadi desimal. Seperti yang ditunjukkan pada Contoh 0-7. 2. Mengubah langsung dari hex menjadi desimal dengan melakukan panambahan besaran dari masing-masing digit. Contoh 0-7 Ubahlah bilangan heksadesimal berikut ini menjadi desimal (a) 6B216 = 0110 1011 00102.

1024 1

512

256

128

64

32

16

1 1 0

1024 + 512 + 128 + 32 + 16 + 2 = 171410 (b) 9F2D16 = 1001 1111 0010 11012.
32768 16384 8192 4096 2048 1024 512 256 128 64 32 16 1 8 4 2

1 1

32768 + 4096 + 2048 + 1024 + 512 + 256 + 32 + 8 + 4 + 1 = 40.74910

Mencacah dalam basis-10, 2 dan 16 Untuk menunjukkan hubungan antara masing-masing basis ini. Dalam table 0-2 kita ditunjukkan urutan nilai 0 s/d 31 dalam desimal dan persamaannya dalam biner dan heksadesmal. Perhatikan dalam masing-masing basis yang jika sebuah bilangan ditambah kemudian menjadi digit yang lebih tinggi, maka digit sebelumnya itu akan menjadi 0 dan akan memberikan kelebihan Carry 1 pada digit dengan posisi yang lebih tinggi. Misalnya desimal 9 + 1 = 0 dengan membawa kelebihan Carry 1 pada posisi yang lebih tinggi sehingga menjadi 10. Misal dalam biner 1 + 1 = 0 dengan kelebihan Carry 1. Juga dengan Hex jika F + 1 = 0 dengan Carry.
Tabel 0-2: Cacahan (Counting) dalam beberapa basis

Desimal Hex 0 0 1 1 2 2 3 3 4

Biner 10000 10001 10010 10011 10100

4 5 5 6 6 7 7 8 8 9 9 10 A 11 B 12 C 13 D 14 E 15 F 16 10 17 11 18 12 19 13 20 14 21 15 22 16 23 17 24 18 25 19 26 1A 27 1B

10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011

28 1C 29 1D 30 1E 31 1F

11100 11101 11110 11111

Penambahan bilangan biner dan Hex Dalam hal penambahan bilangan biner adalah merupakan proses yang langsung. Table 0-3 menunjukkan penambahan 2 bit. Bahasan tentang pengurangan pada bilangan biner akan kita lewati, karena semua komputer menggunakan proses penambahan untuk juga digunakan pada proses pengurangan. Jadi maksudnya komputer-komputer itu menggunakan satu rangkaian elektronika untuk digunakan dalamproses penambahan dan sekaligus juga untuk proses pengurangan. Yaknid dengan denambahkan rangkaain kompolement ke-2 (2nd Complement) untuk setiap melakukan Pengurangan. Dalmakata lain, untuk melakuakn x-y,komputer akan membuat komplement ke-2 untuk y dan kemudian menambahkannya pada x. Konsep kemplemen ke-2 ini akan kita bahas nanti. Contoh 0-8 menunjukkan proses penambahan pada bilangan biner.
Tabel 0-3: Penambahan Biner

A + Sum 0 + 0 0 + 1 1 + 1 1 + 0

B 0 1 0 1

Carry 0 0 0 1

Contoh 0-8 Tambahkan bilangan biner berikut ini. Periksa dengan padanannya dalam desimal.

Jawaban : Biner 1101


1001

10110

Desimal 13 9 + 22

Contoh 0-9 Lakukan penjumlahan 2 buah bilangan heksadesimal 23D9 + 94BE ? Jawaban :
94BE

23D9 + B897

penjelasannya : 1. LSD: 9 + 14(E) = 23 ==> 23 16 = 7 dgn Carry 2. 1 + 13(D) + 11(B)= 25 ==> 25 16 = 9 dgn Carry 3. 1 + 3 + 4 = 8 4. 2 + 9 = 11(B) jadi hasilnya adalah B897h

If first, digit

the

second borrow

digit 16

is from

greater the

than

the preceding

Contoh 0-10 Lakukan mengurangan 2 buah bilangan heksadesimal 59F 2B8 ? Jawaban : 59F 2B8 2E7 penjelasannya : 1. LSD: 15(F) + 8 = 7

2. 9 + 16(pinjam/borrow) 11(B) = 14(E) 3. 5 1 1 = 2 jadi hasilnya adalah 2E7h

asdasdasd (rbk) halaman 7

kode ASCII

Jika pembaca punya versi asli dari buku ini, atau dapat dari googling dan download. Sudilah kiranya mengirimkan kepada saya halaman 7 ini agar bisa saya terjemahkan dan bisa berguna utk kawan2 lainnya.

Pola biner untuk nilai 0 s/s 9, semua menggunakan alphabet Inggris, huruf Kapital, huruf kecil, dan beberapa kode kontrol dan tanda punctuation. Kelebihan dari system ini adalah dapat digunakan oleh semua komputer. Sehingga informasi ini dapat saling tukar antar komputer. System ASCII menggunakan total 7-bit untuk merepresentasiakan setiap kode-nya. Misalnya 100 0001 adalah dimiliki oleh huruf A dan 110 0001 adalah dimiliki oleh huruf kecil a. Kemudian, 0 di-imbuh-kan pada Most Significant Bit (MSB) atau bit paling kiri, sehingga total akan membentuk sebuah kode 8-bit. Gambar 0-1 menunjukkan kode ASCII yang dipilih. Daftar lengkap dari kode ASCII dapat dilihat pada Appendix F. Penggunaan ASCII tidak hanya sebagai standar pada penggunaan keyboard di United States dan beberapa negara lainnya, namun juga sebagai standar pada penggunaan pencetakan karakter pada Printer dan penampilan karakter pada Display Monitor. Hex Symbol Hex 41 A a 42 B b 43 C c 44

Symbol 61 62 62

D d .. . . 59 Y y 5A Z z

63 . .. 79 7A .

Gambar 0-1: Sebahagian kode ASCII

Perhatikan bahwa pola kode ASCII dirancang demi kemudahan manipulasi data ASCII. Untuk contohnya, digit 0 sampai 9 direpresentasikan sebagai ASCII 30 s/d 39. Hal ini menjadi sangat mudah untuk mengkonversi ASCII ini menjadi bilangan desimal atau biner dengan membuang angka 3 didepannya. Atau dengan hanya mengambil 4-bit LSB saja pada model biner-nya. Juga perhatikan hubungan antara huruf besar dan huruf kecil. Yakni dengan yang di-representasi-kan huruf A s/d Z pada 41 s/d 5A dan dengan huruf kecilnya, yakni 61 s/s 7A. Menyimak kode binernya, yang membedakan antara huruf A dan a adalah bit ke-5. Sehingga dengan demikian menjadi semakin mudahnya kita untuk mengubah Uppercase ataupun Lowercase dari huruf-huruf tersebut. Contoh 0-11 Lakukan Pengurangan Hex 59F 2B8. Jawaban : 59F - 2B8 2E7 -=- 15 8 = 7 -=- 25(9+16) 11 = 14(Eh) -=- 4(5-1) 2 = 2

SubBAB 0-2 : Dasar-dasar Digital Dalam bagian ini kita akan membahas tentang logika digital dan desainnya. Pertama adalah kita membahas operasi logika biner, kemudian kita ditunjukkan bagaimana gerbang-gerbang melakukan hal itu. Kemudian beberapa gerbang logika digunakan untuk membetuk rangkaian digital sederhana. Dan terakhir kita mengupas beberapa peralatan logika yang ternyata digunakan untuk interfacing pada mikrokontroller.

Binary Logic Seperti yang sudah diterangkan sebelumnya, komputer menggunakan system bilangan biner karena 2 buah level tegangannya dapat direpresentasikan dengan digit 0 dan 1. Sinyal dalam elektronika digital memilki 2 keadaan level tegangan. Misalnya seperti system yang umum, tegangan 0 Volt diartikan sebagai logika 0, dan tegangan 5 Volt dianggap sebagai logika 1. Gambar 0-2 menunjukkan system ini yang digunakan untuk menunjukkan representasi tegangan terhadaap status logika dan berikut kemungkian toleransinya.

Gambar 0-2 : Sinyal Biner

Gerbang logika Gerbang logika biner adalah rengkaian sederhana yang memiliki 1 atau beberapa input digital, dan mengirimkan hasilnya sebagai 1 output. Beberapa gerbang yang umum diterangkan sebagaimana berikut ini.

gerbang AND Gerbang AND membutuhkan 2 atau lebih input untuk melaksanakan logika AND tersebut. Lihat tabel kebenaran, yakni jika kedua input adalah 1 maka output akan menjadi 1. Dicontohkan dengan 2 input, x dan y. Jadi jika semua input adalah berlogika 1 maka output akan menjadi 1. Sedang jika ada salah satu input yang ternyata 0, maka input akan menjadi 0.
fungsi logika AND

X Y AND Y 0 0 0 0 1 0 1 0 0 1 1 1

gerbang OR fungsi logika OR adalah jika salah satu atau beberapa, atau semua inputnya berlogika 1, maka output menjadi berlogika 1. Dan sebaliknya output akan menjadi 0 hanya jika kesemua input adalah 0. OR ini memiliki input lebih dari 1.
fungsi logika OR

X Y OR Y 0

0 0 0 1 1 1 0 1 1 1 1

Tri-State buffer Buffer digunakan dan tidak akan mengubah level logika input-inputnya. peralatan ini biasanya digunakan untuk menyambungkan sinyal dari 2 buah peralatan dan juga digunakan untuk menguatkan sinyal-sinyal. Bufer ini memiliki input tunggal ditambah kontrol E.

Inverter Inverter juga disebut dengan NOT, outputnya adalah selalu bernilai bertolak belakang dengan inputnya. Misalnya jika inputnya 0 maka outputnya menjadi 1 dan demikain sebaliknya. Inverter ini memiliki input tunggal.
fungsi logika INVerter

Input Output 0 1 1 0

Gerbangan XOR gerbang XOR melakukan operasi Exclusive-OR pada inputinputnya. XOR akan meghasilnya 1 jika salah 1 (namun bukan keduanya) inputnya adalah 1. Dan jika kedua input adalah 1, maka output XOR justru akan menjadi 0. Lihat XOR dalam tabel kebenaran. Fungsi ini dapat digunakan untuk membandingkan untuk melihat apakah 2 buah data adalah sama atau tidak. XOR ini memiliki input lebih dari 1.
fungsi logika XOR

X Y XOR Y 0 0 0 0 1 1 1 0 1 1 1 0

gerbang NAND dan NOR fungsi dari gerbang NAND adalah seperti dengan gerbang AND yang mana pabrik hanya menambahkan sebuah inverter pada outputnya. Sehingga outputnya akan menjadi 0 jika semua inputnya adalah 1. Dan output akan menjadi 1 jika ada salah satu input atau semuanya berlogika 0. NAND dan NOR ini

digunakan secara massive oleh desain komputer karena proses pembuatan dalam pabrik adalah sangat murah. Semua gerbang logika yang lain dapat diselenggarakan oleh kombinasi beberapa NAND dan NOR ini. Misalnya untuk membuat AND, OR, XOR, dan INV. Contoh sederhananya dari penggunaannya dapat dilihat pada gambar dibawah ini. NAND dan NOR ini memiliki input lebih dari 1. Sekali lagi unuk NAND jika semua inputnya adalah 1 maka outputnya akan menjadi 0. Dan untuk NOR, jika semua inputnya adalah 0, maka outputnya adalah 1. NAND dan NOR ini maisng-masing memiliki input lebih dari 1.
fungsi logika NAND

X Y NAND Y 0 0 1 0 1 1 1 0 1 1 1 0

fungsi logika NOR

X Y NOR Y 0 0 1 0 1 0 1 0

0 1 1 0

Rancangan logika dengan menggunakan gerbang-gerbang Kemudian kita akan ditunjukkan desain logika sederhana untuk melakukan penambahan (ADD-ition) dari 2 buah bilangan biner. Jika kita hendak menambahkan 2 buah bilangan biner, maka akan muncul 4 kejadian yang bisa terjadi. A 0 0 1 1 + + + + + B 0 1 0 1 Carry 0 0 0 1 Sum 0 1 1 0

Perhatian saat kita menambahkan 1 + 1 termasuk dengan carry, pada digit bilangan yang lebih tinggi. Kita akan membutuhkan jumlah dan Carry (kelebihan) dan desain ini. Perhatikan bahwa kolom SUM (penjumlahan) di atas dihasilkan dari output fungsi XOR dan kemudian kolom Carry (Kelebihan) dihasilkan dari fungsi AND. Gambar 0-3 (a) menunjukkan implementasi dariadder sederhana. Gambar 0-3 (b) menunjukkan implementasi rangkaian logika yang sama dengan menggunakan gerbang AND dan OR.

Gambar 0-3 Implementasi dari Half-Adder

Gambar 0-4 menujukkan diagram blok dari half-adder. Dua buah half-adder dapat dikompbinaskan dengan memnjadikkannya memiliki 3 buah input digital. Ini kemudian disebut dengan full-adder. Gambar 0-5 menunjukkan bagaiaamna dari diagram dari full-adder tersebut. Perhatikan pula bahwa blok diagram yang menyembunyikan detil dari rangkaian. Gambar 06 menunjukkan adder 3-bit dengan menggunakan 3 buah fulladder.

Gambar 0-4 Blok diagram dari Half-Adder

Gambar 0-5 Full-adder yang dibangun dengan menggunakan Half-Adder

Gambar 0-6 Adder 3-bit dengan menggunakan 3 buah Full-adder

Decoders Contoh yang lain dari aplikasi gerbang logika adalah sebuah docoder. Decoder adalah digunakan secara luas sebagai pen-dekode-an alamat dari sebuah system komputer. Gambar 07 menunjukkan dekoder untuk 9 (biner 1001), dan 5 (biner 0101) dengan menggunakan gerbang INV dan AND.

Gambar 0-7. Decoder alamat

Flip-Flop Komponen system komputer yang juga digunakan secara luas adalah flip-flop. Paling banyak flip-flop ini digunakan sebagai memory untuk menyimpan data. Gambar 0-8 menunjukkan bagaimana diagram logika, diagram blok, tabel kebenaran untuk sebuah flip-flop. Flip-flop type D, digunakan secara luas untuk mengunci data. Perhatikan tabel kebenaran, D-FF mengambil data dari input seiring dengan diaktifkannya Clock. Kemudian D-FF menahan statusnya (datanya) selama mungkin selama adanya listrik pada-nya. Flip-flop type D inilah yang menjadi komponen utama dari RAM statis berkecepatan tinggi. Dan digunakan sampai sekarang.

Gambar 0-8. Flip-flop type D

SubBAB 0-3: Bagian dalam komputer Pada bagian ini kita akan mengenalkan organisasi dari kerja internal dari sebuah komputer. Model yang digunakan adalah secara umum, namun konsep yang dibahas dapat diaplikasi pada semua komputer, termasuk IBM PC, PS/2, dan yang kompatible lainnya. Sebelum itu, akan sangat membantu jika kita me-review definisi dari beberapa terminologi yang digunakan secara luas dalam literatur komputer seperti K, mega, giga, byte, ROM, RAM, dan seterusnya.

Beberapa terminologi yang penting Salah satu dari sekian banyak kelebihan terpenting dari komputer adalah berapa banyak jumlah memory yang dimilikinya. Kemudian kita dapat merujuk jumlah memory yang digunakan pada IBM PC atau yang kompatible. Mengingat apa yang sudah didiskusikan sebelumnya bahwa bit adalah binary digit yang hanya mungkin bernilai 0 dan 1. Sementara byte adalah sebutan untuk 8-bit. Sementara Nibble adalah setengah dari byte, yakni 4-bit. Word adalah 2 byte, atau 16-bit. Berikut ini adalah ilustrasi yang menampilkan ukuran relatif dari unit-unit tersebut. Tentu saja bahwa semua itu bisa dibangun dari logika 0 dan 1. bit 0 nibble 0000 byte 0000 word

0000 0000 0000 0000

0000

adalah 210 bytes, yng mana adalah 1024 bytes. Singkatan K kemudian digunakan sebagai kilobytes ini, misalnya sebuah floppy disk memiliki kapasitas 356K bytes. Megabytes (M) adalah 220 bytes, yang mana berarti 1.048.576 bytes (lebih dari 1 juta). Kemudian Gigabytes (G) adalah 230 bytes (lebihdari 1 milyar), dan Terabyte (T) adalah 240 bytes (lebih dari 1 triliun). Contoh tentnag bagaimana orang menerapkan aturan ini, seperti pada sebuah komputer yang memiliki 16 Mbyte memory. Yang berarti 16 x 220atau 24 x 220 atau 224. Sehingga 16 Mbytes berarti adalah 224 bytes.
Kilobyte

Dua tipe memory yang paling terkenal adalah RAM ( Random Access Memory) dan ROM (Read only Memory). RAM digunakan menyimpan data sementara saat program berjalan. Data di dalamnya akan hilang saat komputer dimatikan. Karena inilah RAM juga disebut dengan volatile memory. ROM berisikan program dan informasi paling mendasar untuk operasi dari komputer. Informasi dari ROM ini adalah bersifat permanen, dan tidak bisa diubah oleh user, dan tidak hilang jika komputer dimatikan. Sehingga juga disebut dengan non volatile memory.

Organisasai Internal dalam komputer Bagian internal pada setiap komputer dapat dipisahkan menjadi 3 bagian: CPU (Central Processing Unit), memory, dan peralatan I/O (Input/Output). Fungsi dari CPU adalah untuk menjalankan informasi yang tersimpan pada memory. Sedang fungsi dari peralatan I/O seperti Keyboard, monitor Video digunakan oleh user manusia untuk berkomunikasi dengan CPU. CPU terhubung dengan memory dan I/O dengan menggunakan jalinan kabel yang disebut dengan bus(berumbung yang berisi banyak). Bus di dalam komputer membaca informasi dari satu tempat ke tempat lain, mirip dengan bus di jalan raya, yang datang mengangkut orang-orang dari tempat yang satu ke tempat yang lain. Pada setiap komputer ada 3 tipe dari bus ini, yakni bus alamat, bus data dan bus kontrol.

Agar peralatan lain (memory dan I/O) dimengerti oleh CPU, mereka harus menduduki alamatnya sendiri. Alamat yang diberikan harus unik, dan tidak boleh ada 2 peralatan yang menduduki alamat yang sama. CPU mengambil alamat (tentu saja dalam biner) pada bus alamat, dan unit rangkaian decoder yang kemudian menemukan atau menetukan alamat sebenarnya dari peralatan tersebut. Kemudian CPU menggunakan bus data untuk mengambil data dari peralatan itu, atau untuk megirimkan data pada peralatan tersebut. Bus kontrol digunakan untuk menyelenggarakan proses read/write tersebut dengan mengirimkan sinyal-sinyal yang mem-beri-tahu-kan bahwa CPU membutuhdan data atau hendak mengirimkan data. Dari 3 bus ini, bus alamat dan bus data yang menjelaskan kemampuan dari CPU.

Gambar 0-9 bagian dalam CPU

Penjelasan lebih jauh tentang bus data Mengingat bus-bus data digunakan untuk membaca informasi dari dan ke CPU, semakin banyak bus yang tersedia, maka semakin bagus sebuah CPU itu. Jika sesorang berfikir bahwa bus-bus data adalah jalan tol, maka semakin lengang jalan tersebut maka semakin baik hubungan antara CPU dan peralatan eksternal lainnya (misalnya Printer, RAM, ROM, seperti pada gambar 0-10). Dengan cara yang sama, bahwa meningkatkan jumlah bus akan membuat meningkatnya jumlah

biaya dari pembuatan system tersebut. Bus data yang lebih banyak akan membuat harga CPU atau computer menjadi lebih mahal. Ukuran yang umum dari bus-bus data ini adalah di antara 8 s/d 64 bit. Komputer kuno seperti Apple2 menggunakan bus data 8-bit, sementara super-computer seperti Cray menggunakan data bus 64-bit. Data bus adalah bersifat 2 arah, mengingat CPU akan menggunakan mereka untuk mengiriman dan menerima data sekaligus. Kekuatan pemrosesan pada komputer berkaitan erat dengan ukuran dari bus, mengingat bus 8-bit hanya dapat mengirimkan data 1 byte dalam sekali kirim, sedang bus 16-bit dapat mengirimkan data 2 byte dalam sekali kirim.

Lebih jauh tentang bus alamat Karena bus alamat digunakan untuk menentukan identitas dari masing-masing peralatan atau memory yang terhubung pada CPU, maka semakin besar bus yang ada, semakin besar pula jumlah paralatan yang mungkin dapat dihubungkan kepadanya. Degan kata lain, jumlah dari bus alamat CPU menjelaskan jumlah lokasi yang mana dia mampu berkomunikasi. Jumlah lokasi tersebut selalu equal dengan 2x, dimana x berarti jumlah dari jalur bus alamat, seperti yang ada pada bus data. Misalnya CPU memiliki jalur alamat 16, yang dapat mengalamati 65.536 (116 atau 64K byte) dari alamat-alamat memory. Setiap lokasi dapat diartikan untuk mengalamati 1 byte data. This is due to the fact that all generalpurposes microprocessor CPUs are what called byte addressable. Misalnya juga, sebuah PC IBM 80186 yang memiliki jalur alamat 24 buah dan jalur data 16 buah. Dalam hal ini total memory yang bisa dialamati adalah 16 megabytes (224 = 16 MB). Dalam contoh ini maksudnya adalah terdapat 224 lokasi memory, karena setiap lokasi adalah 1 byte, sehingga total adalah 16 megabyte memory yang bisa dialamati oleh komputer tersebut. Bus address (alamat) ini adalah tergolong sebagai unidiretional bus, yang mana berarti bahwa CPU menggunakan bus alamat ini hanya untuk mengirim keluar alamat-alamat. Singkatnya : Total jumlah dari lokasi memory yang bisa dialamati yang diberikan CPU selalu equal dengan 2x, di mana x adalah jumlah bit alamat, seperti yang terjadi pula pada bus data.

Gambar 0-10 : Organisasi Internal, dalam Komputer

CPU dan hubugannya dengan RAM dan ROM Agar CPU dapat memproses informasi, data harus disimpan pada dalam RAM atau ROM. Fungsi dari ROM dalam komputer adalah untuk memberikan informasi yang mana informasi tersebut bersifat tetap dan permanen. Informasi ini bisa seperti table dari pola karakter yang mungkin digunakan untuk menampilkan hasil perhitungan pada display monitor, atau program yang esensial (mendasar) agar komputer dapat bekerja, misalnya program untuk menguji atau menghitung jumlah RAM yang terpasanag dalam system, dan menampilkan hasilnya pada layar monitor. Hal ini berbeda dengan RAM yang digunakan untuk menyimpan informasi yang tidak bisa permanen. Dan dapat diubah-ubah setiap saat. Misalnya untuk komputer IBM PC, RAM diubah oleh beberapa operating system berbeda atau aplikasi lain, misalnya Word Proccessing atau Penghitung Pajak dll. Aplikasi ini di-load ke dalam RAM, kemudian CPU menjalankan program yang telah di-load tersebut. CPU mungkin tidak dapat menjalankan program langsung dari disk, karena disk memiliki kecepatan yang sangat rendah. Atau denga kata lain, CPU hendak mengambil informasi untuk diproses, pertama dilihat dari RAM atau ROM. Jika ternyata tidak ada maka CPU akan mencarinya di dalam Disk, kemudian menyalin isinya pada RAM. Untuk alasan ini RAM dan ROM disebut dengan primary memory dan disk disebut sebagaisecondary memory. Gambar 0-11 menunjukkan diagram blok dari organisassi internal dari sebuah PC.

Dalam mikrokontroller, yang umumnya hanya memiliki hanya 1 buah program yang disimpan dalam ROM. Dan CPU dapat menggunakan RAM untuk menyimpan variable-variable tertentu yang digunakan untuk keperluan dalam program tersebut. Misalnya untuk menyimpan data yang dibaca dari port. Atau menyimpan kerakter yang nanti hendak ditampilkan pada Monitor.

Bagian dalam CPU Program disimpan dalam memory untuk memberikan instruksi pada CPU agar dia dapat berjalan. Kerja dari CPU ini secara sederhaa adalah untuk menambha data seperti meis kasir atau mengontrol mesin seperti robot. Hal ini adalah fungsi dari CPU untuk mnerima inforamsi dari memory (fetch) dan kemudian menjalankannaya (execute). Untuk menyelenggarakan fetch and executeterssebut CPU harus dilengkapi dengan sumber daya semacam berikut: 1. Salah satu hal yang penting dari CPU adalah adanya beberap abuahregsiter. CPU mengunakan register untuk menyimpan informasi secara sementara. Informasi mungkin 2 jenis, yakni sebauh nilai yang bisa langsung diproses, atau sebuah nilai dari sebuah alamat dari sebuah nilai lain yang harus diambil untuk bisa diproses. register dalam CPU bisa 8-bit, 16-bit, 32-bit atau 64-bit, tergantung dari seberap aperkasanya CPU. Sehingga CPU yang baik harusnya memiliki register yang banyak dan besar. Tentu saja dengan demikian tingkat kesulitan pembuatannya juga semakin tinggi, sehingga semakin mahal harganya. 2. CPU harus juga memiliki ALU ( Aritmatic/Logic Unit). Bagian ALU dalam CPU adalah yang paling bertanggung jawab ataas proses perhitungan matematika seperti add, subtract, multiply, divide, dan dungsi logika seperti AND, OR, XOR dan NOT. 3. Setiap CPU harus memiliki apa yang disebut dengan Program Counter. Fungsi dari Program Cotner ini adalah untuk menunjuk alamat dari instruksi yang hendak dilaksanakan.. Setaip satu instruksi dilaksanakan, maka isi program counter ini akan di-INC-rement ke alamata selanjutnya untuk dilaksanakan kemudian. Dalam mikro kontroller

program Counter ini disingkat sebagai PC, sedang pada komputer IBM -PC disebut dengan IP atau Instruction Pointer. 4. Fungsi dari instruction decoder adalah mengartikan instruksi yang diterima oleh CPU. Orang bia berfikir bahwa instruction decoder ini adalah sbeuah kamus, yang menyimpan arti dari setiap instrukis dan apa yang harus dikerjakan oleh CPU setelah menerima instruksi tersebut. Persis seperti kamus, semakin banyak instrkki yang hendak diartikan, maka semakin banyak instruksi yang bis diterjemahkan oleh CPU, dan juga semakin banyak jumlah transistor yang harus ditanam ke dalam CPU.

Proses kerja dalam komputer Untuk mendemonstrasikan beberapa konsep yang dibahas sebelumnya, analisys langkah demi langkah dari proses CPU akan menuntun kita, yakni dengan cara menambhakan 3 nilai berbeda yang akan ditemui nanti. Menganggap bahwa seolah CPU memiliki register-regsiter sebutlah A, B, C, dan D. Dia juga memiliki 8-bit bus data dan bus alamat 16-bit. Sehingga CPU dana mengakses emory dari alamat 0000h s/d FFFFh (untuk jumlah total 10000h). Tindakan yang harus dilakukan adalah CPU harus mengambil nilai heksadesimal 21 dan menyimpannya pada register A, dan kemudian menambahkannya dengan nilai 42h dan 12h. Anggaplah bahwa kode untuk CPU tersebut untuk memindahkan nilai pada register A adalah 1011 0000 (B0h) dan kode untuk menambahkan nilai pada register A adalah 0000 0100 (04h). Langkah yang penting dan kode untuk melaksanakannya adalah seperti berikut ini. Tindakan Salin nilai 21h pada register A Tambahkan nilai 42h pada register A Tambahkan nilai 12h pada register A Kode 80h 04h 04h Data 21h 42h 12h

Jika program untuk melakukan tindakan seperti di atas adalah tersimpan pada memory pada lokasi dimulai dari 1400h, berikut ini adalah isi memory selengkapnya sesuai dengan kode di atas.

Alamat memory 1400 register A 1401 1402 register A 1403 1404 register A 1405 1406

Isi dari alamat memory (B0) kode untuk memindahkan nilai ke (21) nilai yang hendak dipindah (04) kode untuk menambahkan nilai ke (42) nilai yang hendak dipindah (04) kode untuk menambahkan nilai ke (12) nilai yang hendak dipindah (F4) kode untuk HALT

Tindakan yang diambil oleh CPU untuk menjalankan program di atas adalah seperti berikut ini: 1. Program-Counter (CP) dapat bernilai di antara 0000 s/d FFFFh. Program-Counter harus diatur pada 1400h (lokasi instruksi pertama dari program di atas). Setelah programcounter siap, yakni dengan menunjuk alamat instruksi pertama yang akan segera dilaksanakan 2. CPU mengaplikasikan 1400h pada bus alamat dan mengirimkannya keluar. Rangkaian memory Menentukan lokasi yang diminta oleh CPU, dan kemudian CPU menerbitkan perintah sinyal READ, yang mengindikasikan kepada memory, bahwa CPU membutuhkan data byte pada lokasi 1400 tersebut. Hal ini membuat isi dalam lokasi 1400h, yakni B0h, kemudian dikirimkan oleh memory pada CPU melalui bus data. 3. CPU kemudian menterjemahkan instruksi B0 tersebut dengan menggunakan bantuan kamus milik Instruction Decoder. Saat mencari definisi dari instruksi tersebut, kemudian diketahui bahwa instruksi tersebut ternyata berarti CPU harus membaca data yang letaknya berada pada lokasi memory selanjut (1401h), yang harus dikirimkan kepada register A. Saat data 21h dikirimkan oleh CPU dari memory lokasi 1401h ke dalam register A tersebut, CPU harus memastikan bahwa pintu-pintu pada register yang lain harus tertutup, kecuali untuk register A. Sehingga nilai 21h tersebut dapat dikirimkan langsung pada register A. Seteleh menyelesaikan instruksi ini, maka Program-Counter akan menunjukkan instruksi selanjutnya. Yakni dalam hal ini adalah menunjuk lokasi memory 1402h. Alamat 1402 dikirim kemudian oeh CPU, sebelum CPU membaca instruksi berikutnya.

4.

Dari lokasi memory 1402h dikirim kode 04h. Setelah diterjemahkan ternyata berarti, ada sesuatu yang harus ditambahkan pada register A. Yakni byte yang lokasinya setelah instruksi, yakni lokasi 1403h. Setelah membawa data tersebut ke dalam CPU (yakni 42h), maka oleh peralatan ALU ke dua bilangan tersebut ditambahkan. Setelah proses penambahan terjadi maka hasil dari ALU tersebut dikembalikan pada register A lagi. Sementara itu Program-Counter sekarang telah menunjuk alamat 1404h, sebagai alamat dari instruksi selanjutnya. 5. Alamat 1404h diberikan pada bus alamat, dan datanya diberikan pada CPU, diterjemahkan, dan dijalankan. Kode ini ternyata juga melakukan penambahan terhadap register A. Kemudian Program-Counter menjadi 1406h. 6. Terakhir, isi dari alamat 1406 ini diambil dan dijalankan. Ternyata adalah perintah HALT. Yang memerintahkan CPU untuk berhenti bekerja dan tidak menambahkan isi PC (Program-Couter) lagi untuk menanyakan instruksi berikutnya. Setelah CPU dipaksa keluar dari kondisi HALT, maka komputer kembali menambahkan PC dan menjalankan instruksi berikutnya. Sekarang bagaimana jika alamat 1403 isinya kita ubah dari 42 menjadi 04. Bagaimana komputer dapat membedakan kemudian dengan kode 04 atau data 04 yang akan ditambahkan? Ingat bahwa kode 04 untuk CPU ini adalah berarti memindahkan nilai berikutnya kepada register A. Sehingga komputer tidak perlu untuk men-dekode-kan lagi data byte berikunya. Dia akan segera untuk memindahkan isi dari memory tersebut pada register A.

Gambar 0-11 Blok diagram internal dari CPU

RINGKASAN System bilangan biner merepresentasikan semua bilangan dengan kombinasi dari digit-digit biner, yakni 0 dan 1. Penggunaan system biner dibutuhkan komputer digital karena hanya 2 hal itu yang direpresntaskan komputer, yakni On dan Off. Segala jenis bilangan biner dapat diubah dan dikonversi menjadi padanannya dengan heksadesimal, dan begitu pula sebaliknya. Bilangan kode ASCII adalah bilangan biner yang merepresentasikan data alphanumerik dalam proses internal CPU. Gerbang logika AND, OR dan Inverter adalah dasar dari membangun rangkaian blok sederhana. Gerbang NAND, NOR, dan

XOR juga digunakan untuk mengimplementasikan desain rangkaian. Diagram half-adder dan full-adder diberikan berikut contohnya dalam penggunaan gerbang logika untuk desain rangkaian. Decoder digunakan untuk mendeteksi alamat-alamat. Flip-flop digunakan untuk mengunci data sampai rangkaian lain mengubahnya. Komponen utama dari berbagai system komputer adalah CPU, memory dan paralatan I/O. Memory terbagi menjadi 2 jenis, yakni sifatnya yang sementara dan/atau permanen dalam menyimpan data. Dalam beberapa komputer, memory diakses dalam byte atau word. Istilah Kilobytes, megabytes,Gigabytes, dan Terabytes digunakan untuk menyingkat jumlah byte yang sangat banyak. Ada 2 jenis utama dari sebuah memory, yakni RAM dan ROM. RAM (Random Access Memory) digunakan untum menyimpan data/kode secara sementara. Sementara ROM (Read Only Memory) digunakan untuk menyimpan data/kode secara permanen, yang biasanya ini digunakan oleh CPU untuk menyimpan instruksi-istruksi yang akan dijalankan agar CPU dapat bekerja. Semua komponen dari system komputer dapat dikontrol oleh CPU. Peralatan pelengkap semacam I/O (input/output) memberian kesempatan pada CPU untuk berkomunikasi dengan manusia atau juga system komputer yang lain. Ada 3 tipe bus untuk sebuah komputer: bus alamat, bus data, dan bus kontrol. Yang bus-bus ini digunakan CPU untuk menghubungi peralaan lainnya. Bus data digunakan untuk mengirimkan inforamasi di antara CPU dan peralatan lainnya. Terakhir bab ini memberikan ulasan singkat dalam hal logika digital.

Tutorial MCS-51 Mikrokontroler 8051


February 24th, 2011 Musbikhin

BAB 1 Mikro Kontroler 8051


Sasaran Setelah anda menamatkan bab ini , diharapkan anda dapat : - Membandingkan dan membedakan microprocessor dan microcontroller. - Menjelaskan kelebihan Microkontroller dalam beberapa aplikasi. - Menjelaskan konsep dari system embedded. Menjelaskan kreteria mikrokontroller. yangharus dipertimbangkan dalam memilih

- Menjelaskan variasi dari kecepatan, kemasan d, memory dan harga per unit serta aspek tersebut berpengaruh dalam memilih microkontroller. - Membandngkan dan membedakan variasi dari keluarga 8051. - Membandingkan mikrokontroller yang ditawarkan oleh beberapa pabrik. Pada bab ini dimulai dengan mendiskusikan aturan dasar dan hal penting dari mikrokontroller dalam kehidupan sehari-hari. Dimulai dari subBAB 1-1 kita akan mendiskusikan creteria yang harus dipertimbangkan dalam emmilih sebuah microcontroller, seperti hal microcontroller yang tersedia dalam pasar. SubBAB 12 adalah membahas tentang berbagai variasi dari keluarga 8051 seperti 8052 dab 8031, dan beberapa kelebihan dan kekurangan masing-masing. Selanjutnya kita akan membahas versi yang lain dari 8051 seperti 8751, AT89C51, dan DS5000. SubBAB 1.1: MikroKontroller dan Prosesor Terintegrasi Dalam sub bab ini kita mendiskusikan kebutuhan mikro controller yang berbeda dengan mikro prosesssor kegunaan umum seperti Pentium dan prosessor x86 lainnya. Kita juga melihat aturan-aturan yang berkaitan dengan microcontroller dalam pasar yang lebih luas. Selebihnya, kita memberikan kreteria dalam bagaimana memilih sebuah microcontroller. Mikro Kontroller dan mikro prosesor kegunaan umum Apa perbedaan antara mikro prosesor dan mikro controller? Mikro prosesor disebut juga dengan CPU (central Prosesing Unit) karena semua data diolah dan dimanipulasi olehnya. Mikro prosesor dapat juga diartikan sebagai

Gambar 1-1 System Microprocessor dibanding dengan Systen Microkontroller

mikro prosesor kegunaan umum (General Purpose Processor), seperi keluarga Intel x86 ( 8086, 80286, 80386, 80486, pentium dst) atau keluarga Motorolla 68000 (68000, 68010, 68020, 68030, dst). Mikro prosesor ini tidak dilengkapi dengan RAM, ROM, port I/O di dalam chip-nya. Oleh karena itu mereka kemudian dinamakan mikro prosesor kegunaan umum, karena memang prosesor semacam ini tidak dirancang untuk satu tugas tertentu saja. Pembuat system yang menggunakan mikro prosesor kegunaan umum seperti Pentium atau 68040 harus menambahkan RAM, ROM, port I/O, dan beberapa chip lain, sehingga akan membuat system ini akan nampak berukuran besar dan mahal. Namun pembuat system ini dapat memutuskan jumlah dari RAM, ROM, atau port I/O yang digunakannya secara tepat agar cukup untuk melaksanakan tugas seperti yang diinginkannya, atau agar dapat dimungkinkan suatu saat konfigurasinya dapat diubah dengan mudah. Hal tersebut berbeda dengan mikro [Link] controller memiliki CPU ( Mikro Prosesor ) di dalamnya, ditambah dengan sejumlah RAM, ROM, dan Port I/O, Timer yang kesemuanya tergabung hanya dalam satu chip. Bahkan untuk berbagai aplikasi kita tidak perlu lagi menambahkan RAM, ROM, port I/O external. Dengan jumlah yang tetap tersebut, mikro controller menjadi ideal untuk digunakan dalam aplikasi yang mana biaya dan ukuran menjadi sangat penting. Misalnya untuk sebuah remote control untuk TV, kita tidak butuh kekuatan pemrosesan data seperti yang dimiliki prosesor kegunaan umum semacam 486, Pentium, dst. Karena untuk remote control, ukuran, harga per unit-nya jauh lebih penting ketimbang kekuatan komputasi. Aplikasi tersebut hanya membutuhkan beberapa port Input Output untuk membaca data serta untuk menghidup-matikan beberapa bit. Nah untuk alasan ini prosesor semacam ini juga disebut IBP Itty Bitty Processors (baca Good Things in Small Package Are Generating Product Opportunities oleh Rick Grehan dari majalah BYTE, September 1994, [Link] untuk pembahasan tentang mikrokontroller). Perihal yang baik untuk diperhatikan adalah sekarang ini beberapa produsen mikrokontroller sudah melengkapi chip tidak saja untuk pemroses data digital,

namun sudah dilengkapi dengan ADC (Analog To Digital Converter) dan RTC (Real Time Clock), yang kesemuanya dapat kita peroleh dengan hanya satu keping chip dengan harga yang sangat murah. Mikrokontroller sebagai system mandiri Dalam berbagai literatur yang membahas mikroprosesor, kita akan selalu menemukan istilahembedded system. Mikroprosesor dan mikrokontroller dewasa ini sudah digunakan sebagaiembedded system.
Penterjemah: Sebenarnya saya tidak menemukan istilah yang tepat untuk embedded system. Akhirnya saya putuskan untuk menggunakan istilah terintegrasi. Mengingat filosofi-kata-nya adalah system yang sudah jadi, lengkap, dan bisa digunakan oleh kebanyakan orang dengan sedikit interaksi user. Interaksi yang ada pun adalah langsung berhubungan dengan fungsi system.

Produk system embedded menggunakan mikroprosesor atau mikrokontroller untuk melakukan satu tugas saja. Printer misalnya adalah contoh sebuah system embedded, mengingat prosesor di dalam printer hanya melakukan satu tugas saja, yaitu menerima data dan kemudian mencetaknya. Hal sangat berbeda dengan PC yang berbasis Pentium (atau yang kompatibel dengan X86 lainnya). Sebuah PC dapat digunakan untuk melakukan berbagai pekerjaan, misalnya untuk mengolah kata, melakukan pengaturan pencetakan, penghitung keuangan kasir, video game, network server, atau terminal internet. Software untuk berbagai aplikasi tersebut dapat di-load ke dalam PC dan dijalankan, maupun dihapus. Tentu saja kenapa PC bisa melakukan berbagai hal tersebut karena software di-load ke dalam memory, dan OS (Operating System) yang kemudian menjalankannya. Sementara untuk embedded system, dia hanya memiliki satu software yang biasanya disimpan di dalam ROM. PC berbasis X86 bisa saja memiliki system embedded di dalamnya atau terhubung dengan system embedded lainnya semacam keyboard, disk kontroller, sound card, CD_ROM driver, mouse dan selanjutnya. Setiap peralatan tersebut memiliki prosesor di dalamnya, yang hanya melakukan satu tugas saja. Misalnya mouse, dia hanya bertugas mencari posisi mouse, dan mengirimkan data posisi tersebut kepada PC. Tabel 1-1 adalah daftar dari barang produksi system embedded.
Tabel 1-1 beberapa contoh produk embedded menggunakan microcontroller

Rumah Tangga Interkom Telephone Mesin Penjawab Tuner TV Kabel Video Games Mesin Fax VCR

System keamanan Pembuka Pintu Garasi Komputer rumah ComCorder TV

Remote Controls Mesin cukur Mainan anak-anak

Telpon Selular Alat Musik Mesin PinBall

Pengendali Cahaya Camera Alat Latihan

Kantoran Telephone Microwave Paging telpon

Computer

System Keamanan Mesin Fax printer warna

Mesin fotokopi printer laser

Automation lainnya Komputer jinjing pengendali mesin Instrumentasi

Kantong udara

ABS (rem mobil) Hiburan

Pengendali Transmisi System Keamanan telpon selullar pintu tanpa kunci dll

Pengendali Cuaca

PC X86 dengan aplikasi terintegrasi Walaupun mikrokontroler adalah pilihan utama yang diguakan sebagaian besar system embedded, namun ada kalanya mikrokontroller tersebut tidak cukup memadai untuk sebuah aplikasi. Oleh karena itu, pada tahun-tahun belakangan ini produsen top dunia semacam Intel, AMD, Motorolla, Cyrix, membidik pasar produk terintegrasi ini khususnya segmen high-end. Sementara ini Intel, AMD, dan Cyrix masih mengandalkan prosesor jenis X86 mereka untuk kebutuhan pasar embedded maupun untuk pasar desk-top PC. Sedang Motorolla masih bertahan dengan keluarga 68000 dan membidik target pasar system embedded high end. Walaupun akhir-akhir ini Apple sebagai produk unggulan Motorolla tidak lagi menggunakan prosesor keluarga 68000. Dewasa ini apple malah menggunakan prosesor yang disebut POWER PC hasil dari kolaborasi Motorolla dengan IBM yang tujuannya untuk membidik pasar PC kelas atas. Bahkan kabar terakhir yang saya dengar, Apple juga menggunakan Intel Pentium. Loh loh loh (yang itu tambahan saya sendiri). Harap diingat bahwa produk-produk yang dirancang untuk pasar system embedded mengoptimalisasi prosesornya untuk kebutuhan system embedded tersebut. Untuk alasan ini prosesor semacam ini akhirnya dapat disebut sebagai high end embedded processors. Dengan kata lain kita dapat menyamakan derajatnya antara kata embedded prosessor dengan microcontroller dalam hal fungsi dan kegunaannya. Namun bukan dalam kekuatan pemrosesan datanya. Salah satu yang menjadi pertimbangan system embedded adalah berkurangnya konsumsi listrik dan ukurannya. Hal ini bisa dilakukan dengan mengintegrasikan beberapa fungsi/chip ke dalam sebuah chip saja. Semua system yang terinegrasi (embedded) yang berbasis x86 atau 6800 memiliki konsumsi listrik yang sangat kecil ditambah dengan beberapa port I/O , port COM, dan ROM yang kesemuanya dibungkaus dalam satu chip saja. Untuk system prosesor terintegrasi dan berunjuk kerja tinggi ini, adalah menjadi sebuah trend untuk terus mengintegrasikan komponen-komponen misalnya dari 50 IC menjadi 39 Ic, lalu menjadi 20 IC, terus menjadi 5 IC, sampai dimungkinkan terjadinya ukuran yang kecil dan biaya yang sangat murah.

Asaasasasasasas Sekarang ini mengingat standarisasi MS-DOS dan Window, akhirnya beberapa system embedded akhirnya menggunakan PC x86. Dalam beberapa kasus system embedded yang menggunakan x86, dewasa ini tidak saja menghemat biaya, namun dapat mempersingkat pembangunan program, dengan banyaknya software dan library yang siap pakai untuk DOS maupun untuk Windows. Dan kenyataannya Windows adalah yang paling banyak digunakan dan paling dimengerti orang dalam pengembangan system yang berbasis Windows, dengan tujuan akhir adalah untuk menghemat biaya, dan waktu pengembangan program. Memilih Microcontroler Dewasa ini ada 5 mikrokontroler 8-bit yang paling terkenal. Masing-masing adalah 6811 milik Motorolla, 8051 milik Intel, Z8 milik Zilog, dan PIC16X milik Microchip Technology dan AVR milik Atmel. Masing-masing mikrokontroller di atas memiliki set instruksi berbeda dan memiliki set register yang berbeda pula. Atau dengan kata lain masing-masing produk adalah tidak kompatibel. Program yang ditulis untuk salah satunya tidak akan jalan pada yang lainnya. Bahkan sekarang ini sudah ada berbagai kelas dalam mikro kontroller, termasuk mikrokontroller 16-bit sampai 32-bit. Dengan banyaknya jenis mikro kontroller tersebut mana yang paling tepat untuk kita pilih? Ada tiga kategori untuk memilihnya, (a) sesuaikan dengan tingkat komputasi yang kita inginkan untuk dapat melakukan tugas dengan efisien dengan biaya yang efektif, (b) ketersediaan software pengembangan program, semacam kompiler, assembler, dan termasuk debugger. Dan yang terakhir (3) ketersediaan secara luas di pasaran, dan kesinambungan produksinya oleh produsen. Juara tahun 80-an adalah Zilog, lalu Intel, sekarang yang lagi trend adalah AVR Atmel. Namun Intel masih menjadi raja dalam hal ALU-nya. Kreteria-kreteria dalam memilih microcontroller 1. Pertama adalah hal yang paling mendasar dlam memilih sebuah mikro kontroller adalah mencocokan tugas yang bisa dikerjakan dan biaya yang pas. Untuk mengetahui kebutuhan dari proyek berbasis mikro kontroller adlah berapa resolusi komputasi yang diinginkan, apa 8-bit, 16-bit, ataukah 32-bit yang dibutuhkan untuk tugas tertentu. Selanjutnya dari kategori itu adalah : (a) Speed. Berapa kecepatan maksimum yang bisa diberikan ? (b) Packaging. Kemasan apa yang tersedia, dan yang kita inginkan. Ini sangat penting dalam hal pembuatan desain PCB dan ukuran total desain. (c) Konsumsi daya. Ini menjadi sangat penting jika system dijalankan dari tenaga baterei. (d) Jumlah RAM dan ROM dalam chip. (e) Jumlah pin I/O dan jumlah Timer dalam Chip

(f) Apakah mudah untuk meng-upgrade atau mengganti Chip dengan versi yang lebih baik nantinya. (g) Biaya per Unit. Hal yang terpenting lainnya adalah biaya akhir dari produk dimana mikorkontroller digunakan. Misalnya selisih 50 rupiah jika kita membeli sebanyak 100.000 unit 5 juta rupiah bukan nilai yang sedikit bukan ?! 2. Kreteria ke dua dalam memilih mikro kontroller adalah sebagaimana mudahnya untuk melakukan pemgembangan produk tersebut nantinya. Kuncinya adalah ketersediaan assembler, debugger, kompiler bahasa C kode praktis, emulator, tehnical support dari lingkungan sekitar maupun dari luar negeri. Dalam beberapa hal ada baiknya mempertimbangkan produk dari pihak ketiga, (misalnya BASCOM, TS Emulator, dll) yang biasanya cukup baik, walaupun support dari pabrik chip yang bersangkutan adalah yang harus paling dipertimbangkan. 3. Kreteria ke tiga dalam memilih mikrokontroller, asdasdasd
Table 1-2 Beberapa perusahaan yang membuat keluarga 8051

Perusahaan Situs Web | Intel [Link]/design/mcs51 | Atmel [Link] | Philips/Signetic [Link] | Siemens [Link] | Dallas Semiconductors [Link] |

SubBAB 1.2 : Sekelumit tentang keluarga 8051 Pada SubBAB ini pertama kita akan melihat beberapa anggota keluarga mikrokontroller 8051 dan kelebihan-kelebihan internalnya. Termasuk juga kita akan melihat perbedaan manufaktur 8051 dan apa yang ditawarkan dari setiap produknya. Ulasan sejarah dari 8051 Pada 1981, perusahaan Intel memperkenalkan mikrokontroller 8-bit yang disebut 8051. Mikrokontroller ini memiliki 128 RAM, 4K byte ROM dalam Chip, 2 Timer, 1 port serial, dan 4 port I/O (masing-masing sebanyak 8-bit) yang kesemua ada dalam satu chip. Oleh karena kelengkapan tersebut itu kadang juga disebut System On Chip. 8051 adalah prosesor 8-bit, sehingga CPU hanya bisa memproses data 8-bit setiap sekali kerjanya. Data yang lebih besar harus dipisah-pisah menjadi beberapa data 8-bit untuk bisa diproses oleh CPU ini. 8051 total memiliki empat I/O port, yang masing-masing adalah selebar 8-bit. Lihat gambar 1-2. Walaupun 8051 dapat ditanamkan maksimum 64 kbytes memory program ROM di dalam chip itu sendiri, namun beberapa pabrik hanya memberikan hanya 4 Kb atau 8 Kb saja. Hal ini akan kita diskusikan lebih mendalam nanti.

8051 kemudian menjadi sangat terkenal setelah Intel menyilahkan pabrik lain untuk membuat dan menjual chip 8051 dalam berbagai model dan kelebihan. Semuanya dipersilahkan dengan syarat bahwa semua kode instruksi yang digunakan harus (masih) kompatibel dengan 8051 asli. Hal ini membuat munculnya beberapa turunan dari 8051 yang berbeda-beda, baik kecepatannya, jumlah ROM dalam chip. Bahkan selusinan lebih, pabrik yang bisa membuat turunannya tersebut. Selanjutnya kita akan membahas beberapa jenis di antaranya. Ingat bahwa dari sekian perbedaan kecepatan dan jumlah ROM, kesemuanya masih kompatibel dengan versi aslinya. Artinya, bahwa jika anda menulis kode untuk satu jenis 8051, maka kode tersebut pasti akan jalan pada jenis 8051 yang lain. Mikokontroller 8051 8051 adalah anggota keluarga yang asli dari keluarga 8051. Intel menyebutnya sebagai MCS-51. Tabel 1-3 menunjukkan isi dalam 8051.
Tabel 1-3 Isi/Fitur dari 8051

Fitur Banyaknya ROM 4K bytes | RAM 128 bytes | Timer 2 | Pin I/O 32 | Port Serial 1 | Sumber Interupsi 6 |

Gambar 1-2 Blok Diagram bagian dalam MicroController 8051

Anggota keluarga 8051 yang lain 8052 adalah anggota keluarga 8051 yang lain. 8052 memiliki apa yang dimiliki oleh 8051 standar dengan ditambah lagi lebih banyak 128 byte RAM, dan satu tambahan Timer. Sehingga dengan kata lain 8052 meiliki 256 byte RAM dan 3 Timer. Dan juga untuk ROM programnya lebih banyak 4 Kb menjadi 8 Kb. Lihat Tabel 1-4
Tabel 1-4 Perbandingan antara keluarga utama 8051

Fitur 8051 8052 8031 | ROM (On-Chip dlm bytes) 4K 8K 0 | RAM (dlm bytes) 128 256 128 | Timer 2 3 2 | Pin I/O 32 32 32 | Port Serial 1 1 1 | Sumber Interupsi 6 8 6 | Seperti yang kita lihat pada Table 1-4, apa yang dimiliki 8051 juga dimiliki oleh 8052, sehingga program yang digunakan untuk 8051, akan dapat bekerja dengan baik pada 8052. Namun sebaliknya program yang digunakan untuk 8052 belum tentu bekerja pada 8051. Microcontroller 8031 Anggota keluarga lain dari 8051 adalah chip 8031. Chip ini juga disebut ROM-les 8051, karena memang chip ini adalah anggita keluarga 8051 yang sama sekalu tidal emjiliki ROM di dalamnya. Untuk menggunakna chip ini, kita harus menambahkan ROM program secara eksternal. Dari ROM tersebut-lah kode mesin akan diambil dan dieksekusi oleh 8031. Bertolak belakang dengan 8051 yang sudah memiliki ROM di dalam chipnya, sehingga tidak perlu lagi menambahkan ROM. Tentu saja program tidak boleh melebihi kapasitas yang dimiliki 8051, yaitu 4 Kb. ROM yang bisa dialamati oleh 8031 juga selebar 64 Kb. Dalam proses penambahan ROM eksternal pada 8031, kita akan kehilangan 2 port, karena 2 port tersebut akan digunakan untuk menghubungkan 8031 dengan ROM. Untuk mengatasi keterbatasan jumlah port ini kita dapat menambahkan dengan chip lain semacam 8255 untuk menambah jumlah port sebanyak 3 port lagi, sehingga kita akan mendapat total 5 buah port 8-bit. Pemasangan ROM eksternal dan 8255 akan kita bahas secara lebih dalam pada BAB 14 dalam buku ini. Disamping itu ada beberapa versi kecepatan pula untuk 8031 ini. Macam-macam Microcontroller yang lain Walaupun 8051 adalah anggota keluarga yang palig terkenal dari keluarga 8051, kita dewasa ini tidak melihat lagi chip tersebut, karena memang sudah tidak diproduksi lagi. 8051 digantikan oleh produk sejenis dengan macam-macam jenis ROM yang ditawarkan, misalnya ROM dengan jenis Ulra Violet UV_EPROM

misalnya 8751. Chip ini harus dihapus dengan menyinarinya dengan sinar Ultra Violet selama 20 menit sebelum ditulisi program yang baru. Ada juga ROM jenis Flash misalnya AT89C51 buatan ATMEL (ini paling mudah kita dapatkan selain ATMEL AT89S51). Dengan ROM jenis ini kita dapat melakukan penghapusan ROM hanya dalam hitungan milidetik. Terus ada pula yang memiliki ROM jenis NV-RAM yang bisa ditulis ulang tanpa perlu dihapus, misalnya milik DALLAS DS5000. Termasuk juga jenis OTP (One Time Programable / Bisa ditulis sekali) yang biasanya digunakan untuk aplikasi dengan produksi masal kita. Microcontroller 8751 Chip 8751 hanya memiliki 4 Kb ROM dengan jenis UV-EPROM. sdasdasd AT89C51 buatan Atmel Corporation Chip anggota keluarga 8051 yang paling terkenal bagi kalangan hobbyst ini, adalah AT89C51. Chip in dilengkapi dengan ROM berjenis Flash. Dinamakan Flash karena dalam menghapus ROM dibutuhkan waktu yang sangat cepat jauh dibanding 8751. Sehingga dalam pengembangan program kita tidak perlu lagi menunggu sekian lama untuk menghapus ROM sebelum menulis ulang chip. Jika pada 8751 kita masih membutuhkan alat khusus untuk menghapus ROM, untuk AT89C51 alat untuk menghapus sudah terdapat pada pada alat penulisnya. Ada banyak alat yang dibuat untuk menuliskan program pada chip AT89C51. Bahkan alat semacam ini dapat dibuat sendiri denganmudah dan murah. Penulisan dapat dilakukan dengan memanfaatkan serial COM pada komputer kita.
Tabel 1-5 versi-vesi dari 8051 buatan Atmel (kesemuanya menggunakan Flash)

Jenis ROM RAM Pin I/O Timer Interupt Vcc Kemasan | AT89C51 4K 128 32 2 6 5V 40 | AT89LV51 4K 128 32 2 6 3.3V 40 | AT89C1051 1K 64 15 1 3 3.3V 20 | AT89C2051 2K 128 15 2 6 3.3V 20 | AT89C52 8K 256 32 3 8 5V 40 | AT89LV52 8K 256 32 3 8 3.3V 40 | Ada beberapa variasi kecepatan dan kemasan dari produk-produk yang dikeluarkan oleh ATMEL, seperti yang disusun pada Table 1-5. Misalnya adalah AT89C51-12PC, dimana simbol C sebelum 51 adalah menunjukkan bahwa chip terbuat dari CMOS, yang merupakan semikonduktor dengan konsumsi listrik sangat rendah. Sedang 12 adalah nilai dari kecepatan maksimum. Sedang P adalah berarti plastik, yakni kemasan plastik DIP, dan C berarti Comersial. AT89C51-12PC dan AT89C51-12PC adalah versi yang paling banyak diminati pelajar di dunia, karena harganya yang murah dan memory Flash-nya dapat membuat seseorang membangun program dengan cepat.
Tabel 1-6 Berbagai kecepatan 8051 buatan Atmel

Jenis Speed pins Kemasan Penggunaan | AT89C51-12PC 12MHz 40 Plastik DIP komersial | AT89C51-16PC 16MHz 40 Plastik DIP komersial | AT89C51-24PC 24MHz 40 Plastik DIP komersial | DS5000 buatan Dallas Semiconductor Pabrik yang paling terkenal di Amerika Serikat adalah Dallas Semiconductor, yang membuat beberapa versi 8051 dengan nama DS5000, dengan berbagai versi kecepatan dan jumlah NV-RAM yang berbeda-beda. NV-RAM adalah jenis memory RAM biasa namun dengan konsumsi listrik sangat-sangat rendah, sehingga data yang tersimpan dapat bertahan sangat lama hanya dengan arus listrik yang kecil. Terlebih lagi ada kelebihan yang menjadi andalan dari Dallas ini. Yakni chip bisa didownload secara mandiri lewat komunikasi serial. Tanpa bantuan downloader khusus seperti pada versi 8051 yang lain. Beberapa kelebihan lain adalah kita dapat mengubah isi ROM Kode byte-demi-byte, tanpa harus menghapus seluruh isi ROM kode. Sesuatu yang tidak bisa dilakukan pada versi yang lain. Hal ini bisa dilakukan karena ROM kode untuk Dallas DS5000 sejatinya adalah sebuah RAM, dan bukanlah sebuah ROM, sehingga tidak dibutuhkan cara penghapusan seperti pada ROM kebanyakan.
Tabel 1-7 Variasi 8051 buatan Dallas Semiconductor

Jenis ROM RAM Pin I/O Timer Interupt Vcc Kemasan | DS5000-8 8K 128 32 2 6 5V 40 | DS5000-32 32K 128 32 2 6 5V 40 | DS5000T-8 8K 128 32 2 6 5V 40 | DS5000T-32 32K 128 32 2 6 5V 40 | Ada beberapa variasi kecepatan dan kemasan dari DS5000 seperti yang ditamilkan pada Table 1-8. Misalnya adalah DS5000-8-8 yang berbarti adalah chip yang memiliki 8kB NV-RAM dan kecepatan maksimum 8MHz. Dan versi yang paling banyak digunakan oleh pelajar di Amerika Serikat adalah type DS5000-812 atau versi yang memiliki RTC yakni DS5000T-8-12.
Tabel 1-8 Variasi kecepatan 8051 buatan Dallas Semiconductor

Jenis NV-RAM Speed | DS5000-8-8 8K 8MHz | DS5000-8-12 8K 12MHz | DS5000-32-8 32K 8MHz | DS5000T-32-8 (RTC) 32K 8MHz | DS5000-32-12 32K 12MHz | DS5000T-8-12 (RTC) 8K 12MHz | Versi OTP 8051 Ada bagian keluarga 8051 yang bersifat OTP (one-time-programable) atau dalam bahasa kita hanya bisa sekali program. Untuk versi yang memiliki ROM Flash atau NV-RAM, adalah ditujukan untuk pengembangan program. Setelah program dirasa sudah valid dan matang, baru kemudian program dapat diisikan pada chip

versi OTP ini. Chip versi ini biasanya dipilih untuk produksi masal, karena pertimbangan harga yang jauh sangat murah ketimbang versi Flash ataupun NVRAM. Anggota keluarga 8051 dari Philips Pabrik lain yang juga memproduksi versi 8051 adalah Philips Corporation. Dia juga memproduksi banyak varian dari 8051, mulai yang OTP, flash, tambahab I/O, tambahan ADC, dll. RINGKASAN Pada BAB ini kita membahas perilaku dan pentingnya mikrokontroller dalam kehidupan sehari-hari. Kita juga membedakan dan mebandingkan Mikrokontroller dan mikro prosesor. Kita juga membahas mikro kontroller sebagai system embedded ]

Pemrograman dengan Bahasa Assembler 8051


February 24th, 2011 Musbikhin

BAB 2
Sasaran Setelah anda menamatkan bab ini , diharapkan anda dapat : Menerangkan register-register dalam 8051. Memanipulasi data menggunakan register dan interuksi MOV. Membuat kode sederhana dengan menggunakan bahasa Asssembly 8051. Menjelaskan urutan kejadian saat 8051 baru saja dihidupkan. Menerangkan program dalam ROM kode dari 8051. Merinci kerja dari setiap instruksi dalam bahasa assembly 8051. Menjelaskan type data dalam 8051. Menjelaskan kegunaan register PSW (Program Status Word). Menjelaskan alokasi ruang untuk memory RAM dalam 8051. Menerangkan penggunaan stack dalam 8051 Memanipulasi Bank register dari 8051. Pada SubBAB 2.1 kita akan melihat bagian dalam pada 8051. Kita akan mendemonstrasikan beberapa register yang paling banyak digunakan dalam 8051 dengan instruksi sederhana misalnya adalah MOV dan ADD. Pada SubBAB 2.2 kita akan mempelajari pemrograman dengan bahasa Assembly dan bahasa mesin serta mengupas tentang beberapa hal penting misalnya mnumonic, opcode, operand, dll. Proses dari perakitan kode dan pembuatan program yang siap pakai untuk 8051 akan dibahas pada SubBAB 2.3. Dan dibagian 2.4 kita akan mempelajari langkah demi langkah dalam eksekusi program 8051 dan aturan tentang Program Counter. Di bagian 2.5 kita akan melihat beberapa Directive (petunjuk) bahasa Assembly yang banyak digunakan, pseudo-code, dan tipe data yang berhubungan dengan 8051. SubBAB 2.6 kita akan mendiskusikan bit-bit bendera dan bagaimana mereka berpengaruh pada instruksi-instruksi aritmatika. Pengalokasian memory RAM dalam 8051 termasuk stack dan bank register dalam 8051 akan kita bahas pada subBAB 2.7.

SubBAB 2.1 Bagian dalam 8051 Pada bagian ini kita akan mejelaskan register dari 8051 dan menggambarkan kegunaan mereka dalam instruksi-instruksi MOV dan ADD.

Register-register Dalam CPU, register-register digunakan untuk menyimpan data secara sementara. Informasi dapat berupa data byte yang hendak diproses atau sebuah data alamat yang menunjuk pada data yang lain. Register-register dari 8051 pada umumnya adalah berupa register 8-bit. Dalam 8051 hanya ada satu jenis data yakni data 8-bit (sama dengan namanya yakni komputer 8-bit). Register 8bit tersebut ditunjukkan dalam diagram mulai dari MSB (Most Significant Bit) / D7 sampai pada LSB (Least Significant bit) / D0. Dengan type data 8-bit tersebut, setiap data yang lebih besar dari 8-bit harus dipecah menjadi beberapa bagian data 8-bit sebelum dapat diproses. Mengingat banyak register dalam 8051, kita akan berkonsentrasi pada beberapa register yang paling sering digunakan.

Register yang paling banyak digunakan adalah A (Accumulator), B, R0, R1, R2, R3, R4, R5, R6, R7, DPTR (DataPointer), dan PC (Program Counter). Semua register tersebut adalah register 8-bit kecuali DPTR dan PC. Akumulator atau register A, digunakan dalam semua instruksi aritmatika dan logika. Untuk mengerti penggunaan dari register tersebut, kita dapat melihat mereka dalam konteks dari dua buah instruksi sederhana, MOV dan ADD.

gambar 2-1 Register 8-bit dan 2 buah register 16-bit pada 8051

Instruksi MOV

Singkatnya instruksi MOV adalah menyalin isi data dari register yang satu ke register yang lain, dengan format sebagai berikut : MOV dest, source ;salin data source ke dest Instruksi ini memerintahkan pada CPU untuk memindahkan (sebenarnya adalah menyalin) operand source menuju operand [Link] contohnya, "MOV A,R0" adalah menyalin isi R0 ke register A. Setelah instruksi ini dijalankan isi dari kedua register tersebut adalah sama. Instruksi MOV tidak mengubah isi dari operand Source. Program berikut ini adalah contoh untuk mengubah Akumulator menjadi 55h (h adalah hex), lalu kemudian memindahkan nilainya kedalam beberapa register dalam CPU. Perhatikan tanda "#" dalam instruksi tersebut. Hal itu mengindikasikan bahwa simbol dibelakangnya adalah sebuah nilai. Hal tersebut akan kita bahas segera. MOV A,#55 ;Mengisi A dengan nilai 55h MOV R0,A ;Salin isi A ke dalam R0 ;Sekarang R0 = 55h MOV R1,A ;Salin isi A ke dalam R1 ;Sekarang R1 = 55h MOV R2,A ;Salin isi A ke dalam R2 ;Sekarang R2 = 55h MOV R3,#95h ;Mengisi R3 dengan nilai 95h ;Sekarang R3 = 95h MOV A,R3 ;Salin isi R3 ke dalam A ;Sekarang A = 95h Saat menulis program untuk mikrokontroller 8051, hal-hal berikut ini harus diperhatikan. 1. Bahwa sebuah nilai dapat langsung diberikan pada register-register misalnya A, B, R0 s/d R7. Namun bagaimanapun juga untuk mengindikasikan bahwa sebuah simbol adalah sebagai sebuah nilai, dan bukan sebagai alamat atau yang lain, sebelumnya harus diberi simbol pound ataupagar atau "#". MOV MOV MOV MOV MOV MOV MOV A,#23h R0,#12h R1,#1Fh R2,#2Bh B,#3Ch R7,#9Dh R6,#0F9h ;Mengisi A dengan nilai 23h ;Mengisi R0 dengan nilai 12h ;Mengisi R1 dengan nilai 1Fh ;Mengisi R2 dengan nilai 2Bh ;Mengisi R3 dengan nilai 3Ch ;Mengisi R3 denga nilai 9Dh ;Mengisi R3 denga nilai F9h

MOV R5,#12

;Mengisi R3 denga nilai 12 desimal

Perhatikan pada instruksi "MOV R5,#0F9h" sebelum simbol F nampak di sana diimbuhi oleh simbol "0" sehingga menjadi "0F9h". Hal ini penting bagi assembler untuk membedakan apakah sebuah symbol yang dituliskan itu sebagai sebuah angka bilangan atau sebuah identifier. Sedang identifier harus selalu dimulai dari karakter alphabeth. 2. Jika nilai 0 s/d F kita isikan pada sebuah register 8-bit, maka akan mengubah 4-bit paling kecil dari register tersebut. Dan kita akan mendapatkan 4-bit teratas darinya akan dibuat menjadi 0. Misalnya dengan instruksi "MOV A,#5", maka sejatinya instruksi tersebut adalah sama dengan "MOV A,#05h", dan menghasilkan A = 05h. Dan dalam bilangan biner adalah A = 00000101 biner. 3. Mengisikan sebuah nilai yang terlalu besar dari nilai yang sanggup ditampung sebuah register akan menghasilkan error. MOV A,#7F2h ; 7F2h > (8-bit atau FFh atau 255 desimal) MOV R2,#456 ; 456d > (8-bit atau FFh atau 255 dec) 4. Untuk mengisikan nilai ke dalam register, kita harus mengimbuhkan symbol pound (#). Jika tidak ada simbol tersebut, maka assembler akan menganggapnya sebagai sebuah lokasi memory. Ambil contoh "MOV A,17h" yang berarti pindahkan isi nilai dari memory 17h ke dalam A. Sedang saat kita menginginkan untuk mengisi A dengan nilai 17h, maka kita harus menuliskan dengan "MOV A,#17h". Tidak adanya symbol pagar tersebut tidak akan membuat assembler menghasilkan error. Namun Assembler akan membuatkan kode yang bukan seperti kemauan kita, hanya karena kesalahan kecil kita dalam menulis program. Biasanya hal ini biasa terjadi bagi para pemula. Instruksi ADD Instruksi ADD adalah berdasar pada format : ADD A,Source ;Tambahakan source ke Akumulator

Instruksi ini menambahkan sembarang tipe data ke dalam A dan A pula bertindak sebagai penerima hasil dari operasi. Sehingga dapat dikata operand tujuan (Dest) selalu adalah Akumulator (A). Di bawah ini contohnya MOV A,#25h ;Isi A dengan nilai 25h MOV R2,#34h ;Isi R2 dengan nilai 34h ADD A,R2 ;Tambahakan keduanya ;Jadi A = A + R2

Menjalankan program di atas akan menghasilkan A = 59h (25h + 34h = 59h) dan nilai pada R2 tidak berubah setelah instruksi ADD, yakni 34h. Sekali lagi operand source tidak akan berubah. Program di bawah ini adalah contoh program yang lebih kompleks. MOV MOV MOV ADD R5,#25h ;Isi R7 dengan nilai 25h R7,#34h ;Isi R5 dengan nilai 34h A,#0 ;Clear isi A menjadi 0 A,R5 ;Tambahakan A dengan isi R5 ;Jadi A = A + R5 ADD A,R7 ;Tambahakan A dengan isi R7 ;Jadi A = A + R7 Program di atas menghasilkan nilai 59h yang terdapat pada A. Ada banyak jalan menuju Roma, namun sedapat mungkin cari jalan yang paling singkat dan cepat. Ini adalah cara lebih cepat. MOV A,#25h ADD A,#34h ;Isi A dengan nilai 25h ;Tambahakan A dengan 34h

Sekali lagi dapat kita lihat dari berbagai contoh di atas operand tujuan selalu adalah A. Jika kita memaksa menuliskan kode seperti "ADD R2,A" tentu akan menghasilkan error. 8051 memang hanya mendukung operasi arimatika dan logika yang hanya menggunakan A sebagai akumulator, dan dengan kata lain operasi tersebut dibatasi selebar 8-bit. Namun walaupun demikian hal itu sudah lebih dari cukup untuk membuat program untuk berbagai aplikasi canggih, misalnya robot. Kita tahu bahwa 8051 juga memiliki 2 buah register 16-bit, walaupun dirancang bukan untuk keperluan manipulasi data. Namun jika anda bertanya apakah CPU 8051 dapat memanipulasi data yang lebih besar dari 8-bit?? Tentu saja, tidak ada hal yang tidak mungkin. Seperti yang sudah kita ketahui sebelumnya bahwa komputer 8-bit, idealnya hanya memproses data sampai selebar 8-bit. Dalam kasus tertentu beberapa perintah dalam 8051 dapat diurutkan untuk dapat menangani data yang lebih besar, seperti data 16-bit, 24-bit, maupun 32-bit. Semua bisa dilakukan. Tentu dengan memecah data tersebut dalam beberapa data 8-bit,dan kemudian memprosesnya satu-persatu kemudian menyatukan kembali data sehingga seperti hasil yang kita inginkan. Dalam prakteknya hal itu bisa dilakukan dengan membuat kode-kode yang rumit dan teliti. Dan nantinya akan dibahas pada Bab lain.

SubBab 2.2 Mengenal Pemrograman Assembly 8051 Pada bagian ini kita akan membahas format dari bahasa assembly dan mengupas terminologi yang berkaitan hal yang paling sering digunakan dalam pemrograman bahasa assembly. Mengingat CPU bekerja hanya dalam biner, dan dilakukan dengan kecepatan yang sangat tinggi. Biner adalah serupa dengan dua buah keadaan, kalau tidak 0s maka itu mestinya adalah 1s, begitu pula sebaliknya. Maka kita harus familiar dengan 010010110, itulah biner. Bilangan biner yang berupa kode perintah dinamakan bahasa mesin. Pada computer terdahulu, programer menulis kode dalam bahasa mesin seperti itu. Namun agar lebih mudah dari menulis kode dengan biner, dibuatkah format bilangan yang dapat merepresentasikan biner dengan baik, yakni menggunakan bilangan Heksadesimal. Dan hasilnya, programer merasa jauh lebih mudah dari pada mengingat kombinasi "0" dan "1". Namun menulis kode dalam bahasa mesin Heksadesimal masih juga terlalu rumit bagi kebanyakan programer. Akhirnya, pada masa sekarang, dibuatlah sebuah bahasa assembler yang berisi mnumonic (symbol bahasa mesin dalam bahasa manusia yang mudah diingat), untuk setiap instruksi kode mesin, dan didukung juga beberapa kelebihan lain untuk mempermudah pembuatan program, termasuk pengujian atas kemungkinan adanya error dalam penulisan. Sekarang mnumonic digunakan secara luas dalam bidang ilmu pengetahuan, buku-buku tehnik yang merujuk pada kode dengan tujuan semuanya agar lebih mudah untuk diingat. Kode bahasa assembly diterjemahkan ke dalam bahasa mesin oleh sebuah program lain, yang kemudian disebut sebagai Assembler. Bahasa assembly juga dikenal sebagai bahasa tingkat rendah (low-level-languages) karena bahasa ini adalah yang paling berhubungan langsung dengan struktur CPU. Dalam memprogram bahasa ini, programer harus benar-benar mengenal semua register dalam CPU, ukuran masing-masingnya, termasuk berbagai detil dari instruksi serta efeknya terhadap register. Namun sekarang, seseorang dapat menggunakan berbagai bahasa yang jauh lebih memudahkan, misalnya seperti BASIC, Pascal, C, C++, Java , dan banyak lagi lainnya.
Java bukan HoNoCoRoKo-nya jawa !!! Pesan penterjemah, kita harus bangga salah satu bahasa daerah kita digunakan sebagai nama bahasa program, walaupun mereka tanpa hak paten menggunakan nama "Java". Bagaimana nich DepKomInfo ??? Seharusnya yang namanya "Java Script" artinya "Tulisan Jawa" adalah hak-patennya negara kita, bukan ?!?!

Bahasa-bahasa di atas kemudian disebut dengan bahasa tingkat tinggi (highlevel languages) karena kita tidak perlu mengenal lebih jauh tentang isi dari

struktur CPU target. Bahasa ini kemudian diterjemahkan ke dalam bahasa assembler, baru kemudian ke bahasa mesin, atau beberapa program dapat langsung mengubah dari bahasa tingkat tinggi itu langsung menjadi bahasa mesin. Program yang dapat melakukan itu kemudian disebut dengan Compiler. Misalnya kita menulis program dalam bahasa C, maka kita harus menggunakan C-Compiler untuk kemudian mengubah kode program kita menjadi bahasa mesin. Namun untuk sekarang, kita berkonsentrasi pada bahasa assembly yang khusus untuk 8051, dan membuat program yang dapat bekerja dengan baik hanya dengan menggunakan bahasa itu. Assembler yang kita gunakan ini adalah sebuah program yang dibuat bersama-sama begitu diperkenalkannya Chip 8051 oleh Intel, yakni program "[Link]" dengan nama resmi "MCS-51 MACRO ASSEMBLER V2.3" buatan Intel Corporation 1976, 1986. Kita dapat meng-unduh (download) dari Internet secara gratis. Struktur dari bahasa assembly Program bahasa assembly terdiri dari beberapa bagian. Setiap instruksi diungkapkan dalam satu baris kode. Setiap instruksi terdiri dari mnumonic, dan kadang ditambahkan 1 atau 2 operand. Operand adalah data yang hendak dimanipulasi. Dan mnumonic itulah yang meninstruksi-kan CPU untuk melakukan sesuatu terhadap operand.
Program 2.1 Contoh program dalam bahasa Assembly

ORG 0 ;Mulai program dari alamat 0000 MOV R5,#25h ;Isikan 25h pada R5 MOV R7,#34h ;Isikan 34h pada R7 MOV A,#0 ;buat A = 0 ADD A,R5 ;Tambahkan isi R5 ke dalam A ;sehingga A = A + R5 ADD A,R7 ;Tambahkan isi R7 ke dalam A ;sehingga A = A + R5 ADD A,#12h ;Tambahkan 12h ke dalam A TUNGGU: SJMP TUNGGU END ;program selesai dan berputar di sini

Program dalam bahasa assembly yang dicontohkan di atas adalah statement yang berurutan, di mana terdiri dari instruksi misalnya ADD dan MOV, dan beberapa statement lain, yang disebut dengan Directive. Setiap instruksi, adalah memerintahkan CPU untuk melakukan sesuatu hal, sedang directive ( juga disebut dengan psuedo-instruction) memberikan arahan bagi assembler cara menterjemahkan kode di belakang ungkapan directive tersebut. Ambil

contoh, intstruksi MOV dan ADD adalah sebuah perintah, sedang ORG dan END adalah directive (petunjuk arahan) bagi assembler. ORG dalam contoh diatas meminta kepada Assembler bahwa opcode selanjutnya agar ditempat dalam memory lokasi 0, sementara END adalah untuk memberitahukan assembler akhir dari program, dan mengabaikan setiap text di bahwa END. Pada prinsipnya instruksi bahasa assembly terdiri dari 4 bagian : [label] mnumonic [operand] [;komentar] tanda kurung diatas (bracket) adalah menunjukkan bagiannnya, agar anda bisa lebih jelas, dan bukan dimasukkan dalam kode yang sebenarnya. Adapun penjelasannya adalah sebagai berikut ini : 1. Bagian Label adalah sebuah identifier yang merujuk padaa lokasi opcode. Dengan kata lain nilai dari Label ini adalah relatif, dan ditentukan saat proses kompilasi. Berbeda dengan identifier lain yang nilainya harus ditentukan dengan expresi EQU, DATA, dll dengan diberikan nilai yang tetap (Konstanta). Karena sifat dinamisnya Instruksi JUMP yang merujuk pada Label, lokasi jump akan dihitung kembali agar menghasilkan lokasi Jump yang tepat, pada lokasi milik Label. Deklarasi Label adalah mirip dengan deklarasi identifier lain dan diakhiri dengan karakter titik-dua. Identifier hanya bisa dibentuk dengan karakter pertama adalah karakter Alphabet, dan karakter selanjutnya boleh juga numerik, dan karakter "_" serta "?". Panjang Label ini juga tidak boleh melebihi 255 karakter. 2. Bagian menumonic dan bagian operand dalam bahasa assembly adalah bagian utama dari kode program. Dan operand adalah spesifik atas mnumonic, yang mengisyaratkan tugas tertentu (Seperti yang sudah diatur oleh pabrik pembuat Chip dalam datasheet-nya). Ungkapan (statement) dalam bahasa assembly misalnya adalah : ADD A,B MOV A,#67 ADD dan MOV adalah mnumonic dimana akan menghasilkan opcode. Sedang "A,B" dan A,#67" adalah operand. Di luar kedua bagian ini, yakni mnumonic dan operand adalah disebut sebagai instruksi-psuedo, atau directive. Ingat bahwa sebuah directive tidak akan menghasilkan kode mesin (opcode), dan mereka digunakan oleh assembler saat memutuskan bagaimana caranya untuk menterjemahkan mnumonic dan operand yang ada di belakang directive tersebut ke dalam kode mesin yang benar sesuai dengan kemauan kita. Dalam program 2.1 perintah ORG (original) dan END adalah contoh dari directive (beberapa assembler menggunakan syntax .ORG dan .END). Periksa

assembler anda untuk penjelasan lebih jauh. Lebih jauh tentang pseudo akan kita bahas pada bagian 2.5 3. Bagian komentar dimulai dengan karakter semi-colon (titik-koma) yang berarti karakter-karakter setelahnya adalah sebuah komentar. Assembler akan segera mengabaikan karakter-karakter sesudah karakter semi-colon tersebut. Mengingat assembler adalah menterjemahkan baris demi baris dalam program, maka setiap komentar harus dimulai dari karakter semi-colon itu, walaupun dalam baris tersebut tidak terdapat instruksi apapun. 4. Perhatikan label "HERE" dalam program 2.1 adalah bagian Label. Setiap label harus diakhiri dengan simbol colon (titik-dua). Dalam instruksi SJMP (Short Jump), 8051 diberitahu untuk berhenti disitu, atau dengan kata lain berputarputar terus ditempat yang sama.

SubBAB 2.3 Meng-Assembling dan Menjalankan program untuk 8051 Sekarang dasar-dasar dari program bahasa assembly telah diberikan. Dan pertanyaan berikutnya adalah, Bagaimana itu semua bisa dibuat, dirangkai (assembling), dan siap untuk dijalankan? Inilah langkah-langkah untuk membuat program berbahasa assembly. 1. Pertama adalah dengan menggunakan editor yang umum, ketikkan program seperti pada Program 2.1. Berbagai Editor dapat digunakan untuk membuatnya, misalnya notepad atau bahkan MS-DOS EDIT, yang kesemuanya disertakan oleh Microsoft Windows. Ingat bahwa editor yang kita gunakan harus dapat menghasilkan file ASCII. Beberapa assembler meminta kita untuk menamakan file program kita dengan nama berformat DOS 8+3 yang diberi ekstensi ".asm" atau ".src", tergantung dari Assembler anda. Namun kita berkonsentrasi pada ektensi ".asm". 2. File ".asm" yang telah kita buat seperti langkah 1 di atas, sekarang diminta oleh Assembler8051. Assembler ini akan mengubah setiap instruksi dalam file tersebut menjadi kode mesin. Assembler ini menghasilkan file Object dan file List. Object file berekstensi ".obj", sedang file List berekstensi ".lst". Program yang dapat melakukannya misalnya program "[Link]" dengan nama "MCS-51 MACRO ASSEMBLER V2.3" buatan Intel Corporation 1976, 1986. Yang dapat diunduh (download) dari Internet. 3. Jika kita membuat sebuah program yang sangat besar dan menghasikan beberapa file object. Maka dibutuhkan langkah ke 3 ini yang disebut sebagai linking. Dengan file ini beberapa file object dapat dijadikan satu file besar absolute yang berekstensi ".abs". Umumnya file abs ini digunakan untuk latihan, jika kita memiliki program monitor.

4. Selanjutnya file ".abs" ini akhirnya diubah sebagai bahasa mesin yang sebenarnya, yakni satu file kode mesin dengan ekstensi ".hex". Program "[Link]" dengan caption "V1.0 Intel Corporation 1986" yang dapat melakukan hal itu. Namun hebatnya program OH ini dapat langsung mengubah satu file ".obj" menjadi satu file kode mesin. Akhirnya muncul beberapa assembler canggih belakangan ini sudah merangkum semua proses menjadi satu program saja, bahkan termasuk dengan simulasinya segala.

Lebih jauh tentang file "asm" dan "obj" File "asm" dapat disebut pula sebagai file source (sumber), dan untuk alasan inilah beberapa assembler juga mendukung extensi ".src". File Lst File Lst (List), adalah tambahan, namun bagaimanapun juga file tersebut adalah sangat penting karena file tersebut adalah mendaftar setiap opcode yang telah dibuat oleh assembler, termasuk alamat-alamatnya, dan termasuk pemberitahuan jika ada error atau kesalahan dalam penulisan program. Beberapa Assembler tidak otomatis mebuatkan file Lst tersebut untuk kita, dan membutuhkan perintah tambahan dalam DOS Command Promt saat menjalankan Assembler yang bersangkutan. (Namun untuk program Assembler [Link] buatan Intel sudah otomatis membuatkan file Lst). File tersebut sangat penting bagi programer untuk melihat setiap baris syntax yang dituliskan apa sudah benar atau tidak. Termasuk dapat melihat alamat setiap opcode dengan jelas.

Program 2.1 List File-nya

LOC OBJ 0000 0000 0002 0004 0006

LINE SOURCE

1 ORG 0 ;Mulai program dr 0000 7D25 2 MOV R5,#25h ;Isikan 25h pada R5 7F34 3 MOV R7,#34h ;Isikan 34h pada R7 7400 4 MOV A,#0 ;buat A = 0 2D 5 ADD A,R5 ;Tambahkan isi R5 ke dlm A 6 ;sehingga A = A + R5 0007 2F 7 ADD A,R7 ;Tambahkan isi R7 ke dlm A 8 ;sehingga A = A + R5 0008 2412 9 ADD A,#12h ;Tambahkan 12h ke dalam A 10 000A 80FE 11 TUNGGU: SJMP TUNGGU ;program selesai dan 12 END

SubBAB 2.4 Ruang ROM dan Program Counter dalam 8051 Di bagian ini kita akan menjelaskan tentang register Program Counter (PC) dalam proses menjalankan perintah pada program 8051. Kita juga akan mebahas ruang (space) ROM untuk berbagai variant dari keluarga 8051. Program Counter dalam 8051 Regsiter penting lainnya dalam 8051 adalah PC (Program Counter). Program Couter adalah menunjuk lokasi dari alamat selanjutnya yang hendak dijalanakan. Setelah CPU membaca program dari ROM program, program Counter kemudian di-INCrement (ditambah satu bilangan) yang berarti menunjuk pada alamat byte selanjutnya dalam ROM Porgram. Program Counter dalam 8051 adalah termasuk register 16-bit. Artinya 8051 dapat mengakses program mulai dari alamata 0000 s/d FFFFh, sehingga total adalah 64 Kbytes. Namun tidak semua variant keluarga 8051 memiliki ROM program sebanyak itu di dalam chip-nya. Beberapa diantaranya hanya memiliki 2 Kbytes atau bahkan tidak sama sekali sehingga membutuhkan ROM program tambahan secara external. Bagaimana 8051 dan Program Counter-nya saat pertama listrik daya-nya dihidupkan ?? Hal tersebut akan kita bahasa pada kesempatan yang lain Mulai dari bagian mana dari Program saat 8051 pertama dinyalakan

Pertanyan yang harus kita tanyakan mengenai setiap microcontroller (microprocessor). Pada lokasi mana dari ROM program, sebuah CPU memulai tugas-tugasnya saat kita mulai menyalakan dengan menghubungkannya dengan Listrik PLN misalnya. Setiap Micro proscessor adalah berbeda-beda. Namun dalam keluarga 8051 apapun pabrik pembuatnya atau penjualnya lokasi pertama yang dijalankan oleh 8051 saat pertama dihidupkan adalah lokasi 0000. Menghidupkan atau menyalakan maksudnya dalah memeberikan daya sebesar Vcc yang dibutuhkan untuk pin Vcc. Atau menggunaan pin Reset,yang akan dibahasa lebih jauhpada BAB 4. Dengan kata lain saat 8051 pertama dihidupkan PC selalu bernilai 0000. Yang berarti bahwa pada loikasi ini opcode pertama yang akan dijalankan. Untuk alasan ini lah setiap program dalam 8051 harus dimulai dari lokasi 0000 dan dituliskan ke dalam ROM program juga dimuklai dari alamayt 0000. Kita dpat memastika agar assembler memulai penyusuan kode program dari alamat tersebut dengan memberikan direvtive ORG dalam program kita. Nantinya kita akan membahas bagaiaman melihat setia aksi dari Program Counter dalam proses pembacaan ROM program. Menempatkan kode dalam ROM program Untuk dapat lebih mengerti, aturan dari bagaimana Program Counter mengambil data dan dieksekusi oleh CPU, kita akan menjelaskan aksi dari Program Counter ini. Pertama, adalah menjelsakan sekali lagi file List dari program contoh dan bagaiaman kode ditempatkan dalam ROM yang terdapat dalam chip 8051. Seperti yang kita lihat bahwa opcode dan operand untuk setiap instruksi ditampilkan dalam file tersebut pada bagian sebelah kiri file list tersebut.
Program 2.1 List File-nya

LOC OBJ 0000 0000 0002 0004 0006

LINE SOURCE

1 ORG 0 ;Mulai program dr 0000 7D25 2 MOV R5,#25h ;Isikan 25h pada R5 7F34 3 MOV R7,#34h ;Isikan 34h pada R7 7400 4 MOV A,#0 ;buat A = 0 2D 5 ADD A,R5 ;Tambahkan isi R5 ke dlm A 6 ;sehingga A = A + R5 0007 2F 7 ADD A,R7 ;Tambahkan isi R7 ke dlm A 8 ;sehingga A = A + R5 0008 2412 9 ADD A,#12h ;Tambahkan 12h ke dalam A 10 000A 80FE 11 TUNGGU: SJMP TUNGGU ;program selesai dan 12 END

Hasilnya adalah

Setelah program ditulis (burned) ke dalam ROM internal dalam chip 8051 (misalnya AT89C51 atau DS5000). Opcode dan operand ditempatkan pada ROM program dimulai dari alamat 0000 seperti yang ditunjukkan dalan daftar dibawah ini. Alamat ROM Kode mesin Kode Assembly 0000 7D25 MOV R5,#25h 0002 7F34 MOV R7,#34h 0004 7400 MOV A,#0 0006 2D ADD A,R5 0007 2F ADD A,R7 0008 2412 ADD A,#12h 000A 80FE TUNGGU: SJMP TUNGGU

Daftar tersebut menunjukkan alamat 0000 berisi 7D dimana adalah opcode untuk mengisikan nilai ke register R5, dan alamat 0001 adalah berisi operand (dalam daftar, terlihat 25h) yang diisikan dalam R5. Sehingga instruksi "MOV R5,#25h" adalah memiliki kode mesin "7D25" dimana 7D adalah opcode dan 25 adalah operand. Hal yang sama juga pada kode mesin 7F34 yang berlokasi dalam 0002 dan 0003 yang merupakan representasi dari instruksi "MOV R7,#34h". Termasuk juga untuk kode mesin 7400 yang berada dalam lokasi 0004 dan 0005 adalah representasi dari instruksi "MOV A,#0". Lokasi memory 0006 memiliki opcode 2D dimana itu adalah opcode untuk instruksi "ADD A,R5" dan lokasi memory 0007 adalah berisi 2F, dimana opcode untuk instruksi "ADD A,R7". Opcode dari intstruksi "ADD A,#12h" berlokasi pada alamat 0009. memory lokasi 000A berisi opcode dari instruksi SJMP. Sedang alamat target dari opcode SJMP tadi adalah isi dari lokasi 000B. Arti dari alamat target yang berisi FE akan dijelaskan pada bab selanjutnya. Sedang dibawah ini adalah isi ROM menurut alamatnya.
Program 2-1 Isi ROM

Alamat 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009

Code 7D 25 7F 34 74 00 2D 2F 24 12

000A 000B

80 FE

Menjalankan Program byte demi byte Anggaplah program di atas sudah ditulis di dalam ROM dari Chip 8051 (atau 8751, AT89C51, atau DS5000), berikut ini adalah penjelasan langkah-langkah dari kejadian dalam 8051 ,setelah catu daya diberikan. 1. Saat 8051 dinyalakan, PC (Program Counter) memiliki nilai 0000 dan mulai membaca opcode pertama, yakni 7D, yang mana kode tersebut berarti mengisikan operand ke dalam R5. Setelah menjalankan opcode tersebut CPU melalui bantuan PC kembali membaca lokasi ROM program berikutnya yakni 25, dan selanjutnya menjalankan tugasnya yakni memindahkan nilai 25 pada R5. Sekarang 1 instruksi sudah selesai. Selanjutnya Program Counter sudah di-INC-rement ke lokasi untuk opcode berikutnya, yakni ke alamat 0002. (PC==0002) dimana berisi opcode 7F, yang berarti opcode untuk instruksi "MOV R7,". 2. Setelah menjalankan opcode 7F, nilai 34h lalu dipindahkan pada R7. Kemudian Program Counter lagi dengan meng-inc-rement dirinya sendiri hingga kemudian menunjuk alamat 0004. 3. ROM lokasi 0004 berisi opcode untuk instruksi "MOV A,#0". Instruksi ini adalah instruksi 2-byte, yang berarti masing-masing opcode dan operan menggunakan 1-byte. 4. Sekarang PC = 0006 yang menunjuk alamat opcode dari instruksi "MOV ADD A,R5". Ini adalah instruksi 1-byte. Setelah instruksi ini, PC akan menjadi 0007h 5. Sedang lokasi 0007 adalah berisi opcode 2F, yang menjadi milik instruksi "ADD A,R7". Ini juga termasuk dalam instruksi 1-byte. Setelah CPU menjalankan instruksi tersebut maka PC akan di-inc-rement dan menjadi 0008h. Hal ini terus terjadi sampai semua isi program dilaksanakan. Hal yang sebenarnya adalah, bahwa PC adalah berisi lokasi alamat dari instruksi yang hendak dieksekusi. Prosesor kelas X86 pun memiliki serupa dengan program counter yang dinamakan Instruction Pointer.

Peta Memory ROM untuk keluarga 8051 Seperti yang kita lihat dalam bab sebelumnya, beberapa keluarga 8051 memiliki jumlah ROM program internal sebanyak hanya 4 K Bytes, seperti 8751, AT89C51. Beberapa di antaranya bahkan punya yang lebih besar, misalnya AT89C52 yang memiliki ROM program sebanyak 8 K Bytes. Dallas Semiconductors DS5000-32 memiliki ROM program internal sebanyak 32 K

Bytes, ada pula yang memiliki 64 K Bytes. Ingat!! karena PC dalam keluarga 8051 adalah 16-bit maka jumlah memory Program ataupun data yang bisa dialamati hanya sampai 64 KB. Alamat kode yang paling pertama dijalankan adalah alamat 0000h. Misalnya untuk AT89C51, dia memiliki alamat ROM program mulai dari 0000h s/d 0FFFh. Lihat contoh 2-1 untuk bagaimana cara menghitungnya. Contoh 2-1 Cari dari alamat ROM internal dari contoh chip di bawah ini. (a) AT89C51 (87C51) dengan 4 Kbytes, (b) DS-5000-32 dengan 32 KB. Jawaban: (a) 4K artinya adalah 4096 bytes, atau 1000 dalam heksa desimal. Dengan memasukkan 0 sebagai alamat pertama maka , jawabanyya adalah 0000 s/d 0FFFh dalam heksa desimal. (b) 32K artinya adalah 32.768 bytes, atau dapat kita ubah menjadi heksadesimal menjadi 8000h. Dengan memasukkan 0 sebagai alamat pertama, maka jawabanyya adalah 0000 s/d 7FFFh dalam heksa desimal.

Gambar 2-3 Jangkauan alamat ROM dalam Chip 8051

SubBAB 2.5 Type-type Data dan Directive pada 8051

Pada bagian ini kita akan melihat Type-type dan directive mana saja yang didukung oleh Assembler 8051. Type-type Data dan Directive pada 8051 Secara prinsip 8051 hanya memiliki 1 jenis type data, yakni data 8-bit. Ukuran setiap register juga 8-bit. Nah jika ternyata data yang hendak diproses ternyata lebih besar dari 8bit maka programer harus memecah data mencadi beberapa data 8-bit agar dapat diproses oleh PCU, lihat BAB 6. Type data ini bisa beripa bilangan positif atau negatif, yang lebih lengkap akan dibahas pada bab6. DB (define byte) Directive DB ini digunakan secara luas dalam proses assembly oleh assembler. Yakni digunakan untuk mendefinisikan data 8-bit pada memory program. Saat data sudah didefinisikan maka date tersebut dapat berupa desimal, biner, hex, ataupun karakter-karakter ASCII. Untuk desimal, simbol "D" atau "d" setelah bilangan angka desimal boleh ditambahkan atau tidak. Walaupun demikian data desimal tersebut akan dikonversikan menjadi bilangan hex oleh assembler. Untuk mendefinisikan karakter ASCII, maka cukup mudah, yakni dengan menempatkan symbol tanda petik satu / quotation mark, misalnya (seperti ini). Kemudian assembler akan mengubah setiap karakter tersebut menjadi kodekode hex seperti yang sudah diatur dalam format ASCII. Beberapa contoh adalah ORG 500h DATA1: DB 28 ;desimal (atau 1C hex) DATA2: DB 00110101b ;biner (atau 35 hex) DATA3: DB 39h ;hex ORG 510h DATA4: DB 2591 ;bilangan dlm 4-bytes karakter ASCII ORG 518h DATA6: DB Asad ;Karakter ASCII Di atas kita dapat melihat adanya 2 tanda petik-satu yang behimpitan. Dalam bahasa assembly 8051, 2 tanda petik-satu tersebut akan diartikan oleh assembler sebagai sebuah karakter ASCII #44 atau data 2Ch, yakni karakter tanda petik-satu (""). Sehingga Label DATA6 adalah lokasi untuk 5 bytes karakter "A", "s", "", "a", dan "d". DW (define Word)

Define Word masih dimungkinkan oleh 8051 mengingat dia juga menggunakan ukuran data 16-bit untuk DPTR dan PC. Directive ini mendifinisakan setiap masukkan ke dalam word jadi misalnya adalah DATA1: DW 0

Hasilnya Label DATA1 akan dibuat kode 2 byte berisi "00" dan "00". Lainnya, perhatikan kode di bawah ini.. DATA2: DATA3: DATA4: DATA5: DW DW DW DW 0FFFFh a ab abc

Hasilnya DATA3 berisi "0061", yang high bytenya dibiarkan kosong. Sedang DATA5 adalah error, karena untuk DW hanya dibolehkan string maksimum 2 karakter. Assembler directives Berikut ini adalah beberapa directive yang umum digunakan dalam 8051. ORG (origin) Directive ORG digunakan untuk mengindikasikan awal dari alamat. Artinya adalah kode berikutnya akan ditempatkan oleh assembler dimulai dari alamat seperti yang ada dibelakang simbol ORG. Bilangan dibelakang symbol ORG ini boleh berbentuk desimal maupun hex. Jika bilangan ternyata tidak diikuti oleh symbol "h", maka Assembler akan merubahnya nanti menjadi hex. EQU (equate) Directive ini digunakan untuk mendefinisikan (define) sebuah konstan tanpa menuntut disediakannya sebuah lokasi memory. Biasanya symbol-symbol EQU ini digunakan sebagai data-data masukan langsung ( immediate) yang nanti akan dibahas pada bab Addressing. Namun dalam prakteknya EQU adalah simbol define yang paling tinggi. Karena hasilnya bisa digunakan sebagai data langsung, lokasi memory data, maupun lokasi memory program. Dalam proses Assembly, directive EQU ini tidak akan menghasilkan kode, namun nama simbol yang di-EQU akan ditambahkan pada daftar simbol, yang dengan daftar simbol inilah assembler dapat menentukan nilai sebuah konstan. Directive yang sejenis dengan jangkauan lebih kecil adalah "DATA" dan "BIT".

NILAI

EQU 25 MOV R4,#NILAI

END directive Directive penting lainnya adalah END. Dimana directive ini akan memberitahukan kepada assembler bahwa disitu adalah akhir dari program. Maka Assembler berhenti untuk membuat kode baru dan segera menyelesaikan tugasnya, tanpa lagi menghiraukan text dibelakang simbol END. Dalam program Assembler, directive ini harus ada. Aturan untuk Label dalam bahasa Assembly Dalam memilih sebuah label idealnya adalah nama yang sangat singkat namun penuh arti. Sehingga programmer dapat membuat program menjadi sangat mudah dan cepat. Ada beberapa aturan yang harus kita ikuti. Pertama adalah Setiap Label (atau simbol) haruslah unik (tidak sama). Karakter yang boleh digunakan untuk Label bisa terdiri dari semua alphabeth, digit 0 s/d 9, tanda tanya (?), at (@), dan tanda dollar ($). Namun karakter pertama dari nama Label haruslah Alphabeth. Hal ini berbeda untuk angka yang karakter pertamanya haruslah angka, baik itu desimal, heksa, ataupun biner. Dalam penamaan label tidak boleh menggunakan reserved word, misalnya MOV, ADD, ACC, SBUF, CY, RESET, dll yang sudah didefinisikan sendiri oleh assembler. Untuk lebih mengetahui reserved word apa saja yang ada dalam assembler, kita dapat kembali membaca manual dari assembler yang kita gunakan.

SubBAB 2.6 Bit-bit bendera dan register PSW pada 8051 Seperti kebanyakna prosesor, 8051 meiliki register bendera yang diguakan untuk mengindikasikan kondisi aritmatika seperti misalnya Sisa, atau Carry. Register bendera dalam 8051 disebut sebagai register Program Status Word (PSW). Pada subBAB ini kita akan membahas yang satu itu. Register PSW (program status word)

Register Program Status Word (PSW) adalah register 8-bit. Dia juga disebut sebagai register bendera (sunda = flag register). Walaupun PSW adalah register 8-bit, namun hanya 6-bit diantaranya yang digunakan oleh 8051. 2 diantaranya adalah tidak digunakan itu dapat kita gunakan oleh user untuk mendukung program. 4 bit dari 6 yang digunakan disebut sebagi bendera kondisi, yang berarti bahwa mereka mengindikasikan sebuah kondisi yang dihasilkan dari sebuah proses matematika. Masing-masing adalah CY (C / Carry / Sisa), AC (Auxiliary Carry / Sisa tambahan / Sisa desimal), P (Parity / paritas / kegenapan), OV (Over Flow / kelebihan ). Dari gambar 2-4 kita dapat melihat PSW4 dan PSW3 yang ditandakan sebagai RS1 dan RS0, dan digunakan untuk mengubah bank registers. Hal itu akan kita jelaskan pada bab yang lain. Sedang PSW1 dan PSW5 adalah bit bendera bebas yang dapat kita gunakan untuk berbagai hal.

CY PSW.7 Bendera Carry AC PSW.6 Bendera Carry Tambahan F0 PSW.5 Boleh digunakan secara bebas RS1 PSW.4 Bit pemilih bank register RS0 PSW.3 Bit pemilih bank register OV PSW.2 Bendera Overflow PSW.1 Boleh digunakan secara bebas P PSW.0 Bendera Paritas RS1 0 0 1 1 RS0 0 1 0 1 0 1 2 3 Register Bank 00h 08h 10h 18h Alamat 07h 0Fh 17h 1Fh

Gambar 2-4 Bit-bit dala register PSW

Berikut ini akan dibahas dengan lebih teliti penerapan dari ke 4 bendera dari register PSW ini. Termasuk akibat dari sebuah instruksi terhadap register ini akan dibahas kemudian. CY, bendera Carry Bendera ini akan di-set saat adanya sisa / kelebihan dari D7. Bendera ini digunakan oleh instruksi penambahan (ADD) dan pengurangan (SUB), dan

termasuk oleh perkalian (MUL) dan Pembagian (DIV). Namun secara manual kita dapat mengubah bit ini dengan instruksi "SetB C" atau "Clr C". Pelajari nanti juga ada bab 8. AC, bendera Auxiliary Carry AC prinsipnya mirip dengan Carry biasa, namun berbeda dengan sisa. Bendera ini akan di-set hanya saat adanya sisa / kelebihan dari D3 ke D4. Instruksi yang mempengaruhi bit adalah sama dengan Carry. Bit ini khusus dirancang untuk memudahkan programer dalam membuat program yang menggunakan BCD (Binary Coded Decimals). Lihat nanti bab 6. P, bendera Parity Bendera paritas adalah merefleksikan jumlah bit "1" dalam akumulator. Jika jumlahnya adalah genap, maka P = 1, namun jika jumlahnya ganjil maka P = 0. OV, bendera Overflow Bendera kelebihan ini dirancang untuk keperluan program yang menggunakan bilangan bertanda ( plus atau minus ). Bendera ini di-set saat mengindikasikan bahwa instruksi yang dijalankan menghasilkan bilangan yang diluar jangkauan yakni -128 s/d +127. Lebih lengkap akan dibahas pada bab 6. Instruksi ADD dan PSW Selanjutnya kita melihat dampak yang dihasilkan oleh instruksi ADD, pada bendera CY, AC dan P milik register PSW tersebut. Sedang dampaknya pada bit OV akan dibahas kemudian pada bab 6). Beberapa contoh akan diberikan utnuk memperjelas pembahasan.
Tabel 2-1 Instruksi-instruksi yang mempengaruhi Bit bendera

Instruksi CY OV ADD x x x ADDC x x x SUBB x x x MUL 0 x DIV 0 x DA x RRC x RLC x SetB C 1 Clr C 0

AC

CPL C x ANL C,bit x ANL C,/bit x ORL C,bit x ORL C,/bit x MOV C,bit x CJNE x
Catatan : x dapat berarti 0 ataupun 1.

Contoh 2-2 Tunjukkan status dari CY, AC dan P setelah terjadi penambahan 38h dan 2Fh seperti instruksi-instruksi berikut ini MOV A,#38h ADD A,#2Fh ; setelah penambahan A=67h, CY=0. Jawaban: 38 00111000 + 2F 00101111 67 01100111 CY = 0 karena memang tidak ada carry dari bit D7. AC = 1 karena ternyata ada carry dari bit D3 ke D4. P = 1 hasilnya A memiliki 1s yang ganjil.

Contoh 2-3 Tunjukkan status dari CY, AC dan P setelah terjadi penambahan 9Ch dan 64h seperti instruksi-instruksi berikut ini MOV A,#9Ch ADD A,#64h ; setelah penambahan A=00 , CY=1. Jawaban: 9C 10011100 + 64 01100100 100 00000000 CY = 1 karena ada carry dari bit D7 keluar. AC = 1 karena ternyata ada carry dari bit D3 ke D4. P = 0 karena tidak ada bilangan 1s pada ACC.

Contoh 2-4 Tunjukkan status dari CY, AC dan P setelah terjadi penambahan 88h dan 93h seperti

instruksi-instruksi berikut ini MOV A,#88h ADD A,#93h ; setelah penambahan A=1Bh, CY=1. Jawaban: 88 10001000 + 93 10010011 11B 00011011 CY = 0 karena ada carry dari bit D7 keluar. AC = 0 karena tidak ada carry dari bit D3 ke D4. P = 0 hasilnya A memiliki 1s sebanyak 4 buah.

SubBAB 2.7 Bank-bank register dan Stack 8051 Kita tahu bahwa 8051 memiliki RAM internal sebanyak 128 bytes. Pada subBAB ini kita akan membahas alokasi RAM ini untuk register-register dan untuk Stack. Ruang Alokasi memory RAM dalam 8051 Ada 128 bytes memory dalam 8051 ( 256 bytes untuk 8052). Memory ini dialamatkan pada 00h s/d 7Fh. Pada bab 5 nanti kita akan melihat memory ini dapat diakses secara langsung dengan hanya menyebutkan lokasinya. Ke 128 bytes memory ini dibagi menjadi beberapa bagian sebagai berikut ini : 1. Total 32 bytes pertama 00h s/d 1Fh digunakan sebagai bank-bank register dan Stack. 2. Total 16 bytes berikutnya 20h s/d 2Fh digunakan sebagai memory yang bisa dialamati setiap bit-bit-nya secara langsung. Yang lebih lengkap akan dibahas pada bab 8. 3. Sedang total 80 bytes sisanya 30h s/d 7Fh dapat digunakan sebagai berbagai macam hal oleh kita, misalnya untuk menyimpan data, buffer, counter dll. Ini adalah memory bebas, dan penggunaannya diserahkan pada programmer.

Gambar 2-5 Alokasi RAM pada 8051

Bank-bank register dalam 8051 Seperti yang sudah disebut sebelumnya, totdal ada 32 bytes memory yang digunakan untuk regfister dan bank. Ke 32 bytes ii dibagi menjadi 4 bagian / bank, sehingga setiap bagian / bank memiliki jumlah 8 bytes. Setiap bank secara berurutan adalah milik regsiter R0 s/d R7. Dimana pada bank-0 (00h-07h) kita dapat mengetahu R0 akan menunjuk alamat 00h, dan R7 akan menunjuk 07h. Sedang jika pada bank-1 (08h-0Fh), R0 akan menunjuk 08h dan R7 akan menunjuk 0Fh. Demikian seterusnya. Hanya ada 1 bank yang bisa digunakan. Lalu Bank mana yang sedang digunakan ? Itu tergantung dari RS1 dan RS0 atau PSW.4 dan PSW.3 pada register PSW. Seperti yang sudah sedikit dijelaskan diatas. Berikut ini adalah alokasi dari setiap bank untuk masing-masing register.

Gambar 2-6. Bank-bank register dan alamat RAM mereka dalam 8051

Seperti yang dapat kita lihat pada gambar 2-5, Saat pertama reset, Bank-0 adalah bank yang pertama dipilih, sedang Bank-1 ternyata untuk sementara digunakan untuk Stack. Inilah yang menjadi persoalan kebanyakan dalam pengorganisasian bank, terutama bagi pemula. Saat kita menggunakan Bank 1,2, atau 3 sebagai bagian dalam program, maka hal pertama yang harus dilakukan adalah memastikan bahwa bank-bank tersebut tidak sedang digunakan oleh Stack. Bagaimana caranya? tentu saja Stack harus dipindah untuk menduduki memory yang kosong. Contoh 2-5 Tunjukkan status dari lokasi RAM setelah program berikut ini. MOV R0,#99h ; Isikan nilai 99h pada R0 MOV R1,#85h ; Isikan nilai 85h pada R1 MOV R2,#3Fh ; Isikan nilai 3Fh pada R2 MOV R7,#63h ; Isikan nilai 3Fh pada R7 MOV R5,#12h ; Isikan nilai 12h pada R5 Jawaban: Setelah melaksanakan instruksi di atas maka.. RAM lokasi 0 memiliki nilai 99h RAM lokasi 1 memiliki nilai 85h RAM lokasi 2 memiliki nilai 3Fh RAM lokasi 7 memiliki nilai 63h RAM lokasi 4 memiliki nilai 12h

Bank register Default

Seperti yang kita tahu bahwa ada 4 bank register. Lokasi mana yan diakses R0 s/d R7 setelah CPU dihidupkan. Seperti yang sudah sedikit dijelaskan diatas, kita mendapati bahwa PSW adalah bernilai 00. Yang dalam arti RS1 = 0 dan RS0 = 0 yang berarti bank yang saat reset itu dipilih adalah bank-0. Sehingga lokasi 00 s/d 07h masing-masing untuk R0 s/d R7. Begitulah kondisi setelah reset atau pertama dihidupkan, yakni bank yang dipilih adalah Bank-0 dan register seperti R0 mennujuk lokasi 00h sampai pada R7 yang berlokasi pada 07h. Begitu saat bank dipindah, maka lokasi-loaski register tersebut akan ditinggalkan begitu saja, dan R0 s/d R7 akan berlokasi di tempat yang baru pada bank yang sedang dipilih. Contoh 2-6 Ulangi contoh 2-5 namun dengan menyebutkan nama lokasi dari register-register tersebut. Jawaban : MOV MOV MOV MOV MOV 00,#99h 01,#85h 02,#3Fh 07,#63h 05,#12h ; Isikan nilai 99h pada lokasi 00 ; Isikan nilai 85h pada lokasi 01 ; Isikan nilai 3Fh pada lokasi 02 ; Isikan nilai 3Fh pada lokasi 07 ; Isikan nilai 12h pada lokasi 05

Bagaimana cara untuk mengubah bank register Seperti diterangkan di atas bahwa Bank 0 adalah default, yakni saat 8051 baru dinyalakan. Kita dapat mengubah pemilihan bank tersebut dengan menggunakan register PSW (program status word). Bit D4 dan D3 dari PSW digunakan untuk melakukannya seperti yang ditampilkan pada tabel 2-2. Bit D4 dan D3 dari PSW juga dikenal dengan sebutan PSW.4 dan PSW.3 karena memang sebenarnya register PSW dapat dialamati secara bit. Sehingga masingmasing bit dalam register tersebut dapat dimanipulasi dengan instruksi CLR dan SETB. Misalnya "SETB PSW.3" akan membuat PSW.3 = 1, dan bank akan dipilih menjadi bank 1. Seperti yang dicontohkan dalam Contoh 2-7.
Tabel 2.2 Bit Pemilih Bank pada PSW .

RS1(PSW.4) RS0(PSW.3) . Bank 0 0 0 . Bank 1 0 1 .

Bank 2 Bank 3

1 1

0 1

. .

Contoh 2-7 Jelaskan isi RAM setelah instruksi-instruksi berikut ini. MOV MOV MOV MOV MOV 00,#99h 01,#85h 02,#3Fh 07,#63h 05,#12h ; Isikan nilai 99h pada lokasi 00 ; Isikan nilai 85h pada lokasi 01 ; Isikan nilai 3Fh pada lokasi 02 ; Isikan nilai 3Fh pada lokasi 07 ; Isikan nilai 12h pada lokasi 05

Jawaban : Secara default PSW.3 = 0 dan PSW.4 juga 0. Atau dengan kata lain secara default bank yang dipilih adalah bank register 0. Sehingga dalam instruksi "SetB PSW.4", CPU kemudian menggunakan bank register 2. bank register 2 mengunakan RAM lokasi 10h 17h. Sehingga setelah isntruksi-instruksi di atas RAM tersebut akan berisi sbb. RAM RAM RAM RAM RAM lokasi lokasi lokasi lokasi lokasi 10h 11h 12h 17h 15h berisi berisi berisi berisi berisi 99h 85h 3Fh 63h 12h

Stack dalam 8051 Stack (dalam bahasa kita adalah "tumpukan") adalah bagian dari RAM, dan dugunakan bagi CPU untuk menyimpan informasi secara sementara. Informasi tersebut dapat berupa data maupun alamat. CPU sangat memerlukan mengaksesan memory RAM sebagai Stack karena memang Stack harus menempati memory yang berurutan. Bagaimana caranya stack diakses dalam 8051 Jika Stack mengambil bagian dari RAM, maka tentu saja harus ada sebuah register dalam CPU yang dapat menunjuk Stack tersebut. Register tersebut digunakan untuk mengakses stack ini diberi nama register SP (Stack Pointer). Stack dalam 8051 adalah termasuk register 8-bit, yang mana hanya menunjuk alamat dari 00 s/d FFh. Saat CPU pertama dinyalakan register SP ini selalu bernilai 07h. Hal ini berarti lokasi RAM 08h adalah lokasi pertama stack dalam 8051. Saat CPU menyimpan nilai dari sebuah register ke dalam stack, itu disebut

dengan PUSH (yakni mendorong data ke dalam stack). Sedang data yang di diambil dai tumpukan stack dikirim ke regsiter disebut dengan POP. Singkatnya adalah data didorong ke stack untuk menyimpannya, sedang data diambil dari stack untuk menggunakannya. Modifikasi stack sungguh menarik, namun Jika tidak hati-hati CPU akan menganggap salah satu bagian stack yang kita isi dengan data, justru dianggap sebagai sebuah alamat. Jika itu terjadi maka komputer akan bekerja tidak beraturan, dan tidak bisa mengerti lagi yang mana opcode dan yang mana operan. Untuk lebihmengerti dengan modifikasi Stack maka lihat kembali penjelsan tentang instruksai PUSH dan POP. Mem-Push data ke dalam Stack Dalam 8051 SP (Stack Pointer) adalah menunjuk pada alamat ujung dari stack tersebut. Data baru untuk stack akan ditempatkan pada lokasi sesudah. Dengan kata lain, saat mem-push stack, SP akan oromatis di-INCrement dan menuliskan data pada lokasi yang baru itu. Push = Increment lalu Save. Sekali lagi ingat bahwa setiap byte data yang disimpan dalam Stack, SP di-INC sekali saja, begitu pula dengan POP, setiap byte yang diambil dari Stack, SP akan didecrement 1 kali. Metode transfer dalam Stack adalah seperti pengalamatan regsiter tidak langsung. Hanya saja register yang digunakan bukan Register serba guna, namun adalah register khusus, seperti yang sudah dibahas. Mekanisme mesin yang sama dalam proses Push dapat dimisalkan seperti ini. INC R0 MOV @R0,Direct Ilustrasi di atas hanya menunjukan mekanisme teknis dari PUSH. Selain berbeda Registernya, syntax yang digunakan adalah jauh lebih sederhana PUSH Direct

Contoh 2-8 Tunjukkan Stack dan Pointer-nya dari instruksi dobawah ini. Anggaplah bahwa stack pada area aslinya. MOV MOV MOV PUSH PUSH PUSH R6,#25h R1,#12h R4,#0F3h 6 1 4

Jawaban :

Mem-Pop data dari Stack Sedang POP = Load lalu Decrement. Jadi saat mem-POP stack data lokasi terakhir dari stack akan di load pada register yang bersangkutan. Selanjutnya SP akan diDecrement dan 1 alamat sebelm alamat yang tadi diload, sekarang dianggap sebagai ujung dari stack. Proses Push dan POP pada 8051 berbeda dengan microprocessor seperti X86. Proesor ini akan men-DEC SP saat instruksi PUSH, dan akan men-INC SP setelah instruksi POP. Proses dalam POP, juga memiliki mekanisme mesin yang sama dengan rangkaian instruksi dibawah ini MOV Direct,@R0 DEC R0 Ilustrasi di atas hanya menunjukan mekanisme teknis dari POP. Selain berbeda Registernya, syntax yang digunakan adalah jauh lebih sederhana POP Direct Sekali lagi mode pengalamatan stcak adalah mode pengalamatan tidak langusng untuk stacknya, sehingga range data 0 s/d 7Fh dapat digunakan sebagai stack. Bahkan untuk keluarga 8052 yang memiliki blok memory khusus pengalamat tidak langsung, memungkinkan stack memiliki jangkauan 0 s/d FFh. Sementara operand untuk PUSH dan POP harus mode pengalamatn Direct.

Batas atas dalam Stack Sekali lagi Stack ada batasan. Secara teori Stack dapat menjangkau seluruh lokasi RAM yang berada dalam CPU. 00 s/d 7F untuk keluarga 8051, dan 00 s/d FF untuk keluarga 8052. Namun Intel sudah merancang dengan setelah awal(walaupun dapat kita ubah), Stack dimulai dari lokasi RAM 07h. Hal ini agar lokasi RAM 00 s/d 07h milik register serba guna Bank 0 aman dari gangguan Stack. Walau dalam beberapa aplikasi ukuran stack tidak terlalu besar memakan memory, namun tetap harus dipertimbangkan hal-hal semacam ini. Sedapat mungkin stack tidak menggangu daerah RAM yang kita gunakan. Misalnya kita menggunakan memory 25h sebagai memory sebuah data. Sedapat mungkin Stack tidak menggangu lokasi 25h ini. Jika Stack diperkirakan akan melewati lokasi 25h ini, maka ada 2 solusi untuk itu. Yakni memindahkan lokasi RAM 25h tadi ke alamat yang lebih tinggi, atau memindahkan lokasi Stacknya. Contoh 2-9 Periksa stack. Dan tunjukkan Stack dan Pointer-nya setelah instruksi dibawah ini. Semua dalam bilangan hex. SP dimulai dari lokasi 0Bh. POP 3 POP 5 POP 2 Jawaban :

Hubungan instruksi CALL dengan Stack

Selain Stack ini digunakan untuk menyimpan register, maka kegunaan lain dari stack adalah untuk alamat saat dijalankannya instruksi CALL dan ACALL. Sebagaimana yang kita tahu bahwa instruksi tersebut adalah memanggil sebuah rutin lain yang lokasinya jauh. Namun sebelum melakukan lompatan CPU akan menyimpan lokasi alamat kode dari instruksi persis dibawah CALL. Agar saat CPU telah selesai menjalankan rutin yang dipanggil tadi, CPU akan kembali mengeksekusi yang urung dikerjakan karena adanya Instruksi Call sebelumnya. Pada Bab 3 akan dibahas mengenai hal ini secara lebih lengkap. Contoh 2-10 Contoh 2-8 Tunjukkan Stack dan Pointer-nya dari instruksi dibawah ini. MOV MOV MOV MOV PUSH PUSH PUSH Jawaban : SP,#5Fh ;Buat lokasi baru untuk Stack R2,#25h R1,#12h R4,#0F3h 2 1 4

Konflik antara Stack dan Bank 1 Mengulang dari bahasan kita sebelumnya bahwa Stack Pointer pada llokasi yang tersedia dalam RAM untuk kegunaan Stack. Data di-PUSH ke dalam stack setelah SP di-increment terlebih dahulu. Sebaliknya SP akan di-decrement setelah diPOP. Kita juga mengingat bahwa Stack Default adalah berlokasi pada alamat

07h, yang berarti data pertama yang di-PUSH akan ditempatkan pada alamat 08h, dan seterusnya. Kita juga tahu bahwa blok alamat 00h s/d 1Fh adalah dimiliki oleh register yang dibagi menjadi 4 bank. Dan Bank 1 menduduki alamat 08 s/d 0Fh. Bank 2 mendudukui alamat sesudahnya. Dan lokasi 18h s/d 1Fh dimiliki oleh Bank 3. Ada kesamaan lokasi memory antara Bank 1 dengan awal stack. Tentu saja hal ini membingungkan kita bukan ? Jangan bingung. Secara defaultnya juga bank yang digunakan adalah bank 0, sengan lokasi 00h s/d 07h. Dimana itu diluar jangkauan Stack. Namun bagaimana saat kita menginginkan untuk menggunakan Bank 1 ,2 atau 3 tanpa terjadi masalah dengan Stack. Solusinya adalah memindah lokasi awal dari Stack. Misalnay memidah kan ke alamat 50h ke atas. Itu dapat dilakukan dengan mudah menggunakan instruksi "MOV SP,#4Fh". Hasilnya stack akan mengambil lokasi mulai dari 50h s/d 7Fh. Dan Bank 1, 2, dan 3 dapat segera kita gunakan. Hal tersebutdiconto dalam Contoh 2-10.

RINGKASAN Pada Bab ini dimulai dari penjelasan tentang register utama dari 8051 termasuk A, B, R0, R1, R2, R3, R4, R5, R6, R7, DPTR, dan PC. Dalam penggunaan registerregister tersebut, didemonstrasikan dengan contoh pemrograman. Proses dalam membuat aplikasi dengan bahasa Asembly telah diterangkan, yakni dengan menulis file sumber, kemudian meng-kompilasinya, link-ing, dan kemudian menjalankannya. Register PC (Program Counter) adalah selalu menunjuk pada lokasi kode yang hendak dikerjakan CPU. Bagaimana cara 8051 pengunakan ruang ROM program telah dijelaskan, namun nampaknya kita harus sedikit mengerti, dimana program kode akan ditempatkan dalam ROM, dan berapa daya tampung Chip. Bahasa Assembly adalah sekumpulan directive yang terdiri dari instruksi, maupun psuedo-instruction yang juga disebut directive. Instruksi kemudian di terjemahkan ke dalam bahasa mesin. Sedang directive adalah petunjuk bagaimana cara men-terjemahkannya. Beberapa psuedo-instrucition tersebut digunakan hanya untuk mendefinisikan sebuah simbol data. Data dalam hal ini dapat berupa biner, hex, maupun desimal, bahkan string sekalipun, semuanya terorganisasi beberapa bagian memory 8-bit.

Bendera-bendera sangat berguna bagi paraprogrammer untuk dapat menilai kondisi dari sebuah operasi matematika misalnya apakah ada sisa atau kelebihan. Stack digunakan untuk menyimpan alamat yang ditinggalkan saat terjadinya Call. Namun stack juga dapat digunakan untuk menyimpan sebuah data. Stack menghuni di dalam RAM, di mana sudah digambarkan dan diterangkan. Termasuk juga manipulasi stack lewat PUSH dan POP juga sudah digali.

Tutorial MCS-51 Instruksi-instruksi JUMP, LOOP, dan CALL February 25th, 2011 Musbikhin BAB 3 Sasaran

Setelah anda menamatkan bab ini , diharapkan anda dapat : Membuat code Assembler 8051 untuk membuat loop. Membuat code Assembler 8051 menggunakan instruksi lompat bersyarat. Menjelaskan kondisi yang berkaitan, pada setiap instruksi lompat bersyarat Menulis kode untuk lompat jauh tidak bersyarat. Menulis kode untuk lompat dekat tidak bersyarat. Menghitung alamat tujuan dari instruksi-instruksi lompat. Menbuat kode subrutin. Menjelaskan perhatian penggunaan stack dalam subrutin. Menjelaskan frekuensi kristal dengan siklus mesin. Membuat kode untuk menghasilkan tundaan waktu.

Saat baru dinyalakan, 8051 menjalankan kode program mulai alamat 0000, lalu 0001, lalu 0002, dan seterusnya secara berurutan (sequence). Namun ada kalanya kita ingin memindahkan kontrol program ke tempat yang lain di luar urutan (branch). Ada banyak instruksi pada bahasa assembler 8051 yang dapat kita gunakan. Pada subBAB 6-1 kita akan membahas instruksi-instruksi yang digunakan untuk membuat loop (ind:kalang/putaran), dengan menggunakan instruksi unconditional jump (lompat tidak bersyarat)dan conditional jump (lompat bersyarat). Selanjutnya pada subBAB 6-2 kita akan membahas instruksi CALL dan penggunaannya. Terakhir pada subBAB 6-3 membahas subrutin untuk Tundaan Waktu.

SubBAB 3-1: Instruksi-instruksi LOOP dan JUMP

Pada subBAB ini pertama kita akan mendiskusikan bagaimana membuat proses looping pada 8051. Selanjutnya kita akan mendiskusikan instruksi-intruksi jump, baik unconditional maupun conditional.

Looping pada 8051

Mengulang aliran/urutan instruksi beberapa kali, disebut loop. Loop adalah salah satu yang paling sering dikerjakan oleh banyak CPU, termasuk 8051. Pada 8051, proses loop dapat dilakukan dengan berbagai cara. Misalnya

ULANG: NOP

SJMP ULANG

Pada contoh di atas program akan terus berulang mengeksekusi NOP dan SJMP. Demikian pula

TUNGGU: NOP

JB P1.2,TUNGGU

program akan terus mengeksekusi NOP dan JNB sampai bit P1.2 menjadi 0s (rendah). Nah, dua contoh di atas adalah penggunaan loop dengan jumlah pengulangan tidak terbatas, dan bisa berlangsung terus menerus. Namun ada kalanya kita menginginkan loop dengan jumlah tertentu. Hal tersebut dapat dilakukan dengan menggunakan instruksi DJNZ reg,label. Instruksi ini akan men-decrement register (operand reg), jika setelah itu nilai register tidak nol, maka program akan melompat ke alamat yang ditunjuk oleh label. Sebelum memulai loop, tentu register terlebih dahulu diisi dengan nilai counter atau cacahan untuk menentukan berapa kali pengulangan yang diinginkan. Dengan kata lain nilai dari reg adalah jumlah pengulangan. Ingat bahwa dengan DJNZ, perintah decrement, pengujian register, dan lompat telah diringkas menjadi satu instruksi saja. Sesuatu yang sangat efisien.

Contoh 3-1

Tulis pogram untuk (a) (b) men-Clear-kan ACC, lalu tambahkan 3 pada akumulator sebanyak 10 kali.

Jawaban:

;program ini untuk menambah 3 pada akumulator sebanyak 10 kali

MOV A,#0 MOV R2,#10 ULANG: ADD A,#3

;A=0 , clear ACC ;isi pencacah R2 = 10 ;Tambah 3 pada ACC ;ulagi samppai 10 kali

DJNZ R2,ULANG

MOV R5,A

;Simpan hasilnya pada ACC

Dalam program seperti contoh 3-1, register R2 digunakan sebagai counter. Counter pertama-tama di-set menjadi 10. Setiap iteration (ind: sekali aliran dalam loop), instruksi DJNZ akan men-decrement R2 dan memeriksa nilainya. Jika R2 tidak 00, maka program akan melompat pada alamat tujuan, dalam hal adalah label LAGI. Loop akan berlangsung terus sampai R2 = 00. Setelah R2 = 00 program akan mengalir keluar dari loop dan mulai mengeksekusi instruksi dibawah DJNZ, dalam hal ini adalah instruksi MOV R5,A.

Ingat dalam menggunakan DJNZ, semua register dapat digunakan sebagai counter, yaitu R0 s/d R7, termasuk juga semua lokasi RAM dan SFR (direct addressing). (Dijelaskan pada BAB 5).

Contoh 3-2

Berapa jumlah maksimum pengulangan yang bisa dilakukan di Contoh 3-1.

Jawaban:

R2 bertindak sebagai pencacah (counter), dan R2 adalah register 8-bit, yang dapat menampung nilai maksimal FFh (255 desimal). Sehingga jumlah pengulangan yang bisa dilakukan contoh 3-1 adalah sebanyak 256 kali.

Loop di dalam Loop

Seperti yang tunjukkan pada contoh 3-2, bahwa cacahan maksimum dari counter adalah 256. Lalu bagaimana jika kita membutuhkan cacahan/pengulangan yang lebih besar/banyak dari 256? Untuk melakukan hal itu, kita menggunakan loop di dalam loop, dalam bahasa jawa disebut nested loop. Kita menggunakan dua (atau lebih) register untuk digunakan sebagai counter. Lihat contoh 3-3.

Contoh 3-3

Tulis program untuk (a) mengisi akumulator dengan nilai 55h, dan (b) complement nilainya sebanyak 700 kali.

Jawaban:

Karena 700 adalah lebih besar dari 255 (kapasitas maksimum untuk semua register), maka kita menggunakan dua register untuk membuat cacahan. Kode berikut adalah menunjukkan bagaimana menggunaakn R2 dan R3 sebagai cacahan.

MOV A,#55h MOV R2,#10 LAGI: ULANG: MOV R3,#70 CPL A

;A=55h ;isi pencacah R2 = 10 (loop terluar) ;isi pencacah R3 = 70 (loop terdalam) ;Complement ACC ;ulangi sampai 70 kali

DJNZ R3,ULANG

DJNZ R2,LAGI

;ulalgi loop luar sampai 10 kali

Dalam program ini R2 digunakna sebagai pencacah pada loop terdalam. Pada instruksi DJNZ R2,ULANG, jika R2 kemudian menjadi 0

Conditional Jump lainnya

Ringkasan dari conditional jump pada 8051 dapat kita lihat pada table 3-1. Penjelasan lebih mendetil dapat kita lihat pada lampiran A. Harap dicatat bahwa semua perintah conditional jump ini, seperti JZ (lompat jika A=0), atau JC (lompat jika CY=1), akan membuat program melompat pada lokasi yang ditunjuk hanya .., sekali lagi hanya, kondisi yang diminta terpenuhi. Selanjutnya kita akan membahas beberepa instruksi jump tersebut agar lebih mudah dipahami.

Tabel 3-1: Instruksi Lompat Bersyarat pada 8051 Instruksi JZ Rel JNZ Rel DJNZ Rn,Rel DJNZ direct,Rel CJNE A,direct,Rel CJNE A,#data,Rel CJNE Rn,#data,Rel Penjelasan Lompat jika A = 0 Lompat jika A <> 0 Decrement Rn, lompat jika Rn <> 0 Decrement direct, lompat jika direct <> 0 Lompat jika A <> direct byte Lompat jika A <> data byte Lompat jika Rn <> data byte

CJNE @Ri,#data,Rel JC Rel JNC Rel JB Bit,Rel JNB Bit,Rel JBC Bit,Rel

Lompat jika @Ri <> data byte

Lompat jika CY = 1 Lompat jika CY = 0 Lompat jika Bit = 1 Lompat jika Bit = 0 Lompat jika Bit = 1 , lalu Clear Bit

JZ (jump if A=0)(lompat jika A=0)

Instruksi ini akan memeriksa isi A. Jika dia 00, maka program akan melompat ke alamat yang ditunjuk. Misalnya seperti ini.

MOV A,R2 JZ LABEL1 MOV A,R1 JZ LABEL1 LABEL1:

;A=R2 ;lompat jika A = 0 ;A=R1 ;lompat jika A = 0

Pada program ini, jika isi R2 atau R1 adalah 00, maka program akan melompat ke label LABEL1. Ingat instruksi JZ ini hanya berlaku untuk register A. Instruksi ini juga tidak perlu dilengkapi dengan operand apapun dalam syntax-nya. Hal ini karena operand A sudah terintegrasi dalam instruksi JZ itu sendiri. Lihat contoh 3-4. Bagaimana jika kita hendak menggunakan register yang lain? Tentu bisa, hanya saja bukan dengan instruksi JZ dan JNZ, dan oleh karena itu gunakan instruksi yang lain, misalnya CJNE.

Contoh 3-4

Tulis program untuk memastikan jika isi R5 adalah 0, jika ya maka isi dengan 55h.

Jawaban:

MOV A,R5 JNZ LANJUT MOV R5,#55h LANJUT:

;Salin isi R5 ke A ;Lompat jika A <> 0 ;isi dengan 55h

JNC (jump if no carry, jump if CY=1)(lompat jika CY=1)

Instruksi ini, menggunakan bendera Carry sebagai menentu keputusan dalam jump. Saat mengeksekusi JNC LABEL, CPU akan memeriksa status bendera Carry(CY). Jika CY=1, maka program akan melompat ke alamat yang ditunjuk. Namun jika CY=0, maka program akan mengeksekusi instruksi selanjutnya dibawah JNC tersebut. Bagaimana dengan Bit yang lain selain carry. Kita dapat menggunakan JB atau JNB yang akan kita diskusikan pada bab 4 dan 8.

Contoh 3-5

Cari jumlah dari niai 79h, F5h, dan E2h. Simpan hasilnya pada register R0 (low byte) dan R5 (high byte).

Jawaban:

MOV A,#0 MOV R5,A ADD A,#79h JNC LANJUT INC R5 LANJUT:

;Clear A, A= 0 ;Clear R5 ;A = 0 + 79h = 79h ;Jika tidak lebih, ke angka dua ;Jika lebih, Inc R5 ;A = 79h + F5h = 6Eh dan CY=1

ADD A,#0F5h

JNC TERUS INC R5 TERUS:

;Jika tidak lebih, ke angka tiga ;Jika lebih, Inc R5 ;A = 6Eh + E2h = 50h dan CY=1 ;Jika tidak lebih, selesai ;Jika lebih, Inc R5 ;Sekarang R0=50h dan R5=02

ADD A,#E2h

JNC SELESAI INC R5 SELESAI:

MOV R0,A

Semua Conditional Jump masuk dalam golongan lompat jarak pendek (SJMP)

Harap dicatat bahwa semua lompat bersyarat pada 8051 adalah termasuk golongan lompat jarak pendek. Sehingga alamat yang dituju haruslah tidak lebih jauh -128 byte ke belakang s/d +127 byte ke depan. Nilai tersebut relatif terhadap alamat pada instruksi pertama dibawah instruksi lompat bersyarat tersebut. Konsep yang sangat penting pada lompat jarak pendek tersebut akan dibahas pada akhir bab ini.

Instruksi-instyruksi Lompat tidak beryarat

UnConditional Jump adalah memindahkan kontrol program ke tempat lain tanpa syarat kondisi apapun. Pada 8051 ada tiga instruksi untuk Unconditional Jump ini, yaitu LJMP (long Jump / lompat jauh), AJMP (Absolute Jump), dan SJMP (short Jump /lompat pendek).

LJMP (long Jump)

LJMP adalah lompat jarak jauh tanpa syarat kondisi. Disebut juga sebagai Jump 16-bit. Ini adalah instruksi 3-byte, di mana byte pertama adalah opcode, sedang dua byte yang lain adalah representasi dari alamat 16-bit yang dituju. Dengan 2 byte ini kontrol program dapat dipindahkan ke semua alamat memory program yang bisa dijangkau 8051 yakni alamat 16-bit, mulai dari alamat 0000 s/d FFFFh. Seperti yang kita tahu bahwa Program Counter (PC) adalah register khusus 16-bit juga. Dua byte dibelakang opcode langsung disalin ke PC. Namun dalam prakteknya tidak semua alamat-alamat tersebut digunakan Chip 8051 untuk menyimpan memory program. Misalnya AT89C51 (buatan ATMEL) yang hanya memiliki memory program sebesar 4 kb, yang diletakkan pada lokasi memory program 0000 s/d 0FFFh. Sehingga dalam membuat program kita sebaiknya memperhatikan dengan seksama alamat yang dituju saat menggunakan instruksi LJMP ini, jangan sampai progam melompat ke alamat kosong. Namun 8051 juga memiliki Unconditional Jump lain yang lebih efisien, yaitu SJMP dan AJMP, dimana instruksi-instruksi ini hanya membutuhkan 2 byte. Sehingga dapat menghemat penggunaan memory jauh lebih baik dari pada LJMP.

AJMP (Absolute JUMP)

AJMP ini adalah lompat tidak bersyarat jarak menengah. Disebut juga sebagai Jump 11bit. Ini adalah instruksi 2-byte. Prosesnya adalah mirip dengan LJMP namum hanya dibatasi pada blok 2 kb yang sama dari nilai PC setelah instruksi AJMP. Maksudnya alamat instruksi tepat di bawah AJMP, dan alamat label yang dituju, harus berada pada blok 2 KB yang sama. Misalnya jika setelah alamat instruksi di bawah instruksi AJMP berada di antara 0000 s/d 07FFh maka alamat yang dituju juga harus di antara alamat tersebut (blok 2 KB yang sama). 11-bit dalam instruksi ini langsung disalin ke PC. Instruksi ini sama efisiennya dengan SJMP dalam penggunakan memory, karena hanya menggunakan 2-byte.

SJMP (short Jump)

SJMP adalah lompat tanpa syarat jarak pendek. Disebut juga sebagai Jump relatif 8-bit. Ini adalah instruksi 2 byte. Byte pertama adalah opcode, sedang byte lainnya adalah alamat relatif yang dituju. Ya alamat relatif, sehingga nilai pada byte ke dua ini bukan representasi dari alamat yang dituju, melainkan nilai relatif terhadap nilai PC saat itu. Sangat berbeda dengan LJMP (atau juga AJMP) yang byte dibelakang opcode adalah benar-benar nilai dari alamat yang dituju. Apa maksudnya relatif ? jika nilai dari byte kedua (byte tujuan) adalah lebih kecil dari 80h, maka alamat tujuan adalah nilai PC setelah instruksi SJMP, ditambah byte ini. Namun jika nilai byte ini sama atau lebih besar dari 80h maka alamat tujuan adalah nilai PC saat setelah instruksi SJMP dikurangi nilai 2s complement dari byte tujuan (Lihat BAB 6 untuk bahasan 2s Complement dan bilangan bertanda). Atau dengan kata lain, byte ke dua ini seperti bilangan bertanda, memiliki nilai positif atau negatif antara -128 s/d +128. Dengan demikian alamat tujuan harusnya sama atau diantara, minimal -128 dari nilai PC, atau maksimal +128 dari nilai PC. Sama seperti AJMP, instruksi SJMP ini adalah instruksi 2-byte, sehingga dalam penggunaan memory program menjadi lebih hemat 1-byte dibanding LJMP. Dalam penulisan program dengan bahasa Assembler, kita akan diberitahu jika ternyata alamat tujuan di luar jangkauan. Jika ini terjadi maka instruksi dapat digantikan dengan instruksi AJMP atau LJMP.

Menghitung alamat SJMP

Selain Instruksi SJMP, semua conditional Jump semacam JNC, JZ dan DJNZ juga menggunakan mekanisme yang sama dalam menentukan alamat tujuan. Alamat tujuan adalah relatif terhadap nilai PC setelah instruksi yang berkaitan. Untuk menghitung alamat tujuan, byte alamat dari instruksi akan langsung ditambahkan pada PC. Byte alamat ini seperti bilangan bertanda, sehingga jika nilainya positif maka program akan melompat dibawah instruksi Jump. Namun jika nilainya negatif maka program akan melompat di atas instruksi Jump. Untuk bilangan bertanda akan dibahas pada BAB 6. Untuk lebih jelas akan SJMP silahkan lihat contoh 3-6

Contoh 3-6

Menggunakan file List berikut ini, periksalah perhitungan alamat lompat ke depan (forward jump).

Lokasi Opcode 0000 0000 0002 0004 0006 0007 0008 0009 000B 000D 7800 7455 6003 08 04 04 2477 5005 E4 5 6 7 1

Baris

Instruksi ORG 0000

2 3 4

MOV R0,#0 MOV A,#55h JZ LANJUT INC R0 LAGI: INC A INC A

8 9 10

LANJUT: ADD A,#77h JNC SELESAI CLR A

000E 000F 0010 0011 0012 0013 0015 0017

F8 F9 FA FB 2B 50F2 80FE

11 12 13 14 15 16 17 19

MOV R0,A MOV R1,A MOV R2,A MOV R3,A SELESAI: ADD A,R3 JNZ LAGI TUNGGU: SJMP TUNGGU END

Jawaban:

Pertama harap diperhatikan bahwa instruksi JZ dan JNCkeduanya di atas adalah lompat ke depan (jump forward). alamat target untuk jump forward dihitung dengan cara menambahkan PC di instruksi berikutnya, dengan byte ke dua dari instruksi short jump, di mana disebut relative address. Pada baris ke 4 instruksi JZ LANJUT memiliki opcode 50h dan operan 03h pada alamat 0004h dan 0005h. 03h adalah alamat relatif, relatif terhadap alamat dari instruksi setelah instruksi jump itu sendiri, yaitu INC R0 dengan alamat 0006. Tambahkan 0006h dengan 03h hasilnya 0009h, inilah alamat sebenarnya. Hal yang sama juga terjadi pada JNC SELESAI. Instruksi ini memiliki opcode 50h dan Operand 05h. 05h adalah alamat relatif terhadap instruksi berikutya. Yaitu alamat 000Dh untuk instruksi CLR A, kita mendapat 000Dh + 05h = 0012h. Inilah alamat target sebenarnya untuk label SELESAI.

Contoh 3-7

Periksalah perhitungan lompat ke belakang pada contoh 3-6.

Jawaban:

Dalam List program kita mendapatkan instruksi JNC LAGI memiliki opcode 50h dan alamat relatif F2h ditambahkan dengan alamat instruksi setelah JNC, yaitu 0015h. Perhitungannya adalah demikian, karena alamat relatif ini merupakan bilangan bertanda maka cara penjumlahan yang sedikit berbeda akan kita ambil. Bilangan word PC, yaitu 0015h kita ambil low byte saja, yaitu 15h. Sehingga kita akan mendapatkan 15h + F2h = 107h. Sekali lagi kita ambil low byte saja, sehingga kita mendapatkan 07h. Nilai ini yang kemudian kita sandingkan dengan high byte pada PC, menjadi 0007h. Akhirnya, inilah alamat target dari JNC LAGI.

Perhitungan Jump dengan tujuan ke belakang

Dalam hal lompat ke depan (jump forward) nilai alamat relatif dapat langsung ditambahkan pada PC, yaitu nilai antara 00h s/d 7Fh, atau 0 s/d 127 desimal. Untuk lompat kebelakang (jump backward) nilai dari alamat relatif tersebut adalah -1 s/d -128. Tentu saja CPU harus dapat membedakan mana yang lompat ke depan, dan mana yang lompat ke belakang. Dalam 8051, semua lompat relatif jarak pendek tidak ada yang melebihi jangkauan -128 s/d +127 dari alamat sesudah instruksi lompat tersebut. Jika kita memaksa untuk lompat diluar jangkauan tersebut, Assembler akan memberitahukan pada kita lewat file List, tentang adanya kesalahan ini (DESTINATION ADDRESS OUT OF RANGE FOR RELATIVE REFERENCE).

SubBAB 3-2: INSRUKSI CALL

Instruksi pemindahan kontrol program yang lainnya adalah CALL, di mana instruksi ini digunakan untuk memanggil sebuah subrutin. Sebelumya akan kita perjelas apa itu subrutin. Subrutin adalah sekumpulan/blok kode instruksi yang memiliki tugas tertentu. Kumpulan instruksi dalam subrutin tersebut bisa digunakan atau dijalankan dengan cara memanggil (CALL). Bahkan bisa dipanggil dari mana saja secara berulang-ulang. Dalam bahasa Assembler subrutin diawali oleh Label, yakni nama untuk dipanggil, dan diakhiri oleh instruksi RET. Dengan menggunakan subrutin kita tidak perlu untuk mengetikkan dua buah (atau lebih) blok kode yang sama. Kita cukup membuat satu blok kode dalam sebuah subrutin, yang kemudian bisa dipanggil (call) untuk dijalankan. Hal ini tidak saja membuat program kita lebih rapi dan terstruktur, namun dapat menghemat penggunaan memory program jauh lebih efisien. Untuk perintah CALL ini, pada 8051 menyediakan dua buah instruksi, yaitu LCALL (long call) untuk memanggil subrutin pada jarak jauh, sedang ACALL (Absolute Call) adalah digunakan untuk memanggil subrutin dengan jarak menengah. 8051 tidak menyediakan CALL jarak pendek.

LCALL (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.

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.

Contoh 3-8

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 ;salin A pada P1 ;Tunda ;Isi A dengan AAh ;salin A pada P1

MOV P1,A ACALL DELAY MOV A,#0AAh MOV P1,A

ACALL DELAY SJMP LAGI

;Tunda ;Ulang

;Tundaan Waktu ORG 300h DELAY: MOV R5,#0FFh ULANG: RET END ;R5 = FFh sebagai pencacah counter ;Tunggu sampai R5 = 0

DJNZ R5,ULANG

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: MOV R4,#255 LANJUT: ULANG:

;pangkal(nested) dari subruitn ;R4 = 255 (FFh) ;R5 = 255 (FFh) ;tetap di sini smp R4=0

MOV R5,#255 DJNZ R5,ULANG

DJNZ R4,ULANG

;decrement R4

;isi terus R5 smp R4=0

RET

;kembali ke pemanggil

Instruksi CALL dan aturan dalam Stack

Stack dan pointer-nya akan kita bahas lebih menyeluruh pada bab 5. Namun untu sedikit lebih mengerti isi stack pada CPU, kita akan pelajari isi stack dan pointernya untuk contoh 3-8. Yang ditunjukkan pada contoh 3-9.

Contoh 3-9

Periksalah isi stack setelah mengeksekusi LCALL pertama dalam program dibawah ini.

jawaban:

Lokasi Opcode 0000 0000 0002 0004 0007 0009 000B 000E 0010 7455 F590 120300 74AA F590 120300 80F0 9 1

Baris

Instruksi ORG 0

2 3 4 5 6 7 8

LAGI:

MOV A,#55h ;anu

;anu

MOV P1,A ACALL DELAY MOV A,#0AAh MOV P1,A ACALL DELAY SJMP LAGI

;anu ;anu ;anu ;anu ;anu

0010 0300 0300 0300 0302 0304 0305 7DFF DDFE 22

10 11 12 13

;Tundaan Waktu ORG 300h DELAY: MOV R5,#0FFh ;anu ;anu

14 15 16

ULANG: DJNZ R5,ULANG RET END

Saat mengeksekusi LCALL pertama, alamat dari instruksi MOV A,#0Aah kemudian disimpan ke dalam stack. Perhatikan yang pertama disimpan adalah lowbyte baru kemudian high byte. Instruksi terakhir dari rutinyang dipanggil haruslah instruksi RET, dimana akan membuat CPU mengambil 2-byte (POP) dari stack ke dalam PC dan kemudian kembali menjalankaninstruksi mulai dari alamat 0007h. Diagram dibawah mengilustrasikan bingkai stack setelah LCALL.

Menggunakan instruksi PUSH dan POP di dalam Subrutin

Saat kita memanggil subrutin dengan instruksi CALL, memory stack akan menyimpan alamat di mana CPU akan kembali setelah menjalankan subrutin. Dengan demikian, kita harus sangat-sangat hati-hati saat hendak memanipulasi isi memory stack. Aturannya adalah bahwa jumlah perintah PUSH harus sama dengan jumlah POP yang keduanya digunakan dalam subrutin. Dengan kata lain di dalam subrutin, dimana ada PUSH di situ haruslah ada POP. Lihat contoh 3-10.

Kecuali kita benar-benar mengerti apa yang kita lakukan dan tahu resikonya, tidak dilarang bagi kita untuk mengubah stack. Sekali lagi, hanya jika kita benar-benar mengerti apa yang kita kerjakan.

Memanggil subrutin

Dalam pemrograman bahasa assembler, biasanya kita memiliki satu rutin utama dan beberapa subrutin. Program utama dijalankan begitu CPU dinyalakan. Dan dalam perjalanannya program utama bisa memanggil subrutin-subrutin tersebut sekali maupun berulang-ulang untuk tujuan tertentu yang sudah ditentukan. Selanjutnya kita dapat menempatkan subrutin-subrutin tersebut sebagai modul-modul terpisah, dan bahkan disimpan pada file terpisah. Dengan demikian program akan terlihat menjadi sangat ringkas dan terstruktur dengan baik. Dan jika ada kesalahan program, kita dapat melokalisasi kesalahan tersebut dengan mudah. Dalam prakteknya modul-modul tersebut dapat digunakan sebagai modul-modul untuk program yang lain. Sehingga akan dapat mempersingkat waktu perancangan program lainnya. Contoh 3-10

Periksa stack untuk instruksi LCALL pertama dari program di bawah ini.

LOC OBJ LINE INSTRUCTION 0000 0000 7455 0002 F590 0004 7C99 0006 7D67 1 2 3 4 5 ORG 0 LAGI: MOV A,#55h ; A = 55h ; P1 = A

MOV P1,A

MOV R4,#99h ;.. MOV R5,#67h ;.. ACALL DELAY ;Tunda

0008 120300 6 000B 74AA 7

MOV A,#0AAh ; A = AAh

000D F590

MOV P1,A

; P1 = A ;Tunda

000F 120300 9 0012 80EC 10 0014 0300 11 12

ACALL DELAY SJMP LAGI

;Ulang terus

;Tundaan Waktu ORG 300h DELAY: PUSH 4 PUSH 5 ;Push R4 ;Push R5

0300 C004 13 0302 C005 14 0304 7CFF 15 0306 7DFF 16 0308 DDFE 17 030A DDFA 18 030C D005 19 030F D004 20 0310 22 0311 21 22

MOV R4,#0FFh ;R5 = FFh LANJUT: MOV R5,#0FFh ;R5 = 255 ULANG: DJNZ R5,ULANG ;.. DJNZ R4,LANJUT ;.. POP 5 POP 4 RET END ;Pop to R5 ;Pop to R4

Jawaban:

Perhatikan bahwa untuk instruksi PUSH dan POP operand yang digunakan hanya, sekali lagi hanya register dengan pengalamatan langsung (Direct Address). Dan ini bingkai stack setelah instruksi LCALL pertama.

Harap diingat bahwa saat menggunakan LCALL, alamat tujuan dapat berada di semua alamat yang bisa dijangkau 8051, yakni 0000 s/d FFFFh. Hal yang berbeda jika menggunakan instruksi call yang lain, ACALL, di mana akan dijelaskan nanti.

;- PROGAM UTAMA MEMANGGIL SUBRUTIN

MULAI:

LCALL SUBRUTIN_1 LCALL SUBRUTIN_2 LCALL SUBRUTIN_3

SELESAI:

SJMP SELESAI

;-Akhir dari Rutin Utama

SUBRUTIN_1: RET

;-Akhir dari Sub Rutin 1

SUBRUTIN_2:

RET ;-Akhir dari Sub Rutin 2

SUBRUTIN_3: RET

;-Akhir dari Sub Rutin 3

Gambar 3-1: Ilustrasi bagaimana Program memanggil subrutin-subrutin pada Assembler 8051.

ACALL (absolute call)

ACALL adalah instruksi 2-byte yang berbeda dengan LCALL yang merupakan instruksi 3-byte. Alamat tujuan dalam instruksi ACALL haruslah berada dalam blok 2 KB yang sama dari perintah ACALL tersebut. Persisnya adalah blok yang sama dengan alamat yang persis di bawah ACALL (mirip dengan AJMP). Tidak ada perbedaan antara ACALL dan LCALL dalam hal penanganannya dalam subrutin. Di mana nilai PC akan disimpan dalam stack, dan menjalankan subrutin sampai menemukan instruksi RET. Dan kembali menjalankan instruksi yang tepat di bawah instruksi ACALL tadi. Pada beberapa versi turunan dari 8051, seperti AT89C2051, chip ini memiliki memory program hanya sebesar 2 KB di dalamnya. Sehingga hanya dengan instruksi ACALL seluruh alamat memory program sudah dapat dijadikan tujuan ACALL. Dengan demikian menggunakan ACALL akan membuat ukuran kode program kita menjadi lebih kecil dibandingkan dengan menggunakan LCALL.

Contoh 3-11

Seorang perancang menggunakan mikrokontroller AT891051 yang hanya memiliki 1 kB ROM flash di dalam chip. Yang mana yang paling baik untuk digunakan, yaitu intruksi LCALL dan instruksi ACALL.

Jawaban:

Dengan hanya menggunakan ACALL, kita dapat mengakses semua alamat dalam ROM flash dalam chip. Dibanding LCALL, kita setiap ACALL, kita dapat menghemat 1 byte.

Tentu saja untuk tujuan membuat program yang ringkas, kita dapat memprogram lebih efisien jika memiliki pengetahuan yang baik akan instruksi-instruksi yang dimiliki oleh mikoroprosesor dan menggunakanya dengan bijaksana. Lihat contoh 3-12.

Contoh 3-12

Tulis ulang Contoh 3-8 paling efisien yang anda bisa.

Jawaban:

ORG 0 MOV A,#55h LAGI: MOV P1,A ;Isi A dengan 55h ;salin A pada P1 ;Tunda ;Balik A ;Ulang

ACALL DELAY CPL A SJMP LAGI

;Tundaan Waktu

DELAY: MOV R5,#0FFh ULANG: RET ;R5 = FFh sebagai pencacah counter ;Tunggu sampai R5 = 0

DJNZ R5,ULANG

Ingat dalam program ini langkah pertama adalah membuat A menjadi 55h. Dengan mencomplement A kita mendapatkan AAh, men-complement A sekali lagi kita mendapatkan lagi 55h, demikian seterusnya. Kenapa ? 01010101 biner untuk 55h, jika dicomplement akan menjadi 10101010, yaitu AAh. Sekali lagi dicomplement akan menjadi seperti semula, yaitu 01010101.

SUBBAB 3,3: MEMBUAT TUNDAAN WAKTU DAN PERHITUNGANNYA

Dalam subBAB yang lalu kita menggunakan subrutin DELAY. Bagaimana membuat berbagai Tundaan waktu dan menghitung tundaan yang benar, akan kita bahas pada subBAB ini.

Siklus Mesin

Siklus Mesin (dalam bahasa madura : Machine Cycle). Untuk CPU menjalankan setiap instruksinya dibutuhkan beberappa ciklus clock. Pada keluarga 8051, siklus clock ini kemudian disebut dengan machine cycle. Berserta siklus mesin-nya. Untuk menghitung tundaan waktu, kita menggunakan daftar ini. Pada keluarga 8051, lama dari siklus mesin tergantung pada frekuensi dari kristal osilator yang terhubung pada system 8051. Kristal osilator ini bersama dengan rangkaian pendukung di dalam chip, membentuk sumber clock bagi CPU 8051 (lihat bab 4). Frekeunsi dari kristal osilator yang dapat dihubungkan bervariasi mulai dari 4 MHZ sampai dengan 33 MHz, tergantung dari frekuensi yang dibolehkan bagi setiap jenis chip 8051. Namun dari pada itu, frekuensi 11.0592 MHz (atau kelipatannya) adalah ideal digunakan agar 8051 dapat kompatibel dengan port serial milik komputer PC kita (lihat bab 10). Pada 8051, setiap siklus mesin setidak dibutuhkan 12 perioda osilator. Sehingga perhitungannya adalah frekuensi siklus mesin adalah 1 / 12 dari frekuensi osilator. Lihat contoh 3-13.

Contoh 3-13

Berikut ini ditunjukkan frekuensi kristal untuk tiga system berbasis 8051 berbeda. Cari perioda dari siklus mesin masing-masing .. (a) 11.0592 MHz (b) 16 MHz (c) 20 MHz

Jawaban:

(a) (b) (c)

11.0592/12 = 921.6 kHz, siklus mesin = 1/921.6 kHz = 1.085 uS 16 20 /12 = 1.333 MHz, siklus mesin = 1/1.333 MHz = 0.75 uS /12 = 1.666 MHz, siklus mesin = 1/921.6 MHz = 0.60 uS

Contoh 3-14

Untuk system 8051 dengan 11.05920 MHz, cari berapa panjang waktu untuk mengeksekusi setiap instruksi di bawah ini

(a) MOV R3,#55 (b) LJMP (g) MUL AB

(b) DEC R3

(c) DJNZ R2,Target

(e) SJMP

(f) NOP (No Operation)

Jawaban:

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.

Instruksi (a) MOV R3,#55 (b) DEC R3

Siklus mesin 1 1 2 2 2 1 4

Lama eksekusi 1 x 1.085 uS = 1.085 uS 1 x 1.085 uS = 1.085 uS 2 x 1.085 uS = 2.17 uS

(c) DJNZ R2,Tareget (b) LJMP (e) SJMP (f) NOP (No Operation) (g) MUL AB

2 x 1.085 uS = 2.17 uS 2 x 1.085 uS = 2.17 uS 1 x 1.085 uS = 1.085 uS 4 x 1.085 uS = 4.34 uS

Perhitungan Tundaan

Seperti yang kita lihat pada sub BAB lalu, subrutin untuk tundaan memiliki dia bagian penting: (1) pengaturan counter, dan (2) loop. Sebagian besar dari tundaan waktu dikerjakan oleh bagian tubuh dari loop, seperti yang ditunjukkan contoh 3-15

Contoh 3-15

Cari panjang tundaan waktu dari rutin berikut, jika frekuensi kristal = 11.0592 MHz.

Siklus Mesin MOV A,#55h LAGI: MOV P1,A

ACALL DELAY CPL A SJMP LAGI

;Tundaan Waktu

DELAY: MOV R3,#200 ULANG: RET DJNZ R3,ULANG

Jawaban:

Dari Tabel A-1 dalamLampiran A, kita mendapatkan siklus mesin dari masing-masing perintah dalam subrutin DELAY.

Siklus Mesin DELAY: MOV R3,200 ULANG: RET DJNZ R3,ULANG 1 1 2

Sehingga waktu tundaan adalah [(200 x 2) +1+1] X 1.085 Us = 436.17 uS.

Kita dapat menghitung tundaan waktu (berbasis instruksi) di dalam loop, dan mengabaikan siklus clock yang digunakan instruksi diluar loop.

Pada contoh 3-15, 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 3-16.

Loop Tundaan di dalam Loop

Salah satu cara yag lain untuk menghasilkan tundaan waktu yang panjang adalah dengan menggunakan loop di dalam loop. Di mana hal ini dinamankan pula dengan nested loop. Lihat contoh 3-17.

Contoh 3-16

Cari tundaan waktu dari rutin berikut, dengan menganggap frekuensi kristal = 11.0592 MHz.

Siklus Mesin DELAY: MOV R3,#250 ULANG: NOP NOP NOP NOP 1 1 1 2 1 1

DJNZ R3,ULANG RET 1

Jawaban:

Waktu tundaan dalam loop ULANG dalah [250(1+1+1+1+2)] X 1.085 Us = 1500 X 1.085 Us = 1627.5 Us. Dan ditambahkan pula dua instruksi diluar loop kita akan mendapatkan 1627.5 uS + 2 x 1.085 uS = 1629.67 uS.

Contoh 3-17

Untuk Siklus Mesin = 1.085 uS, cari tundaan waktu dari subrutin di bawah ini. Siklus Mesin DELAY: MOV R2,#200 LANJUT: MOV R3,250 ULANG: NOP NOP 1 2 1 1 1

DJNZ R3,ULANG

DJNZ R2, LANJUT 2 RET 1

Jawaban:

Untuk loop ULANG, kita akan mendapatkan (4 x 250) 1.085 uS = 1085 uS. Dan LANJUT mengulang loop ULANG sebanyak 200 kali, sehingga kita mendapatkan 200 x 1085 = 217000, 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.085 uS) = 651 uS kelebihan waktu. Sehingga panjang sebenarnya dari ke dua loop adalah 217000 + 651 = 217651 uS = 217,651 mS. Adapun perhitungan tersebut masih mengabaikan perintah diawal dan diakhir subrutin yaitu CALL dan RET, yang masing-masing membutuhkan 2 MC.

Penulisan Program lebih Cepat

Ada satu lagi instruksi sejenis yang didukung oleh assembler 8051, yaitu JMP. Syntaxnya JMP Label. Pada instruksi ini, assembler akan melakukan .. 1. 2. 3. Mencari nilai alamat instruksi pertama setelah instruksi JMP. Menghitung jarak alamat di atas tersebut dengan lokasi label yang dituju. Memilih menggunakan SJMP, AJMP, atau LJMP.

Jika jaraknya sangat pendek maka assembler akan menggunakan SJMP, dan jika jaraknya lebih jauh maka assembler menggunakan AJMP, dan jika sangat jauh maka LJMP yang digunakan. Sangat mudah bukan?! Satu-satunya masalah dari instruksi JMP Label dan sejenisnya seperti CALL Label, jika label berada dibawah perintah tersebut, assembler akan langsung menggunakan LJMP atau LCALL hal ini disebut forward reference. Dan dapat dipastikan program kita akan sedikit lebih gemuk.

Penulisan instruksi Jump dengan JMP Label, atau instruksi Call dengan CALL Label, akan membuat perancangan progran lebih cepat. Dan untuk mengatasi masalah forward reference tersebut maka para perancang program selalu membuat subrutinsubrutin di atas rutin utama. Sehingga label dituju JMP maupun CALL sekiranya berada di atas pula. Demikianlah kebiasaan para perancang program tersebut.

RINGKASAN

Aliran dari proses program adalah selalu berurutan, dari instruksi ke instruksi berikutnya, kecuali instruksi pemindahan kontrol (control transfer instruction) di-eksekusi. Macammacam dari instruksi pemindahan kontrol dalam bahasa Assembler adalah condtional jump (lompat bersyarat), unconditioanl jump (lompat tidak bersyarat), dan instruksi call. Loop action pada bahasa Assembler 8051, dikerjakan dnegan menggunakan instruksi khusus dimana akan men-decrement counter dan melompat pada ujung loop jika counter tidak nol. Instruksi Jump lainnya adalah dengan lompat bersyarat, yang berdasarkan nilai CY, akumulator, atau bit port I/O dan lainnya. Lompat tidak bersyarat dapat berupa

lompat jarak pendek yang tergantung nilai relatif pada alamat target. Perhatian khusus harus diberikan atas pengaruh insturksi LCALL dan ACALL terhadap stack.

Catatan penterjemah: Saya sendiri mendapatkan banyak manfaat dari bab ini. Karena saya menjadi semakin mengerti bagaimana proses jump itu sebenarnya. Namun jika anda bertanya apakah kita harus selalu melakukan perhitungan-perhitungan tersebut saat membuat sebuah program. Jawabannya tentu saja tidak. Serahkan perhitungan tersebut kepada Assembler, kita tinggal menentukan target jump dengan label. Dan periksa pada file list, lalu buatlah sedikit modifikasi jika terdapat error destination out range. Perkecil jarak jump dengan label. Mudah bukan?

Tutorial MCS-51 Pemrograman Port I/O


February 25th, 2011 Musbikhin

BAB 4
Sasaran Setelah anda menamatkan bab ini , diharapkan anda dapat : Menjelaskan kegunaan setiap pin pada mikrokontroler 8051. Menjelaskan 4 port dari 8051. Menerangkan dua kegunaan dari port 0 untuk digunakan sebagai Data dan juga sebagai Alamat. Membuat program dgn bahasa Assembly dan menggunakan port sebagai Input maupun sebagai Output. Menerangkan kegunaan port 3 sebagai sinyal interupsi. Membuat program dengan instruksi penanganan I/O dalam 8051. Membuat program dengan instruksi manipulasi-Bit dalam 8051. Bab ini akan menjelaskan pin-pin dalam 8051 dan kemudian menunjukkan pemrograman port I/O pada 8051 dengan beberapa contoh.

SubBAB 4.1 : Penjelasan Pin dalam 8051 Beberapa anggota keluarga 8051 (seperti 8751, 89C51, DS5000) hadir dalam berbagai kemasan, contohnya DIP(dual in-line package), QFP (quad flat package), dan LLC (leadless chip carrier), mereka semua memiliki 40 pin yang kesemuanya memiliki fungsi tersendiri, misalnya sebagai I/O, RD, WR, alamat, data, dan Interupsi. Namun beberapa pabrik membuat versi 20-pin dari 8051 dengan tujuan mengurangi jumlah port I/O untuk digunakan dalam aplikasi yang tidak terlalu membutuhkan banyak pin. Namun bagaimanapun juga kebanyakan pabrik membuatnya dengan kemasan 40-pin. Nah kita akan lebih berkonsentrasi pada yang satu itu.

Gambar 4-1 Diagram pin-pin dalam 8051

Dari gambar di atas kita dapat lihat, itu adalah diagram untuk kemasan 40-pin. Adapun fungsi pin dalam kemasan yang lain misalnya kemasan 20-pin adalah merujuk pada kemasan 40-pin tersebut. Sehingga bahasan di bawah ini juga dapat digunakan untuk versi 20-pin. Lihat sebenarnya dari ke 40 pin tersebut kita mendapatkan 32 pin yang bisa digunakan untuk Input/Output. Dibagi menjadi 4 buah port yakni P0, P1, P2, dan P3. Masing-masing port memiliki 8 pin, yang membuatnya juga disebut sebagai port 8-bit. Sedang pin yang lain digunakan untuk Vcc, Gnd, Xtal1, Xtal2, RST, EA, ALE, PSEN. Pin-pin terakhir itu yakni Vcc, Gnd, Xtal1, Xtal2, RST, dan EA, selalu ada dalam semua versi 8051. Dengan kata lain pin-pin terakhir itu harus dihubungkan pada system untuk dapat bekerja, untuk versi-versi dari 8051. Sedang ke dua pin lainnya yakni ALE dan PSEN digunakan terutama pada system yang berbasis 8031, yakni versi 8051 yang di dalam chip-nya sama sekali tidak memiliki ROM untuk kode program, sehingga membutuhkan ROM eksternal untuk dapat bekerja. Dalam rangka penggunaan Memory Eksternal tersebut, pin ALE dan PSEN menjadi sangat penting. Kesemuanya akan kita bahas lebih mendalam pada bagian lain dalam bab ini. Vcc Pin 40 adalah digunakan sebagai sumber daya bagi 8051. Umumnya diberikan dengan tegangan +5V. Walaupun ada yang cukup diberi tegangan setinggi +3,3 Volts. GND Pin untuk Ground. Biasanya terhubung dengan Gnd catu daya. XTAL1 dan XTAL2

8051 memiliki unit pembangkitan frekuensi atau oscilator mandiri di dalam chipnya. Satu-satunya yang dibutuhkan oleh unit ini adalah sebuah vibrator frekuensi atau resonator atau lebih populer disebut dengan Kristal Osilator. Sembarang kristal osilator dapat digunakan dengan jangkauan yang tidak melebihi kemampuan chip (misalnya max 24MHz untuk AT89C51). Kristal dapat langsung dihubungkan pada pin-18 dan pin-19. Namun dalam beberapa petunjuk mengenai osilator, menghubungkan dua kapasitor kecil sekitar 30PF pada kedua pin dan Ground dapat meningkatkan stabilitas frekuensi. 8051 dapat pula dihubungkan dengan sebuah pembangkit frekuensi external, sehingga unit pembangkit internal tidak digunakan. Yakni dengan menghubungkan keluaran pembangkit frekuensi eksternal tersebut pada pin XTAL1, dan pin XTAL2 dibiarkan tidak terhubung.

Gambar 4.2 (a)Koneksi X-tal dan (b)koneksi dengan sumber clock eksternal.

RST Pin-9 ini disebut dengan pin RESET. Fungsinya sangat penting saat kita menginginkan untuk me-reset system. Pin tersebut normalnya adalah rendah, dengan memberikan pulsa tinggi maka membuat 8051 dalam keadaan reset dan kerja dimulai dari awal. Ada dua jenis reset yang kita ketahui. Pertama adalah reset power-on, yakni kondisi reset saat system pertama dinyalakan. Hal ini sangat penting agar system dapat bekerja benar-benar dimulai dari awal, sesaat setelah semua tegangan catu daya dalam system telah sempurna. Tentu saja agar tidak terjadi logika palsu karena system kekurangan daya saat system mulai bekerja. Reset power-on ini dapat diselenggarakan dengan hanya menambahkan sedikit komponen, yakni sebuah resistor dan sebuah kapasitor.

Gambar 4-3 Contoh Power On Reset (a) dan Manual Reset (b)

Sedang reset yang lain adalah reset saat system sudah bekerja namun user (kita) menginginkan 8051 berhenti dan mengulang tugas-tugasnya mulai dari awal seperti hal dengan power-on reset. Hal tersebut biasanya digunakan 8051 nantinya untuk keluar dari dalam keadaan tidak menentu, yang biasanya disebut dengan Hang. Reset semacam ini biasanya juga disebut sebagai Hot Reset. Yakni menggunakan komponen PowerOn Reset ditambah sebuah saklar yang menghubug singkatkan Condensator 10uF. EA keluarga 8051 seperti 8751, 89C51, dan DS5000, semuanya hadir dengan ROM di dalam Chip itu sendiri. Namun dalam kasus yang lain, misalnya yang terjadi pada 8031 yang selalu membutuhkan ROM Eksternal. Pin ini menjadi sangat penting. Untuk 8031 pin tersebut harus dihubungkan pada Ground. Sedang untuk Chip yang didalamnya memiliki ROM sendiri, status pin tersebut memiliki arti yang berbeda. Pastikan pin ini terhubung dengan VCC agar CPU menggunakan ROM internal sebagai ROM utama. PSEN Ini adalah pin output. PSEN adalah kepanjangan dari Program Store Enable. Pada system yang berbasis 8031 (atau lainnya) yang harus menggunakan memory / ROM eksternal, maka pin ini menjadi sangat penting. Pin yang aktif rendah ini, digunakan untuk membaca kode dari ROM, dan biasanya pin ini dihubungkan pada pin OE pada ROM. Lihat bab 14 untuk lebih jelasnya. ALE Singkatan dari Address Latch Enable. Ini adalah pin yang aktif high. Seperti halnya dengan PSEN, pin ini hanya berguna untuk system yang berbasis 8031 (atau lainnya) yang harus menggunakan memory ROM eksternal. Pin ini biasanya

dihubungkan dengan lacth semacam 74LS373 yang tujuan akhirnya adalah memisahkan P0 dari fungsinya sebagai port data dan port Alamat. Secara lebih jelas akan dijelaskan pada BAB 14. Pin-pin Port I/O dan kegunaannya Ada setidaknya 4 port P0, P1, P2, dan P3 yang masing-masing memiliki 8-pin, hingga kadang disebut sebagai port 8-bi . Semua port tersebut saat RESET diatur menjadi dalam keadaan tinggi, sehingga port tersetut langsung dapat digunakan sebagai port Input. Data bisa dibaca pada masing-masing port tersebut. Namun port juga bisa langsung digunakan sebagai port output. Status bisa pada port bisa langsung diubah-ubah. Namun saat menggunakan port sebagai input setelah port digunakan sebagai output, maka beberapa pertimbangan harus diambil. Hal itu akan dijelaskan kemudian. Port 0

Port 0 memiliki 8 pin, yang kita kenal sebagai pin 32 s/d 39. Sebagai port Input/Output pin-pin ini dapat digunakan sebagai input maupun output. Namun saat digunakan sebagai port I/O biasa, maka port ini harus dihubungkan dengan sebuah resistor external yang menghubungkan setiap pin kepada VCC. Nilainya berkisar 10 Kohms. Resistor ini disebut sebagai resistor Pull-Up. Struktur hardware dari port ini adalah seperti pada chip TTL yang memiliki output Open Colektor. Namun untuk keluarga 8051 yang terbuat dari CMOS maka port tersebut bisa dinamakan dengan Open Drain. Dengan kata lain agar Port 0 sama fungsi dengan dengan port yang lain , maka kita perlu untuk memasangkan resistor pull-up ini. Di bawah ini adalah kode untuk melihat apakah koneksi port 0 dan pullup nya di dalam PCB sudah baik. Yakni port harus berlogika 0, 1, dan 0 lagi demikian seterusnya. MOV A,#55h ULANG: MOV P0,A CPL A CALL DELAY SJMP ULANG Port 0 digunakan sebagai Input

Port 0 dirancang untuk sebuah alasan tertentu adalah tidak dilengkapi dengan resistor pullup internal. Sehingga dalam tujuan untuk menggunakannnya sebagai sebagai port input biasa maupun output biasa maka resistor ini menjadi sangat

penting. Lihat Gambar 4-4. Di bawah ini juga dicontohkan dengan program, yang menjadikan port 0 sebagai input. Dengan anggapan bahwa status port 0 sebelumnya tidak diketahui, dan bukan setelah RESET. Lalu membaca status dari port 0 dan menampilkan hasilnya pada Port 1, yang dilakukan secara terus menerus. Gambar 4-4 Port 0 dengan resistor pullup MOV A,#0FFh MOV P0,A ULANG: MOV A,P0 MOV P1,A SJMP ULANG Dua keistimewaan pada Port 0

Port 0 dan Port 2 adalah pasangan port yang digunakan untuk keperluan menghubungkan CPU dengan memory exkternal. Seperti yang digambarkan pada gambar 4-1, port 0 juga memiliki nama sebagai AD0 AD7, hal itu karena sebenarnya port-0 memiliki fungsi sebagai Port Data dan Port Address. Dalam semua desain keluarga 8051, saat chip dihubungkan dengan memory external, atau peralatan lain yang lokasinya ada dalam peta memory tersebut, ada parameter utama yang sangat penting. Yakni alamat-nya, dan data-nya. Chip memory memiliki pin untuk alamat dan data tersendiri. Namun untuk 8051 dengan tujuan menghemat jumlah pin yang memang sudah terlalu banyak untuk digunakan dalam sebuah chip. Akhirnya Intel menggabungkan alamat A0 s/d A7 dengan data D0 s/d D7, sehingga ke 16 fungsi tersebut dapat dihemat dengan menggunakan 8 pin saja. Sehingga kemudian pin ini dapat disebut sebagai pin AD0 s/d AD7. Hanya dengan pin ALE, kita dapat mengetahui apakah saat itu port-0, sedang berisi data atau alamat. Dan dengan menghubungkan ALE dengan sebuah Chip TTL seperti 74LS373 kita dapat benar-benar memisahkan AD0 s/d AD7 menjadi Data D0 s/d D7 dan kemudian Alamat A0 s/d A7. Saat port tersebut digunakan untuk menguhubungkan CPU dengan memory eksternal maka fungsi port standar I/O menjadi todak berlaku. Programmer saat itu sebaiknya tidak menggunakan port 0, Port 2, serta Port 3 (bit RD dan WR) untuk digunakan sbegaai port I/O biasa. Port 1

Dalam 8051 hanya Port 1 inilah yang murni dapat digunakan sebagai port Input/Output stndar. Secara prinsip, port 1 adalah sama saja dengan port 0. Perbedaan yang mencolok dengan port 0 adalah port 0 yang membutuhkan resistor pull-up, sementara port 1 tidak karena ternyata sudah diperlengkapi

dengan resistor pullup internal. Saat setelah RESET, port dalam logika tinggi, sehingga port dapat langsung digunakan sebagai input maupun output. Di bawah ini kita akan belajar untuk membuat kode yang port memiliki status bolak-balik (flip-flop) dari nilai #55H menjadi #055h, kembalike 55h dan seterusnya. MOV A,#55h ULANG: MOC P1,A CALL DELAY CPL A SJMP ULANG Port 1 digunakan sebagai Input

Untuk membuat port 1 sebagai input , maka port ini harus diprogram sebelumnya dengan membuatnya menjadi 1s, persis yang dilalukannya saat RESET. Untuk hal ini, akan dijelaskan secara lengkap pada Lampiran C-2. Kode program berikut ini adalah mula-mula port 1 dikonfigurasi menjadi input port dengan menulisnya menjadi 1s, dan kemudian data dibaca dari port, dan disimpan pada register R7, R6, dan R5. MOV A,#0FFh ;A = FF hex MOV P1,A ;buat P1 sebagai input port ; dgn menulis semua portnya jd 1s MOV A,P1 ;ambil data dari P1 MOV R7,A ;simpan pada register R7 CALL DELAY ;tunggu sejenak MOV A,P1 ;ambil data dari P1 MOV R6,A ;simpan pada register R6 CALL DELAY ;tunggu sejenak MOV A,P1 ;ambil data dari P1 MOV R5,A ;simpan pada register R5

Port 2

Port 2 juga memiliki total 8 buah pin, yakni mulai dari pin 21 s/d 28. Masingmasing portnya juga dapat digunakan sebagai port Input dan Output. Seperti juga dengan port 1, port ini tidak membutuhkan resistor pull-up ekternal seperti port 0, karena port ini sudah diperlengkapi dengan resistor pullup tersebut secara internal. Setelah RESET, port sudah ditulis dalam keadaan tinggi, sehingga port dapat langsung digunakan sebagai input maupun output. Namun

jika hendak digunakan sebagai input setelah menggunakannya sebagai output, maka port harus dipastikan telah diatur menjadi tinggi sebelum digunakan sebagai input. Port 2 digunakan sebagai Input

Untuk menjadikan port 2 ini sebagai input, maka kita harus memastikan bahww port harus sudah diprogram menjadi 1s. Seperti yang didapatnya setelah RESET. Dibawah ini adalah contoh untuk menerima data dari P2, dan mengirimkan hasilnya pada P1 secara berulang-ulang. MOV A,#0FFh ;isi A dengan FFh MOV P2,A ;buat P2 sebagai input ULANG: MOV A,P2 ;Baca data P2, dan tempatkan pada A MOV P1,A ;Kirim hasil pada P1 SJMP ULANG ;Ulang Dua keistimewaan pada Port 2

Sebagaimana yang kita tahu bahwa Port 2 dan Port 0 adalah pasangan port yang nantinya bisa digunakan oleh CPU untuk berhubungan dnegan memory eksternal. Dalam prosesnya, biasanya memory ekternal membutuhkan semua pin pada port 0 dan Port 2 serta pin Rd dan WR dari port 3. Dalam proses ini. programer (kita) sebaiknya tidak menggunakan port-port yang sudah terpakai tersebut untuk digunkan sbegai port I/O biasa. Dalam proses ini pula port 2 adalah bertindak sebagai pemberi alamat A8 s/d A15. Berbeda dengan Port 0 yang menrtindak sebagai pemberi alamat sekaligus data, AD0 s/d AD7. Hal ini biasanya digunakan untuk system yang berbasiskan 8031 dan bukan untuk system yang memiliki ROM internal seperti AT89C51, kecuali anda menganggap memory internal yang ada tersebut masih kurang. Namun jika hubungan seperti diatas tidak digunakan oleh CPU (misalnya untuk system AT89C51), maka port 2 (dan Port 0) ini bisa digunakan sebagai port I/O biasa sebagaimana port 1 dan yang lain. Port 3

Seperti juga dengan port-port yang lain, port 3 ini memiliki 8 pin. Port ini juga bisa digunakan sebagai port input/output biasa. Port sudah diperlengkapi dengan pullup internal. Dan setelah dalam keadaan RESET, port sudah diprogram dalam

status tinggi. Sehingga langsung dapat digunakan sebagai input maupun output. Namun jika digunakan sebagai input setelah digunakan sebagai output, maka programmer harus memastikan bahwa port harus diprogram tinggi sebelum digunakan sebagai input. Pin-pin dalam Port 3 ini memilik fungsi-fungsi khusus, yang sangat penting. Misalnya ntuk membangkitkan timer / Counter, interupsi, komunikasi serial, dan pengatur baca tulis pada memory eksternal. Lihat gamnbar 4-2 penjelsan dari port 3 ini. P3.0 dan P3,1 digunakan sbegai pin RxD dan TxD untuk komunikasi serial. Lihat BAB 10 untuk penjelasan mengenai komunikasi serial. Sedangkan pin P3.2 dan P3.3 digunakan untuk pembangkit interupsi eksternal. Lihat bab 11 untuk penjelasan tentang Interupsi eksternal. Sedang pin 3.4 dan pin P3.5, masingmasing digunakan untuk Timer/Counter 0 dan Timer/Counter 1 yang akan kita bahasa pada bab 9. Sedang yang terakhir adalah P3.6 dan pin P3.7, adalah WR dan RD yang digunakan untuk membaca dan menulis memory eksternal seperti yang akan kita bahas pada bab 14. Seperti pada pin pada port yang lain, jika pin-pin pada Port 3 tidak digunakan sebagai fungsi khususnya, maka pin tersebut dapat kita gunakan sebagai port input ouput biasa.
Table 4-2 fungsi lain dari port3

Bit Port 3 fungsi pin P3.0 RxD 10 P3.1 TxD 11 P3.2 INT0 12 P3.3 INT1 13 P3.4 T0 14 P3.5 T1 15 P3.6 WR 16 P3.7 RD 17

SubBAB 4-2 : Pemrograman I/O dengan manipulasi bit

Pada subBAB ini kita akan membahas instruksi-instruksi pada 8051 yang berhubungan dengan manipulasi I/O. Kita tahu bahwa 8051 memiliki mesin manipulasi bit yang sangat hebat, termasuk juga untuk manipulasi bit pada Port I/O. Penjelasan lebih menyeluruh akan dijelaskan pada Lampiran C-2. Berbagai cara dalam mengakses ke-8-bit port

Di bawah ini contoh program dari contoh-contoh sebelumnya, yakni untuk mengakses semua bit dalam port 1. ULANG: MOV A,#55h MOV P1,A CALL DELAY MOV A,#0AAh MOV P1,A CALL DELAY SJMP ULANG Program di atas adalah meng-flip-flop setiap bit dalam Port 1. Hal ini biasanya dilakukan saat menguji system dalam rangkaian, apakah jalur-jalur PCB sudah dibuat dengan baik dan benar. Namun tentu saja ada banyak jalan untuk melakukannya dengan singkat. Misalnya adalah program ke dua di bawah ini. ULANG: MOV P1,#55h CALL DELAY MOV P1,#55h CALL DELAY SJMP ULANG

Atau yang lebih sigkat seperti ini .. MOV A,#55h ULANG: MOV P1,A CALL DELAY CPL A SJMP ULANG Atau juga menggunakan fitur Read-Modify-Write seperti yang dijelaskan berikut ini. Fitur Read-Modify-Write

Port dalam 8051 dapat diakses dengan metoda Read-Modify-Write. Fitur ini sangat menyingkat kode yang harus kita buat dalam hubungannya dengan port. Cukup menggunakan 1 buah instruksi untuk 3 proses berbeda, (a) baca port, (b) modifikasi port, dan (c) tulis kembali pada port. Contoh berikut ini adaalah menulis 01010101b (biner) ke dalam port 1. Selanjutnya menggunakan instruksi XLR P1,#0FFh untuk melakukan komplement, atau membalik status dari masing-masing bit pada port (flip-flop). Sehingga nantinya port akan ditulis menjadi 10101010b. Dan seterusnya. MOV P1,#55h

ULANG:

XRL P1,#0FFh ;XOR FFh sama dengan CPL CALL DELAY SJMP ULANG Kita tahu bahwa dengan meng-XOR nilai 55h dengan FFh akan meghasilkan AAh. Sebaliknya meng-XOR-kan AAh dengan FFh akan menghasilkan 55h. Instruksiinstruksi logika semacam ini akan dibahas lebih lengkap pada bab 7. Kemampuan port untuk bisa dialamati secara bit

Ada kalanya kita menginginkan mengakses hanya satu bit dalam port. Sementara bit yang lain kita biarkan tidak terpengaruh. Hal ini adalah keistimewaan 8051 yang jarang dimiliki oleh chip-chip lain. Yakni kita dapat memodifikasi hanya 1 bit pot tanpa menganggi bit-bit yang lain dalam port yang sama. Misalya adalah kode berikut ini an akan men- toggle (bolak-balik/flip-flop) bit P2.1 secara terus menerus. ULANG: SetB P1.2 ;P1.2 = high CALL DELAY Clr P1.2 ;P1.2 = low CALL DELAY SJMP ULANG Atau contoh kode ynag lebih singkat adalah semacam ini .. ULANG: CPL P1.2 CALL DELAY SJMP ULANG ;komplement khusus P1.2

Table 4-3 Alamat-alamat bit dalam port

P0 P1 P2 P3 Port Bit | P0.0 P1.0 P2.0 P3.0 D0 | P0.1 P1.1 P2.1 P3.1 D1 | P0.2 P1.2 P2.2 P3.2 D2 | P0.3 P1.3 P2.3 P3.3 D3 | P0.4 P1.4 P2.4 P3.4 D4 | P0.5 P1.5 P2.5 P3.5 D5 | P0.6 P1.6 P2.6 P3.6 D6 | P0.7 P1.7 P2.7 P3.7 D7 | Perhatikan bahwa P1.2 adalah bit ke 3 dari P1. Yakni setelah P1.0 dan P1.1, baru P1.2, dan seterusnya. Tabel 4-3 menjelaskan hal ini. Sedang contoh 4-2 penggunaannya baik model pengaksesan port sebagai data 8-bit dan pengaksesan port sebegai bit tunggal. Contoh 4-2

Tulis program untuk melakukan hal sebagai berikut ijni. (a) Terus memonitir status daro bit P1.2 sammpai tinggi (b) Saat P1.2 tinggi maka tulisnilai 45h pada port 0, dan (c) Kirim pulsa tinggi ke rendah (H-L) pada P2.3 Jawaban: SetB P1.2 ;buat P1.2 sebagai input MOV A,#45h ;A = 45h ULANG: JNB P1.2,ULANG ;tunggi di sini smp P1.2 = tinggi MOV P0,A ;P0 = 45h SetB P2.3 ;sekarang P2.3 tinggi Clr P2.3 ;sekarang P2.3 rendah Dalam program ini, intruksi JNB P1.2,ULANG (JNB artinya lompat jika bit yang dimakses rendah), akan menempatkan program terus menerus dalam loop ULANG selama P1.2 dalam keadaan rendah. Namun saat P1.2 menjadi tinggi, maka program akan keluar dari loop dan melanjutkan menjalankan uiisntruksi di bawah JNB.. Yakni mengri\imkan nilai 45h pada P0 dan membuat pulsa H-L pada P2.3 dengan urutaninstruksi SetB dan Clr.

RINGKASAN BAB ini dimulai dari penjelasan tentang fungsi-fungsi dari setiap pin pada port milik 8051,yakni P0, P1, P2, dan P3. Yang masing-masing memiliki 8 buah pin, dan membuat mereka juga disebut sebagai port 8-bit. Masing-masing port tersebut dapat kita gunakan sebagai port input maupun output. Sedang port 3 dapat pula digunakan sebagai pembangkit interupsi, komunikasi serial, dll. Instruksi-instruksi pada 8051 mengenai port juga kita jelaskan, termasuk juga diberikan beberapa contoh di dalamnya.

MODE PENGALAMATAN PADA 8051


February 25th, 2011 Musbikhin

BAB 5

Sasaran Setelah anda menamatkan bab ini , diharapkan anda dapat : Menerangkan ke-Lima mode pengalamatan pada mikrokontroller 8051. Membedakan dan membandingkan mode pengalamatan tersebut. Membuat code bahasa assember 8051 dalam hal penggunakan untuk masing-masing pengalamatan tersebut Mengakses RAM mengguanakna beberapa mode pengalamatan. Menerangkan pengalamatan untuk SFR(special function register). Menjelaskan bagaimana mengakses SFR Memanipulasi stack menggunakan mode pengalamatan direct. Membuat program untuk memanipulasi table look-up.

CPU dapat mengakses data dari berbagai cara. Data dapat saja berupa register, atau memory, atau dapat berupa data immediate (segera). Banyaknya cara untuk mengakses data tersebut, kemudian disebut sebagai addressing mode. Pada Bab ini kita akan mendiskusikan addressing mode atau mode pengalamatan pada 8051 yang diimbuhi dengan beberapa contoh. Variasi dari mode pengalamatan ini membuat kita mempunyai pilihan utnuk melakukan peng-akses-an RAM yang paling efisien dalam desain program kita. 8051 memberikan total 5 mode pengalamatan. Seperti berikut: (1) Immediate (segera) (2) Register (3) Direct (langsuung) (4) Register Indirect (tidak langsung) (5) Indexed SubBAB pertama dari Bab ini kita akan membahas mod pengalamat immediate dan register. Untuk SubBAB ke dua kita akan mengupas cara mengakses memory menggunakan mode pengalamat langsung, register Indirect, dan mode pengalamatan ter-index. Dibagian lain dalam bab ini kita akan menggunakan mode-mode pengalamatan tersebut untuk berbagai aplikasi yang berbeda. Mengingat para pembaca sangat akrab dengan instruksi MOV

dan ADD, maka kedua instruksi inilah yang digunakan dalam berbagai contoh dalam bab ini.

SubBAB 5.1: Mode Pengalamatan Immediate dan register Dalam bab ini, pertama kita akan mempelajari pengalamatan immediate (segera) dan selanjutnya mode pengalamatan register. Mode pengalamatan Immediate Pada mode ini, operand source adalah konstanta. Dalam mode ini pula, akibatnya operand menjadi segera menjadi kode setelah opcode. Perhatikan bahwa data immediate haruslah diimbuhi dengan tanda pound, #. Mode pengalamatan ini dapat digunakan untuk mengisi informasi ke dalam register, termasuk register DPTR. Contohnya berikut ini MOV MOV MOV MOV A,#25h R4,#62 B,#40h DPTR,#4521h ;isi 25h pada A ;isi bilangan desimal 62 pada R4 ;isi B dengan 40h ;DPTR = 4521h

Karena register DPTR adalah 16-bit, dia dapat diakses pula sebagai dua register 8-bit, yaitu DPH (DPTR High byte) dan DPL (DPTR Low byte). Lihat contoh di bawah ini. MOV DPTR,#2550h adalah sama dengan .. MOV DPH,#25h MOV DPL,#50h Juga perhatikan, kode berikut ini akan menghasilkan error karena nilai operand konstanta yang kita berikan ternyata lebih besar dari 16-bit. MOV DPTR,#68975 ;Salah krn Nilai > 65535 (FFFFh) data

Kita dapat pula menggunakan directive EQU untuk mengakses immediate seperti yang ditunjukkkan dalam contoh di bawah ini.

COUNT

EQU 30 MOV R4,#COUNT MOV DPTR,#MYDATA ORG 200h DB GusDur

;isi R4 dengan 30 desimal ;DPTR = 200h

MYDATA:

Perhatinkan pula kita dapat mengunakan data immediate untuk mengirim data kepada port secara langsung. Misalnya MOV P1,#55h. Mode Pengalamatan Register Mode ini melibatkan dan menggunakan register sebagai tempat untuk menyimpan atau tempat data yang dimanipulasi. Contoh dari mode pengalamatan register adalah sebagai berikut ini. MOV MOV MOV MOV MOV A,R0 R2,A A,R5 A,R7 R5,B ;salin ;salin ;salin ;salin ;salin isi isi isi isi isi R0 pada A A pada R2 R5 pada A R7 pada A B pada R5

Perlu diperhatikan juga bahwa register source dan operand harus tepat ukurannya. Byte untuk byte. Dengan kata lain kode MOV DPTR,A akan menghasilkan error karena register 8-bit yaitu A, dipakasa untuk mengisi sebuah destination yang merupakan register 16-bit. Lihat contoh di bawah ini MOV DPTR,#25F5h MOV R7,DPL MOV R3,DPH Perhatikan bahwa kita dapat memindahkan data di antara akumulator dan Rn (Register 0 s/d 7 ) namun movement seperti ini, jika dilakukan di antara dua register tidak diperkenankan. Misalnya MOV R4,R5, adalah contoh yang salah. Pada dua mode pengalamatan yang telah kita bahas tadi operand yang berbentuk register (Rn) dan Akumulator (A) akan selalu terintegrasi dalam opcode itu sendiri. Sehingga tidak ada kode khusus untuk operand

setelah kode opcode. Dalam program yang lain , adakalanya kita ingin mengakses data dalam RAM maupun ROM. Ada banyak cara untuk melakukanya. Itu semua akan kita bahas pada kesempatan yang lain.

SubBAB 5.2: MENGAKSES MEMORY MENGGUNAKAN BEBERAPA MODE PENGALAMATAN Kita dapat menggunakan mode pengalamatan Direct maupun Register InDirect untuk mengakses data yang tersimpan dalam RAM ataupun setiap register dalam 8051. Topik ini akan kita diskusikan dalam subBAB ini. Kita juga akan diperlihatkan bagaimana mengakses ROM dalam Chip yang berisi data mneggunakan mode pengalamatan terindeks (indexed). Mode Pengalamatan Direct (Langsung) Seperti yang anda tahu dalam bab 2, bahwa ada 128-byte RAM dalam 8051. RAM tersebut ditunjukan dengan alamat 00 s/d 7Fh. Berikut ini adalah ringkasan dari alokasi 128 byte RAM 8051. 1. lokasi RAM 00 s./d 1Fh adalah digunakan sebagai bank register atau sebagai stack. 2. lokasi RAM 20h-2Fh juga bisa dialamati secara bit. Dengan alamat bit berurutan 00 s/d 7Fh. Kesemuanya dalam lokasi RAM tersebut. 3. Lokasi RAM 30 s/d 7Fh adalah memory bebas yang semua data disimpan dalam bentuk byte. Dari kesemua 128 byte RAM dapat diakses dengam menggunakan mode pengalamatan langsung (Direct Addressing Mode). Cara seperti inilah yang harus kita lakukan untuk mengakses alamat 30h s/d 7Fh. Pada 8051 ada beberapa instruksi yang dapat langsung menunjuk lokasi register, dan lokasi register tersebut sudah terdapat pada opcode itu sendiri, namun instruksi semacam ini tidak terdapat untuk lokasi RAM yang lain, yakni pada alamat 20h ke atas. Untuk dapat melakukannya, dibutuhkan byte tambahan pada kode yang menunjukkan lokasi RAM yang dimaksud. Harap diperhatikan perbedaan penting dengan mode pengalamatan langsung dan immediate. Hal ini bertolak belakang dengan mode pengalamatan immediate, yang di mana nilai operand yang hendak diproses diberikan oleh byte dalam memory program persis di bagian belakang instruksi yang bersangkutan, sedang untuk pengalamatan langsung nilai yang hendak diproses adalah nilai dari lokasi RAM yang dimaksud. Kedua mode ini

dibedakan dengan menambahkan pegalamatan immediate. MOV R0,40h MOV 56h,A MOV R4,7Fh

simbol

pagar

yang

berarti

untuk

;simpan isi 40h pada R0 (immediate) ;simpan isi A pada lokasi 56h (langsung) ;salin isi lokasi 74h ke R4 (Regsiter)

Seperti yang kita diskusikan sebelumnya bahwa lokasi 0 s/d 7 adalah juga digunakan sebagai bank 0 utnuk register 0 s/d 7. Sehingga lokasi tersebut dapat kita akses dengan dua cara. MOV A,4 MOV 7,A sama dengan sama dengan MOV A,R4 MOV R7,A tidak bahwa bukan

Yang paling perlu anda perhatikan adalah bahwa di sana ditampilkannya simbol #. Ingat simbol ini adalah simbol bilangan dibelakangnya adalah merupakan data immmediate, dan alamat direct. MOV MOV MOV MOV R2,#5 R2,5 A,#35h A,35h

;isi R2 dengan nilai 5 (immediate) ;salin isi RAM lokasi 5 pada R2 (langsung) ;isi A dengan nilai 35h (immediate) ;salin isi RAM lokasi 35h pada A (langsung)

Register SFR dan Pengalamatan-nya Dari selama ini yang kita bicarakan tentang register , kita tahu bahwa R0 s/d R7 adalah bagian dari memory RAM. Lalu dimana tempatnya untuk register register semacam A, B, PSW, dan DPTR ? Lho mereka kan seharusnya memiliki alamat? Jawabannya ya. Dalam 8051 register-register tersebut adalah di-tempat-kan dalam golongan register yang disebut sebagai SFR (Special Function Registers). Umumnya register-register tersebut dibuat bukan untuk tempat kita menyimpan data (walaupun sebenarnya pun bisa), namun registerregister tersebut memiliki fungsi terutama untuk mengendalikan peralatan-peralatan yang terdapat pada chip, misalnya Timer, Serial, Kontrol Power, Port dan lain-lain. Dan semua register-register tersebut juga memiliki nama tertentu. Misalnya register alamat E0h, disebut juga register A, dan register B memiliki alamat F0h. Dalam Tabel 5-1 kita akan melihat secara lengkap registerregister yang termasuk dalam golongan SFR ini.

MOV A,#55h MOV 0E0h,#55h MOV B,#25h MOV 0F0h,#25h MOV A,R2 MOV 0E0h,R2 MOV B,R0 MOV 0F0h,R0

;isi A dengan 55h ;sama artinya dgn di atas ;isi A dengan 25h ;sama artinya dgn di atas ;Salin R2 pada A ;sama artinya dgn di atas ;Salin R0 pada B ;sama artinya dgn di atas

Tabel 5-1 adalah daftar dari Special Function Register 8051 dan alamatalamatnya. Hal berikut ini yang harus diperhatikan untuk mengalamat register SFR ini. 1. SFR memiliki alamat 80h s/d FFh. Kesemuanya hanya bisa diakses dengan cara mode pengalamat langsung (Direct). Beberapa diantara juga bisa dialamati secara bit. Sama persis dengan semua lokasi RAM yaitu 00 s/d 7Fh yang juga bisa dilamati dengan mode pengalamatan langsung. 2. Tidak semua lokasi dalam SFR digunakan, karena tidak ada peralatan yang dihubungkan untuk lokasi tersebut. Lokasi yang tidak dugunakan pada lokasi SFR 80h s/d FFh tersebut dibiarkan kosong, dan kita diminta untuk tidak memodifikasi (menulis) nya. Karena mungkin pada produk yang lebih baru, lokasi-lokasi tersebut digunakan untuk peralatan yang baru dengan fungsi-fungsi tertentu. Tabel 5-1 Alamat-alamat dari SFR (Special Function Register) Simbol ACC * B* PSW * SP DPTR DPL DPH P0 * P1 * P2 * P3 * IP * IE * TMOD Nama Accumulator Register B Program Status Word Stack Pointer Data Pointer 2-bytes Low byte High byte Port 0 Port 1 Port 2 Port 3 Kontrol Prioritas Interupsi Kontrol Enable Interupsi Kontrol Mode Timer/.Counter Alamat 0E0h 0F0h 0D0h 81h 82h 83h 80h 90h 0A0h 0B0h 0B8h 0A8h 89h

TCON T2CON T2MOD TH0 TL0 TH1 TL1 TH2 TL2 RCAP2H RCAP2L SCON * SBUF PCON

Kontrol Timer/Counter Kontrol Timer/Counter 2 Kontrol Mode Timer/.Counter 2 Timer/Counter 0 high byte Timer/Counter 0 Low byte Timer/Counter 1 high byte Timer/Counter 1 Low byte Timer/Counter 2 high byte Timer/Counter 2 Low byte T/C 2 Capture high byte T/C 2 Capture low byte Serial Control Serial data buffer Power Control

88h 0C8h 0C9h 8Ch 8Ah 8Dh 8Bh 0CDh 0CCh 0CBh 0Cah 98h 99h 87h

* = Bit Addressable (dibahas pada bab 8) Pada mode pengalamatan langsung (direct), kita harus perhatikan bahwa alamat data yang bisa ditangani dalam mode ini adalah dalam ukuran byte. Yaitu dengan alamat 00 s/d FFh. Sehingga mode pengalamatan ini hanya mampu untuk mengalamati lokasi-lokasi tersebut. Sebagian untuk RAM dan sebagian lagi untuk SFR.

Contoh 5-1

Tulislah kode untuk mengirim nilai 55h untuk P1 dan P2, berdasarkan (a) namanya dan (b) alamatnya.

Jawaban:

(a) MOV A,#55h MOV P1,A MOV P2,A

;A= 55h ;P1=55h ;P2=55h

(a) Dari Table 5-1, alamat P1 = 80h; alamat P2 = A0h MOV A,#55h MOV 80h,A MOV 0A0h,A ;A= 55h ;P1=55h ;P2=55h

Stack dan mode pengalamatan Direct

Penggunaan umum yang lain dari pengalamat Direct ini adalah untuk manipulasi stack. Dalam 8051 hanya dengan mode pengalamatan ini yang bisa kita gunakan untuk men-PUSH dan men-POP stack. Seperti jika menggunakan perintah push dengan syntax PUSH A, yang akan menghasilkan error. Untuk me-PUSH akumulator maka kita harus menyebut Akumulator dengan nama alamat Directnya. Misalnya PUSH 0E0h, hal ini baru benar. Namun anda juga bisa mengguananan nama Direct yang lain untuk akumulator yaitu ACC, sehingga kita menggunakan perintah seperti PUSH ACC. PUSH ACC POP B ;menyalin isi ACC dan ditempatkan pada Stack ;Mengambil isi teratas dr Stack ke register B

Lho kenapa ? yah kira-kira seperti ini. Untuk Akumulator, kita mengenal 3 buah simbol yang digunakan dalam syntax instruksi bahasa assembly 8051. Yaitu 0E0h, A, dan ACC. 0E0h adalah alamat lokasi sejatinya dari Akumulator. 0E0h adalah didasarkan dari urutan yang telah ditentukan oleh pabrik. Saat kita hendak mengalamati lokasi ini dengan pengalamatan direct, kita harus menyebutkan 0E0h. Namun assembler memberikan kemudahan bagi kita dari kerepotan menghapal bilanganbilangan seperti 0E0h untuk akumulator ini. Kita dapat menyebutkannya dengan ACC saja. Assembler akan dengan otomatios mengubahnya menjadi 0E0h. Sedang simbol A, adalah adalah penggunaan alamat akumulator yang alamat tersebut sudah terdapat pada OpCode. Misalnya begini, jika kita menulis dengan kode berikut ini, .. MOV MOV A,#1 ACC,#1 ;Isi ACC dengan nilai 1 ;Isi ACC dengan nilai 1

Kalau dikompilasi hasilnya akan berbeda. Perintah MOV A,#1 akan menghasilkan kode mesin 2B01, yang dalam hal ini opcode 2B berarti dengan MOV A,#... Sedang perintah kedua, yakni MOV ACC,#1 akan menghasilkan kode mesin 3BE001, yang dalam hal ini opcode 3B adalah berarti MOV ..,#... Begitulah perbedaan simbol A dan simbol ACC. Namun lihat juga di bawah ini. INC INC INC A ACC 0E0h ; menghasilkan kode mesin 04h ; menghasilkan kode mesin 05h E0h ; menghasilkan kode mesin 05h E0h

Seperti yang dapat dilihat di atas ke-tiga syntax di atas adalah serupa tapi tak sama. Untuk INC A akan menghasilkan satu byte kode mesin.

Alamat A sudah termasuk pada instruksi-nya sendiri. Perintah semacam ini pada 8051 hanya bisa kita dapatkan untuk akumulator saja. Untuk INC ACC dan INC 0E0h menghasilkan kode mesin yang sama yaitu Akumulator kita gunakan sebagaimana register yang lain dalam range 00 s/d FFh, yang lokasi maupun namanya harus disebutkan dibelakang opcode. Perintah seperti ini menghasilkan dua byte kode mesin. 05H sebagai kode untuk meng-increment direct, sedangn byte selanjutnya adalah lokasi register yang hendak di-increment. Oleh karena itu saat kita hendak melakukan Push dan Pop pada Stack, kita harus menyebutkan operand dengan nama direct maupun alamat aslinya. Seperti PUSH PUSH POP PUSH PUSH POP POP POP PUSH PUSH POP POP ACC A B R0 0 DPTR DPL DPH 035 0E0h C PSW ;benar ;SALAH ;benar ;SALAH ;benar ;SALAH ;benar ;benar ;benar ;benar ;SALAH ;benar

Contoh 5-2

Tunjukkan kode untuk mem-push R5, R6 dan A ke dalam stcak dan kemudian mem-pop kembali ke dalam R2, R3, dan B, dimana kemudian register B = register A, R2 = R6, dan R3 = R5. Dengan menganggap kita menggunaan Bank 0.

Jawaban:

PUSH 05 PUSH 06 PUSH ACC POP B

;push R5 ke dalam stack ;push R6 ke dalam stack ;push A ke dalam stack ;pop stack pada B ; sekarang B = A

POP 02 POP 03

;pop stack pada R2 ; sekarang R2 = R6 ;pop stack pada R3 ; sekarang R3 = R5

Mode Pengalamatan register Indirect Dalam mode ini, register digunakan untuk menunjuk lokasi dari register yang lain. Kita dapat mengakses seluruh lokasi RAM yang lokasinya ditunjukkan oleh isi register. Register yang bisa digunakan sebagai penunjuk atau pointer ini hanya register R0 dan R1. Perhatikan contoh di bawah, terutama penggunaan symbol @. Bahwa simbol tersebut untuk tanda bahwa kita sedang mengakses lokasi yang ditunjukkan oleh register yang bersangkutan. MOV MOV MOV MOV A,R0 A,@R0 R1,B @R1,B ;pindahkan ;pindahkan ;pindahkan ;pindahkan isi isi isi isi register R0 pada A lokasi yg ditunjuuk R0 pada A B pada R1 B pd lokasi yg ditunjuuk R1

Lokasi yang bisa diakses dengan cara ini adalah berukuran byte. Yaitu lokasi alamat 00h s/d FFh. Jangkauan yang sama yang bisa di akses oleh mode pengalamatan direct. Tidak seperti pada mode direct, range dibagi menjadi dua, range pertama 0 s/d 7Fh untuk mengakses RAM internal, dan range ke dua 80h s/d FFh untuk mengakses SFR. Dalam mode InDirect, juga dibagi menjadi dua, range pertama 0 s/d 7Fh adalah lokasi pada RAM internal (yang bisa juga dialamati Direct), dan range ke dua 80h s/d FFh ditujukan untuk mengalamati lokasi RAM Internal lokasi 80h s/d FFh. Lokasi RAM Internal ini hanya dipunyai oleh MCS52 seperti AT89C52 dan tidak terdapat pada MCS51. Sehingga kita mendapatkan dua blok register yang sama yang memiliki lokasi 80h s/d FFh. Lokasi 80h s/d FFh pertama adalah milik SFR yang hanya bisa dialamati secara Direct. Dan lokasi 80h s/d FFh kedua yang merupakan lokasi 80h s/d FFh milik RAM Internal tambahan, yang hanya bisa diakses dengan cara InDirect. Ingat pada contoh syntax di atas, terlihat tanda akumulate (@) di depan R0 dan R1. Simbol ini dalam berbagai bahasa assembler digunakan untuk menjelaskan bahwa ini adalah lokasi yang ditunjukkan oleh operand dibelakang simbol tersebut. Dalam Assembler 8051 simbol ini adalah simbol pengalamatan InDirect, di mana operand yang digunakan (sebagai penunjuk alamat lain) untuk pengalamatan ini hanya R0 dan R1. Hal yang sering terjadi adalah kita lupa membubuhkan simbol ini. Tidak adanya

simbol ini assembler akan mengaanggap kita hendak mengakses register tersebut.

Contoh 5-3

Tulislah program untuk menyalin 55h ke dalam memory lokasi 40 s/d 15h menggunakan (a) mode pengalamatan langsung. (b) Menggunakan pengalamatan tidak langsung tanpa loop, dan (c) Menggunakan loop. Jawaban:

(a) MOV A,#55h MOV 40h,A MOV 41h,A MOV 42h,A MOV 43h,A MOV 44h,A MOV 45h,A (b) MOV A,#55h MOV R0,#40h MOV @R0,A INC R0 MOV @R0,A INC R0 MOV @R0,A INC R0 MOV @R0,A INC R0 MOV @R0,A INC R0 MOV @R0,A (c) MOV A,#55h MOV R0,#40h MOV R2,#5 LOOP: MOV @R0,A INC R0 DJNZ R2,LOOP

;A= 55h ;salin A pada ;salin A pada ;salin A pada ;salin A pada ;salin A pada ;salin A pada

RAM RAM RAM RAM RAM RAM

lokasi lokasi lokasi lokasi lokasi lokasi

40h 41h 42h 43h 44h 45h

;A= 55h ;isi dengan pointer ;salin A pada lokasi ditunjuk ;ke alamat selanjutnya 41h ;salin A pada lokasi ditunjuk ;ke alamat selanjutnya 42h ;salin A pada lokasi ditunjuk ;ke alamat selanjutnya 43h ;salin A pada lokasi ditunjuk ;ke alamat selanjutnya 44h ;salin A pada lokasi ditunjuk ;ke alamat selanjutnya 45h ;salin A pada lokasi ditunjuk

R0 R0 R0 R0 R0 R0

;A= 55h ;isi dengan pointer ;isi dengan counter ;salin A pada lokasi ditunjuk R0 ;ke alamat selanjutnya ;kurangi R2 lompat jika tidak 0

Kelebihan Mode Pengalamatan InDirect

Salah satu kelebihan dari pengalamatan register InDirect ini, kita dapat mengakses data secara dinamis jauh lebih baik dari mode Pengalamatan Direct. Pada contoh 5-3 program adalah untuk menulis nilai 55h pada lokasi 40 s/d 45 h. Perhatikan jawaban (b) terdapat dua instruksi yang sama ditulis beberapa kali. Kita dapat membuat loop untuk dua instruksi tersebut seperti pada jawaban (c). Hal ini membuat jawaban (c) menjadi jauh lebih efisien dan hanya dimungkinkan dengan menggunakan mode pengalamatan tidak langsung. Looping semacam ini tidak dapat digunakan dengan mode pengalamatan langsung. Nah inilah perbedaan penting dari dua mode ini.

Contoh 5-4

Tulis program untuk meng-clearkan 16 lokasi RAM dimulai dari alamat 60h.

Jawaban:

CLR A MOV R0,#60h MOV R2,#16 LOOP: MOV @R0,A INC R0 DJNZ R2,LOOP

;A= 0 ;isi dengan pointer ;isi dengan counter ;salin A pada lokasi ditunjuk R0 ;ke alamat selanjutnya ;kurangi R2 lompat jika tidak 0

Di bawah ini adalah contoh menggunakan R0 dan R1 untuk menyalin blok RAM.

Contoh 5-5

Tulis program untuk mengnyalin blok dari 10 bytes data dari RAM dimulai dari 35h ke RAM yang sama dengan lokasi dimulai dari 60h.

Jawaban:

MOV R0,#35h MOV R1,#60h MOV R2,#10 LOOP: MOV A,@R0 MOV @R0,A INC R0

;isi dengan pointer sumber ;isi dengan pointer target ;isi dengan counter ;salin lokasi ditunjuk R0 pada A ;salin A pada lokasi ditunjuk R1 ;ke alamat selanjutnya

INC R1 DJNZ R2,LOOP

;ke alamat selanjutnya ;kurangi R2 lompat jika tidak 0

Mode Pengalamatan Ter-Index dan mengakses On-Chip ROM Mode pengalamtan ter-index digunakan secara luar untuk mengakses element data (of look-up table entries) dalam lokasi ROM program dalam 8051. Intruksi yang digunakan untuk hal itu adalah MOVC A,@A+DPTR. Register 16-bit pada DPTR dan register A digunakan sebagai pembentuk alamat dari element data yang tersimpoan dalam ROM program. Karena data yang hendak diakses adalah data kode yang tersimpan dalam ROM Program, maka simbol MOVC digunakan untuk membedakan dengan MOV. C yang berarti adalah Code. Instruksi ini adalah jumlah dari isi register A dan isi DPTR kemudian menjadi penunjuk (pointer) 16-bit yang dapat mengakses seluruh jangkauan data 16-bit dalam CPU. Lihat contoh 5-6.

Contoh 5-6

Di dalam program ini, angaplah bahwa string USA telah ditulis (burned) dalam ROM program dimulai dari lokasi 200h. Sedangkan program-utama-nya ditulis (burned) mulai dari alamat 0, masih dalam ROM yang sama. Periksalah bagaimana program bekerja dan status dari karekater USA tersebut, setelah program tersebut dijalankan.

Jawaban:

ORG 0000h ;kode selanjutnya dimulai dari 0000h MOV DPTR,#200h ;isi dengan pointer CLR A MOVC A,@A+DPTR ;ambil karakter pertama MOV R0,A ;simpan karakter itu pada R0 INC DPTR ;ke karakter berikutnya CLR A MOVC A,@A+DPTR ;ambil karakter pertama MOV R1,A ;simpan karakter itu pada R1 INC DPTR ;ke karakter berikutnya CLR A MOVC A,@A+DPTR ;ambil karakter pertama MOV R2,A ;simpan karakter itu pada R2 ;kode-kode dibawah ini di-burn mulai dari alamat 200h ORG 200h

MYDATA: DB USA END

Contoh 5-7

Anggaplah ruang ROM dimulai dari 250h yang berisi dengan string GusIpul. Tulis progam untuk mentransfer karakter tersebut ke dalam RAM dimulai dari lokasi 40h

Jawaban :

;(a) Metode menggunakan Counter ORG 0000 MOV DPTR,#MYDATA ;Load Pointer utuk ROM MOV R0,#40h ;Load Pointer untuk RAM MOV R2,#7 ;Load Counter ULANG: CLR A ;A=0 MOVC A,@A+DPTR ;Ambli data dari ROM program MOV @R0,A ;Simpan data ke dlm RAM INC DPTR ;ke alamat selanjutnya dalam ROM INC R0 ;ke alamat selanjutnya dalam RAM DJNZ R2,ULANG ;kurangi 2, lompat jk tdk 0 TUNGGU: SJMP TUNGGU ;-KODE dimulai lagi dari alamat 250h ORG 250h MYDATA: DB GusIpul END ;(b) Metode menggunakan String dengan diakhiri 0 atau ; disebut Null Terminated Char ORG 0000 MOV DPTR,#MYDATA ;Load Pointer utuk ROM MOV R0,#40h ;Load Pointer untuk RAM ULANG: CLR A ;A=0 MOVC A,@A+DPTR ;Ambli data dari ROM program JZ TUNGGU MOV @R0,A ;Simpan data ke dlm RAM INC DPTR ;ke alamat selanjutnya dalam ROM INC R0 ;ke alamat selanjutnya dalam RAM SJMP ULANG ;krangi 2, lompat jk tdk 0 TUNGGU: SJMP TUNGGU ;-KODE dimulai lagi dari alamat 250h ORG 250h MYDATA: DB GusIpul,0 ;diakhiri dengan Null END

Tabel Look-Up dan menggunaan mode pengalamatan ter-index Tabel Look-Up adalah seperti yang sudah umum digunakan dalam konsep pemrograman mikroprosesor. Hal tersebut membuat kita mudah untuk mengakses elemen-elemen dari tabel yang sering digunakan dengan operasi yang cepat. Seperti contoh, anggaplah sebuah aplikasi membutuhkan nilai pangkat-2 dalam range 0 s/d 9. Kita dapat menggunakan tabel look-up tanpa harus membuat program lagi yang khusus untuk menghitung/mencari hasil dari pangkat tersebut. Seperti yang dicontohkan pada Contoh 5-8.

Contoh 5-8

Tulis program untuk mendapatkan nilai dari P1 (sebut saya hasilnya adalah X ) dan kirim (X pangkat 2) pada P2 secara terus menerus.

Jawaban :

ORG 0 ;kode selanjutnya dimulai dari 0000h MOV DPTR,#300h ;isi dengan pointer MOV A,#0FFh ;A= FFh MOVC P1,A,P1 ;Jadikan P1 sebagai input LOOP: MOV A,P1 ;Baca P1, kirim hasilnya pada A MOVC A,@A+DPTR ;ambil karakter pertama MOV P2,A ;simpan karakter itu pada R1 SJMP LOOP ;ulang terus ORG 300h XSQR_TABLE: DB 0,1,4,9,16,25,36,49,64,81 END

Contoh 5-9

Jawablah dari masing-masing pertanyaan 5-8. (a) periksalah isi dari ROM lokasi 300 309h (b) Pada lokasi berapakah lokasi untuk 6 pangkat 2. Dan berapa nilanya untuk mereka. (c) Anggaplah P1 memiliki nilai 9, lalu berapa nilai yang seharunya pada P2. Jawaban :

(a) semua nilai dalam hex 300 = (00) 301 = (04) 302 = (09) 304 = (10) 305 = (19) 306 = (24) 307 = (31) 308 = (40) 309 = (51) 4 x 4 = 16 = 10 hex 5 x 5 = 25 = 19 hex 6 x 6 = 36 = 24 hex

(b) 306h adalah 24h

(c) 01010001b sama dengan 51h dan 81 dalam desimal (9e2 = 81)

Selain itu penggunaan DPTR untuk mengakses ROM program, dapat pula digunakan untuk mengakses memory RAM eksternal yang terhubung pada 8051. Hal tersebut akan didiskusikan pada bab 14. Register lain yang menggunakan mode pengalamatan ter-index adalah dengan menggunakna Progra mCounter yang akan dibahasa dalam Lampiran A. Dalam beberap a contoh di atas, instruksi MOV diogunakan hanya untuk memperjelas aliran program agar anda lebih cepat mengerti. Dan dalam beberapa bagian instruksi-instruksi tersebut dapat disingkat dengan hasil yang sama. Beberapa di antaranya akan dibahas pada Bab selanjutnya.

RINGKASAN Pada BAB ini menjelaskan tentang 5 model pengalamatan dalam 8051. mode pengalamatan segera (immediate) digunakan sebagai konstanta bagi operand source. Mode pengalamatan register digunakan dengan melibatkan register untuk menampung data yang hendak dimanipulasi. Mode pengalamatan langsung dan mode pengalamatan register tidak langsung, dapat digunakan untuk mengakses data yang dalam RAM maupun data yang tersimpan dalam register lainnya dalam 8051. Mode pengalamatan langsung dapat digunakan untuk manipulasi stack. Sedang mode pengalamatan register tidak langsung digunakan untuk menunjuk lokasi lain. Kelebihan dari mode terakhir itu adalah membuat npengalamatan menjadi lebih dinamis dibanding mode pengalamatan lainnya. Mode pengalamatan terindex digunakan secara umum untuk mengakses element data dari table look-up yang tersimpan dalam ruang ROM dalam 8051. Kelompok register lain yang disebut sebagai SFR (special fuction register) hanya dapat diakses dengan mode pengalamatan langsung dengan menyebut namanya atau dengan menyebut lokasinya.

Anda mungkin juga menyukai