Mengakses Memori Program AVR Dengan Instruksi LPM (Load Program Memory)


avrmnemonic1Memori program adalah memori dimana program mikrokontroler disimpan. Tidak hanya program, tapi juga konstanta-konstanta program.

Untuk mengakses memori program AVR digunakan instruksi LPM (Load Program Memory). Instruksi LPM berfungsi membaca satu byte data pada memori program dengan alamat yang ditunjuk oleh Register Z dan meng-copy-nya ke suatu register (R0-R31). Perlu diketahui bahwa tidak semua tipe mikrokontroler AVR mendukung instruksi LPM, salah satu contohnya adalah AT90S1200.

Memori program AVR diatur dalam satuan word (16-bit), sementara Register Z menunjuk alamat memori program dalam satuan byte. 1 word kan tersusun dari 2 byte yakni high-byte (8-bit MSB) dan low-byte (8-bit LSB).

Jadi, manakah yang dibaca oleh instruksi LPM? Byte atas atau byte bawah? Untuk menentukan hal itu, digunakan bit terendah (Least Significant Bit) dari Register Z (ZLSB). Jika ZLSB=0, maka instruksi LPM akan membaca byte bawah pada alamat memori program yang ditunjuk oleh Register Z. Sebaliknya, jika ZLSB=1, maka instruksi LPM akan membaca byte atas.

Instruksi LPM memiliki beberapa varian yakni:

  1. LPM R0 <- (Z)
  2. LPM Rd, Z Rd <- (Z)
  3. LPM Rd, Z+ Rd <- (Z); Z = Z + 1

LPM varian pertama (tanpa operand) membaca data pada memori program dengan alamat yang ditunjukkan oleh Register Z dan meng-copy-nya ke register R0.

Varian kedua membaca data pada memori program dengan alamat yang ditunjukkan oleh Register Z dan meng-copy-nya ke register Rd (R0-R31).

Varian ketiga bekerja seperti varian kedua, hanya saja setelah data di-copy ke register Rd, nilai Register Z akan bertambah satu sehingga pointer Z akan menunjuk ke data pada alamat berikutnya.

Untuk lebih mempertajam pemahaman, maka berikut adalah contoh penerapan instruksi LPM pada program Running LED yang disimulasikan menggunakan VMLAB.

Jika pada tulisan sebelumnya (VMLAB – Running LED) digunakan instruksi ROL (Rotate Left) untuk memutar komposisi bit, maka dalam program ini akan digunakan instruksi LPM. Anda bisa menggunakan proyek pada tulisan VMLAB – Running LED dan memodifikasi file program assemblernya saja. Berikut adalah file program assemblernya.

; ********************************************
; LPM.ASM
; Contoh aplikasi LPM pada program Running LED
; ********************************************

.include “C:\MICROC~1\VMLAB\include\m8def.inc”

.def  temp  =r16

reset:
rjmp start
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti

; Program starts here after Reset
start:
ldi    temp, low (ramend)
out    spl, temp
ldi    temp, high (ramend)
out    sph, temp

ser    r16
out    ddrb, temp

point_to:
ldi    zl, low (tabel<<1)
ldi    zh, high (tabel<<1)

forever:
lpm   temp, z+
com    temp
out    portb, temp

cpi    temp, $7f
breq    point_to

rcall    delay

rjmp    forever

delay:
ldi temp, 3

satu:
dec temp
brne satu
ret

tabel:
.db 1, 2, 4, 8, 16, 32, 64, 128

Selanjutnya, Anda bisa menjalankan simulatornya. Hasilnya akan sama dengan VMLAB – Running LED yang menggunakan ROL.

Perhatikan bagian program yang dicetak tebal. Instruksi ldi zl, low (tabel<<1) berfungsi untuk mengambil data alamat byte bawah dari label tabel dalam memori program dan disimpan di byte bawah Register Z (ZL). Instruksi berikutnya, ldi zh, high (tabel<<1), berfungsi mengambil data alamat byte atas dari label tabel dan disimpan di byte atas Register Z (ZH). Operator bit shift-left (geser ke kiri), berfungsi untuk mengisi ZLSB=0 yang berarti instruksi LPM akan mengambil byte bawah dari alamat yang ditunjuk oleh Register Z.

Selanjutnya instruksi lpm temp, z+ akan mengambil data (1 byte) dari memori program dengan alamat yang ditunjuk oleh Register Z, dan kemudian menaikkan Register Z satu (Z=Z+1) sehingga secara otomatis Register Z akan menunjuk ke lokasi byte berikutnya dari tabel data.

Instruksi com temp berfungsi membalik semua bit pada register R16 (yang sudah diberi nama temp). Ingat, rangkaian LED yang digunakan adalah rangkaian common-anode, yang berarti LED aktif low.

Setelah itu instruksi out portb, temp akan meng-update tampilan LED. Instruksi cpi temp, $7f dan breq point_to berfungsi untuk mengecek apakah pembacaan data sudah sampai pada data kedelapan, kalau sudah pembacaan harus diulangi lagi dari data pertama.

Ok, selamat mencoba dan selamat belajar!

2 comments

  1. SAUT BOANGMANALU · Januari 15, 2010

    terimakasih tulisannya, kunjungi juga semua tentang Pakpak di http://boeangsaoet.wordpress.com

  2. masykur · April 1, 2010

    terima kasih mas,,
    walau bukan anak elektro, saya jadi agak ngerti
    walau kul di ilkom

    thanks infonya

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s