MODE PENGALAMATAN PADA 8051

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 A,#25h        ;isi 25h pada A

MOV R4,#62        ;isi bilangan desimal 62 pada R4

MOV B,#40h        ;isi B dengan 40h

MOV DPTR,#4521h   ;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)

 

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

 

COUNT  EQU 30

 

            …

            MOV R4,#COUNT     ;isi R4 dengan 30 desimal

            MOV DPTR,#MYDATA  ;DPTR = 200h

            …

 

            ORG 200h

MYDATA:     DB ‘GusDur’

 

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 A,R0    ;salin isi R0 pada A

            MOV R2,A    ;salin isi A pada R2

            MOV A,R5    ;salin isi R5 pada A

            MOV A,R7    ;salin isi R7 pada A

            MOV R5,B    ;salin isi 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 simbol pagar “#” yang berarti untuk  pegalamatan immediate.

 

      MOV R0,40h        ;simpan isi 40h pada R0 (immediate)

      MOV 56h,A         ;simpan isi A pada lokasi 56h (langsung)

      MOV R4,7Fh        ;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     sama dengan       MOV A,R4

 

      MOV 7,A     sama dengan       MOV R7,A

 

Yang paling perlu anda perhatikan adalah bahwa di sana tidak ditampilkannya simbol “#”. Ingat simbol ini adalah simbol bahwa bilangan dibelakangnya adalah merupakan data immmediate, dan bukan alamat direct.

 

      MOV R2,#5         ;isi R2 dengan nilai 5 (immediate)

      MOV R2,5          ;salin isi RAM lokasi 5 pada R2 (langsung)

      MOV A,#35h        ;isi A dengan nilai 35h (immediate)

      MOV A,35h         ;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 register–register 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 register-register yang termasuk dalam golongan SFR ini.

 

      MOV A,#55h        ;isi A dengan 55h

      MOV 0E0h,#55h     ;sama artinya dgn di atas

 

      MOV B,#25h        ;isi A dengan 25h

      MOV 0F0h,#25h     ;sama artinya dgn di atas

 

      MOV A,R2          ;Salin R2 pada A

      MOV 0E0h,R2       ;sama artinya dgn di atas

 

      MOV B,R0          ;Salin R0 pada B

      MOV 0F0h,R0       ;sama artinya dgn di atas

 

 

Tabel 5-1 adalah daftar dari Special Function Register 8051 dan alamat-alamatnya. 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

Nama

Alamat

ACC *

Accumulator

0E0h

B *

Register B

0F0h

PSW *

Program Status Word

0D0h

SP

Stack Pointer

81h

DPTR

Data Pointer 2-bytes

 

  DPL

Low byte

82h

  DPH

High byte

83h

P0 *

Port 0

80h

P1 *

Port 1

90h

P2 *

Port 2

0A0h

P3 *

Port 3

0B0h

IP *

Kontrol Prioritas Interupsi

0B8h

IE *

Kontrol Enable Interupsi

0A8h

TMOD

Kontrol  Mode Timer/.Counter

89h

TCON

Kontrol Timer/Counter

88h

T2CON

Kontrol Timer/Counter 2

0C8h

T2MOD

Kontrol  Mode Timer/.Counter  2

0C9h

TH0

Timer/Counter 0 high byte

8Ch

TL0

Timer/Counter 0 Low byte

8Ah

TH1

Timer/Counter 1 high byte

8Dh

TL1

Timer/Counter 1 Low byte

8Bh

TH2

Timer/Counter 2 high byte

0CDh

TL2

Timer/Counter 2 Low byte

0CCh

RCAP2H

T/C 2 Capture high byte

0CBh

RCAP2L

T/C 2 Capture low byte

0Cah

SCON *

Serial Control

98h

SBUF

Serial data buffer

99h

PCON

Power Control

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               ;A= 55h

      MOV P1,A                 ;P1=55h

      MOV P2,A                 ;P2=55h

 

(a)   Dari Table 5-1, alamat P1 = 80h; alamat P2 = A0h

      MOV A,#55h               ;A= 55h

      MOV 80h,A                ;P1=55h

      MOV 0A0h,A               ;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    ;menyalin isi ACC dan ditempatkan pada Stack

      POP  B      ;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 bilangan-bilangan 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  A,#1         ;Isi ACC dengan nilai 1

      MOV  ACC,#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  A      ; menghasilkan kode mesin 04h

      INC  ACC    ; menghasilkan kode mesin 05h E0h

      INC  0E0h   ; 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 ACC                ;benar

      PUSH A      ;SALAH

      POP  B                  ;benar

      PUSH R0     ;SALAH

      PUSH 0                  ;benar

      POP  DPTR   ;SALAH

      POP  DPL                ;benar

      POP  DPH                ;benar

      PUSH 035                ;benar

      PUSH 0E0h               ;benar

      POP  C      ;SALAH

      POP  PSW                ;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 R5 ke dalam stack

      PUSH 06                  ;push R6 ke dalam stack

      PUSH ACC                 ;push A ke dalam stack

 

      POP  B                   ;pop stack pada B

                               ; sekarang B = A

      POP  02                  ;pop stack pada R2

                               ; sekarang R2 = R6

      POP  03                  ;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 A,R0    ;pindahkan isi register R0 pada A

      MOV A,@R0   ;pindahkan isi lokasi yg ditunjuuk R0 pada A

      MOV R1,B    ;pindahkan isi B pada R1

      MOV @R1,B   ;pindahkan isi 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 MCS’52 seperti AT89C52 dan tidak terdapat pada MCS’51. 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               ;A= 55h

      MOV 40h,A                ;salin A pada RAM lokasi 40h

      MOV 41h,A                ;salin A pada RAM lokasi 41h

      MOV 42h,A                ;salin A pada RAM lokasi 42h

      MOV 43h,A                ;salin A pada RAM lokasi 43h

      MOV 44h,A                ;salin A pada RAM lokasi 44h

      MOV 45h,A                ;salin A pada RAM lokasi 45h

 

(b)   MOV A,#55h               ;A= 55h

      MOV R0,#40h              ;isi dengan pointer

      MOV @R0,A                ;salin A pada lokasi ditunjuk R0

      INC R0                   ;ke alamat selanjutnya 41h

      MOV @R0,A                ;salin A pada lokasi ditunjuk R0

      INC R0                   ;ke alamat selanjutnya 42h

      MOV @R0,A                ;salin A pada lokasi ditunjuk R0

      INC R0                   ;ke alamat selanjutnya 43h

      MOV @R0,A                ;salin A pada lokasi ditunjuk R0

      INC R0                   ;ke alamat selanjutnya 44h

      MOV @R0,A                ;salin A pada lokasi ditunjuk R0

      INC R0                   ;ke alamat selanjutnya 45h

      MOV @R0,A                ;salin A pada lokasi ditunjuk R0

 

(c)     MOV  A,#55h              ;A= 55h

        MOV  R0,#40h             ;isi dengan pointer

        MOV  R2,#5               ;isi dengan counter

LOOP:   MOV  @R0,A               ;salin A pada lokasi ditunjuk R0

        INC  R0                  ;ke alamat selanjutnya

        DJNZ R2,LOOP             ;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                   ;A= 0

        MOV  R0,#60h             ;isi dengan pointer

        MOV  R2,#16              ;isi dengan counter

LOOP:   MOV  @R0,A               ;salin A pada lokasi ditunjuk R0

        INC  R0                  ;ke alamat selanjutnya

        DJNZ R2,LOOP             ;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             ;isi dengan pointer sumber

        MOV  R1,#60h             ;isi dengan pointer target

        MOV  R2,#10              ;isi dengan counter

LOOP:   MOV  A,@R0               ;salin lokasi ditunjuk R0 pada A

        MOV  @R0,A               ;salin A pada lokasi ditunjuk R1

        INC  R0                  ;ke alamat selanjutnya

        INC  R1                  ;ke alamat selanjutnya

        DJNZ R2,LOOP             ;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)    4 x 4 = 16 = 10 hex

         305 = (19)    5 x 5 = 25 = 19 hex

         306 = (24)    6 x 6 = 36 = 24 hex

         307 = (31)

         308 = (40)

         309 = (51)

 

(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 ter-index 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.

 



—————————————-

|o-o| Diterjemahkan oleh Dhanny Dhuzell

—————————————-

One Response

Leave a Reply