Materi 5: Architecture and Assembly Language Programming
I Nyoman Kusuma Wardana
General Purpose Registers (GPRs)
The AVR Data Memory
Using Instructions with the Data Memory
Mikrokontroler AVR merupakan
Register-based Microcontroller
Sistem kerja uC diatur berdasarkan kondisi
register
Programmer menuliskan isi register utk
menjalankan mikrokontroler
Pemahaman
terhadap register
MUTLAK
CPU
menggunakan register utk
menyimpan
data sementara
AVR memiliki banyak register utk operasi
aritmatika dan logika
Informasi pd register bisa berupa
data
byte
ataupun
address
Umumnya, ukuran register AVR
8-bit
,
dgn urutan sbb:
AVR memiliki 32 General
Purpose Register (GPR), yaitu R0-R31
GPR bisa digunakan utk
instruksi aritmatika ataupun
logika
Utk memahami GPR, kita ambil contoh instruksi : LDI dan ADD
LDI LoaD Immediate
Immediate Nilai “harus” disediakan disaat itu! Berfungsi menyalin 8-bit data ke GPR
Masukkan Rd (tujuan) seketika dgn nilai K Nilai d antara 16 dan 31
Nilai K antara 0 – 255 (desimal) atau 00-FF (hex) 7
Contoh:
LDI R20, 0x25 ;load R20 dgn 0x25
LDI R31, 0x87 ;load R31 dgn 0x87
LDI R25, 0x79 ;load R25 dgn 0x79
Arti sintaks tsb:
muati Register R20 dgn nilai 0x25 (heksadesimal) muati Register R31 dgn nilai 0x87 (heksadesimal) muati Register R25 dgn nilai 0x79 (heksadesimal)
Amati bahwa LDI destination, source
Tujuan akan ditulis lebih dahulu
Komentar dlm assembly setelah ;
Ingat, dlm GPR (R0-R31) kita tidak bisa
memakai perintah LDI utk R0-R15
Contoh:
LDI R5, 0x99 ; tidak valid
Utk mewakili heksadesimal gunakan $ dan
0x di depan bilangan
Jika tdk maka bilangan diartikan desimal
LDI R16,50 ;R16 di-load dgn 50 (desimal)
LDI R16,0x50 ;R16 di-load dgn 50 (hex)
Jika nilai 0 sampai F dimasukkan ke 8-bit
register, maka sisanya diasumsikan nol
Jika memindahkan bilangan lebih besar dr
255 (FF dlm hex) dlm GPR akan error
LDI R17,0xF72 ;ILLEGAL $7F2 > 8bit($FF)
ADD menambah 2 register
Tambahkan isi Rd dan Rr kemudian simpan
hasilnya di Rd
Contoh:
ADD R1,R2 ;tambahkan isi R1 dan R2
;R1 = R1 + R2
ADD R28,R28;tambahkan isi R28 dgn isi R28
;R28 = R28 + R28
Arti sintaks tsb:
Tambahkan isi Register R1 dgn isi Register R2
kemudian simpan hasilnya di R1
Tambahkan isi Register R28 dgn isi Register R28
kemudian simpan hasilnya di R28
Contoh: Hitung: 19 + 95 Pembahasan: Hasil program tsb: R16 = 19 + 95 = 114 LDI R16, 19 ;R16 = 19 LDI R20, 95 ;R20 = 95 ADD R16, R20 ;R16 = R16 + R20
Contoh: Hitung: 0x25 + 0x34 Pembahasan: Hasil program tsb: R16 = 0x59 (0x25 + 0x34) Kusuma Wardana, M.Sc. 15 LDI R16, 0x25 ;R16 = 0x25 LDI R17, 0x34 ;R17 = 0x34 ADD R16, R17 ;R16 = R16 + R17
Contoh: Hitung: 19 + 95 + 5 LDI R16, 19 ;R16 = 19 LDI R20, 95 ;R20 = 95 LDI R21, 5 ;R21 = 5 ADD R16, R20 ;R16 = R16 + R20 ADD R16, R21 ;R16 = R16 + R21
Contoh: Hitung: 19 + 95 + 5 Atau… Kusuma Wardana, M.Sc. 17 LDI R16, 19 ;R16 = 19 LDI R20, 95 ;R20 = 95 ADD R16, R20 ;R16 = R16 + R20 LDI R20, 5 ;R20 = 5 ADD R16, R20 ;R16 = R16 + R20
Trdpt 2 jenis ruang memori (memory space), yaitu:
1. Code memory space
Program yg kita ketik tersimpan disini
2. Data memory space
Data-data tersimpan disini
Mari kita bahas dulu data memory!
Data Memory
General Purpose I/O Register General Purpose RAMData memory terdiri dari 3, sbb:
1. General Purpose
Register (GPR)
2. I/O memory
3. Internal data SRAM
Kusuma Wardana, M.Sc. 21 $0000 $0001 $0020 General purpose RAM (SRAM) R0 R1 R2 $001F $005F R31 .. . TWBR TWSR SPH SREG .. . General Purpose Registers Standard I/O Registers $00 $01 $3E $3F $0060 .. . .. . Data Address Space I/O Address .. . 8 bit $FFFF
1. General Purpose Register
Sperti yg telah dibahas sebelumnya, GPR
memakai 32 byte dr ruang memori data
GPR selalu menempati alamat $00 - $1F, apapun jenis mikrokontrolernya
2. I/O Data Memory (SFRs)
I/O memory didedikasikan utk fungsi2
spesifik sprt: 1. Timer 2. Komunikasi serial 3. I/O port 4. ADC 5. dan lain-lain Kusuma Wardana, M.Sc. 23
I/O memory adlh register 8-bit
Jumlah lokasi tergantung dr jumlah pin dan
peripheral yg dimiliki oleh µC tsb.
Semua keluarga AVR paling tidak memiliki 64
byte lokasi I/O memory
Utk keluarga AVR yg memiliki lebih dr 32 I/O
pin (misal ATmega64, ATmega128, &
ATmega256) terdpt extended I/O memory
utk mengontrol ekstra port dan ekstra peripheral
I/O register dsbt juga SFR (Special Function Register) Perbedaan SFR dan GPR: SFR : memiliki fungsi khusus GPR: tidak memiliki
fungsi khusus (utk
menyimpan data scr umum) Kusuma Wardana, M.Sc. 25 $0000 $0001 $0020 General purpose RAM (SRAM) R0 R1 R2 $001F $005F R31 .. . TWBR TWSR SPH SREG .. . General Purpose Registers Standard I/O Registers $00 $01 $3E $3F $0060 .. . .. . Data Address Space I/O Address .. . 8 bit $FFFF
3. Internal Data SRAM
Internal data SRAM
menyimpan data dan parameter oleh AVR
programmers dan C compilers
Ukuran SRAM
bervariasi trgantung
jenis µC
Setiap lokasi pd SRAM dpt diakses scr langsung berdasarkan alamatnya 27 $0000 $0001 $0020 General purpose RAM (SRAM) R0 R1 R2 $001F $005F R31 .. . TWBR TWSR SPH SREG .. . General Purpose Registers Standard I/O Registers $00 $01 $3E $3F $0060 .. . .. . Data Address Space I/O Address .. . 8 bit $FFFF
SRAM vs Data EEPROM
EEPROM utk menyimpan data yg jarang
diubah dan tdk hilang ketika power dimatikan
SRAM menyimpan data dan parameter
yg sering diubah & data hilang ketika power dimatikan
3 data memori: GPR, SFR dan internal SRAM
Dlm datasheet, ukuran memori dinyatakan: EEPROM size dr EEPROM
SRAM size dr internal SRAM
Ukuran data memori = ukuran GPR + SFR(I/O register) + SRAM
$0000 $0001 $0020 General purpose RAM (SRAM) R0 R1 R2 $001F $005F R31 .. . TWBR TWSR SPH SREG .. . General Purpose Registers Standard I/O Registers $00 $01 $3E $3F $0060 .. . .. . Data Address Space I/O Address .. . 8 bit
Kita sudah belajar 2 perintah dasar utk kerja
GPR: LDI dan ADD
AVR mengijinkan utk akses langsung (direct
access) utk lokasi tertentu pada data memory
Sesi pd slide ini akan memperlihatkan
instruksi2 utk mengakses berbagai lokasi dlm
data memory
LDS LoaD direct from data Space LDS Katakan ke CPU untuk me-load
(copy) 1 byte dr alamat data memoy ke GPR
Contoh:
Pembahasan:
Salin isi dari lokasi 1 pd data memory ke
GPR
Lokasi 1 pd data memory memiliki isi
tertentu.
Isi inilah yg kita salin, namun dengan
Lihat Gambar Lokasi 1 berada di GPR dan merupakan alamat dr R1 Maka instruksi: Berarti salin R1 ke R20 Kusuma Wardana, M.Sc. 35 $0000 $0001 $0020 General purpose RAM (SRAM) R0 R1 R2 $001F $005F R31 .. . TWBR TWSR SPH SREG .. . General Purpose Registers Standard I/O Registers $00 $01 $3E $3F $0060 .. . .. . Data Address Space I/O Address .. . 8 bit $FFFF LDS R20, 0x0001
Contoh:
Pembahasan:
Salin isi dari lokasi 0x0200 pd data memory ke R5
Lihat Gambar
Lokasi 0x0200 terletak
pd internal SRAM
Maka instruksi:
Berarti, salin isi
internal SRAM yg berlokasi 0x0200 ke R5 Kusuma Wardana, M.Sc. 37 $0000 $0001 $0020 General purpose RAM (SRAM) R0 R1 R2 $001F $005F R31 .. . TWBR TWSR SPH SREG .. . General Purpose Registers Standard I/O Registers $00 $01 $3E $3F $0060 .. . .. . Data Address Space I/O Address .. . 8 bit $FFFF LDS R5, 0x0200
Contoh:
Tambahkan isi lokasi 0x300 dengan isi pd
lokasi 0x302. Manfaatkan R0 dan R1.
Selanjutnya, tentukan dimana letak 0x300?
LDS R0, 0x0300 ;R0=isi pd lokasi 0x300 LDS R1, 0x0302 ;R1=isi pd lokasi 0x302
Amati gambar:
Kusuma Wardana, M.Sc. 39
LDS R0, 0x0300 LDS R1, 0x0302 ADD R0, R1
R0 R1 Lokasi $300 Lokasi $302 Sebelum LDS R0,0x300 ? ? α β Setelah LDS R0,0x300 α ? α β LDS R0, 0x0300 LDS R1, 0x0302 ADD R0, R1
Contoh:
Apa maksud program berikut:
LDS R20, 2 Jawab:
Menyalin isi dari R2 ke R20
Mengapa? karena 2 adalah alamat dari R2
STS STore direct to data Space
STS Katakan ke CPU untuk menyimpan (mengkopi) isi dr GPR ke alamat lokasi pd data memory
Lokasi dapat berupa salah satu lokasi pada data memory: bisa salah satu I/O register, suatu lokasi di SRAM, atau GPR
Contoh:
Pembahasan:
Menyalin isi dari R10 dan tempatkan pd register berlokasi 1
Karena lokasi 1 adlh R1, maka salin R10 ke R1
Kusuma Wardana, M.Sc. 43 STS 0x1, R10
Contoh:
Pembahasan:
Salin isi dari register R25 ke lokasi 0x230 pd data memory
Lokasi 0x230 adlh internal SRAM
Contoh:
Tulislah program utk menyimpan nilai 55 ke
lokasi 0x80 pada SRAM
Jawab:
LDI R20, 55 ;R20 = 55
STS 0x80, R20 ;[0x80] = R20 = 55
Contoh:
Tulislah program utk menyimpan nilai 0x99 ke
lokasi 0x200 sampai lokasi 0x203 pada ruang
SRAM Jawab: LDI R20, 0x99 ; R20 = 0x99 STS 0x200, R20 ; simpan pd R20 lokasi 0x200 STS 0x201, R20 ; simpan pd R20 lokasi 0x201 STS 0x202, R20 ; simpan pd R20 lokasi 0x202
Address Data $200 0x99 $201 0x99 $202 0x99 $203 0x99 Kusuma Wardana, M.Sc. 47 LDI R20, 0x99 ; R20 = 0x99 STS 0x200, R20 ; simpan pd R20 lokasi 0x200 STS 0x201, R20 ; simpan pd R20 lokasi 0x201 STS 0x202, R20 ; simpan pd R20 lokasi 0x202 STS 0x203, R20 ; simpan pd R20 lokasi 0x203
Tabel Lokasi Beserta Data yg Tersimpan
Ingat!!! Kita tidak dapat menyalin (menyimpan) nilai secara LANGSUNG ke lokasi pd SRAM. Hal ini harus dilakukan melalui perantara GPR
Contoh:
Buatlah tabel utk menyatakan keadaan nilai RAM yg
berlokasi dr $212 sampai $216 berdasar program
berikut: LDI R16, 0x99 STS 0x212, R16 LDI R16, 0x85 STS 0x213, R16 LDI R16, 0x3F STS 0x214, R16 LDI R16, 0x63 STS 0x215, R16 Address Data $212 0x99 $213 0x85 $214 0x3F $215 0x63 $216 0x12
Jawab:
Carilah isi dr R20, R21 dan data memory pd
lokasi 0x120 setelah program berikut:
LDI R20, 5
LDI R21, 2
ADD R20, R21
ADD R20, R21
STS 0x120, R20
Kusuma Wardana, M.Sc. 49Lokasi Data R20 5 R21 0x120 Lokasi Data R20 5 R21 2 0x120 Lokasi Data R20 7 R21 2 Lokasi Data R20 9 R21 2 Lokasi Data R20 9 R21 2 Setelah LDI R20, 5 Setelah LDI R21, 2 LDI R20, 5 LDI R21, 2 ADD R20, R21 ADD R20, R21 STS 0x120, R20
Contoh:
Jumlahkan isi memori yg berlokasi di 0x90 dgn
isi memori yg berlokasi lokasi di 0x95 dan
simpan hasilnya di lokasi 0x313
Jawab: LDS R20, 0x90 ; R20 = [0x90] LDS R21, 0x95 ; R21 = [0x95] ADD R20, R21 ; R20 = R20 + R21 STS 0x313, R20 ; [0x313] = R20 Kusuma Wardana, M.Sc. 51
Contoh:
Isi register R16 dengan angka 0x55. Kemudian
pindahkan angka tersebut ke PORTB, PORTC
dan PORTD!
Jawab:
Pertama-tama, ketahui dulu dimana
alamat data memory utk PORTB, PORTC
Alamat PORTB = 0x38, PORTC = 0x35 dan PORTD=0x32 Kusuma Wardana, M.Sc. 53 Name Address I/O Mem. $00 $20 TWBR $01 $21 TWSR $04 $24 ADCL $05 $25 ADCH $02 $22 TWAR $03 $23 TWDR $06 $26 ADCSRA $07 $27 ADMUX $08 $28 ACSR $09 $29 UBRRL $0A $2A UCSRB $0B $2B UCSRA $0C $2C UDR $0D $2D SPCR $0E $2E SPSR $0F $2F PIND $10 $30 DDRD $11 $31 PORTD $12 $32 PINC $13 $33 DDRC $14 $34 PORTC $15 $35 PINB $16 $36 DDRB $17 $37 PORTB $18 $38 PINA $19 $39 DDRA $1A $3A PORTA $1B $3B EECR $1C $3C EEDR $1D $3D EEARL $1E $3E EEARH $1F $3F SPDR Name Address
I/O Mem. Name
Address I/O Mem. UBRRC $20 $40 UBRRH $21 $41 WDTCR $22 $42 ASSR $23 $43 OCR2 $24 $44 TCNT2 $25 $45 TCCR2 $26 $46 ICR1L $27 $47 ICR1H $28 $48 OCR1BL $29 $49 OCR1BH OCR1AH $2B $4B SFIOR $30 $50 OCDR $31 $51 OSCCAL $32 $52 TCCR0 $33 $53 MCUCSR $34 $54 MCUCR $35 $55 TWCR $36 $56 SPMCR $37 $57 TIFR $38 $58 TIMSK $39 $59 TCNT1L $2C $4C TCNT1H $2D $4D TCCR1B $2E $4E TCCR1A $2F $4F TCNT0 $3A $5A GICR $3B $5B OCR0 $3C $5C SPL $3D $5D SPH $3E $5E GIFR OCR1AL
Programnya sbb:
LDI R16, 0x55 ;R16 = 55 (hex)
STS 0x38, R16 ;salin isi R16 ke PORTB STS 0x35, R16 ;salin isi R16 ke PORTC STS 0x32, R16 ;salin isi R16 ke PORTD
IN IN from I/O Location
IN Katakan ke CPU untuk menyalin 1
byte dari register I/O ke GPR
Setelah program ini dieksekusi, GPR akan
memiliki nilai yg sama dgn I/O register
Contoh:
IN R20, 0x16 Pembahasan:
Salin isi dr lokasi 16 (hex) pd I/O memory ke dalam R20
I/O memory memiliki 2 alamat:
Setiap lokasi dlm data memory memiliki
alamat unik disebut data memory
address
Setiap I/O register memiliki alamat relatif dlm kaitannya dgn awal dr I/O memory
disebut I/O address
Name Address I/O Mem. $00 $20 TWBR $01 $21 TWSR $04 $24 ADCL $05 $25 ADCH $02 $22 TWAR $03 $23 TWDR $06 $26 ADCSRA $07 $27 ADMUX $08 $28 ACSR $09 $29 UBRRL $0A $2A UCSRB $0B $2B UCSRA $0C $2C UDR $0D $2D SPCR $0E $2E SPSR $0F $2F PIND $10 $30 DDRD $11 $31 PINB $16 $36 DDRB $17 $37 PORTB $18 $38 PINA $19 $39 DDRA $1A $3A PORTA $1B $3B EECR $1C $3C EEDR $1D $3D EEARL $1E $3E EEARH $1F $3F SPDR Name Address
I/O Mem. Name
Address I/O Mem. UBRRC $20 $40 UBRRH $21 $41 WDTCR $22 $42 ASSR $23 $43 OCR2 $24 $44 TCNT2 $25 $45 TCCR2 $26 $46 ICR1L OCR1AH $2B $4B SFIOR $30 $50 OCDR $31 $51 OSCCAL $32 $52 TCCR0 $33 $53 MCUCSR $34 $54 MCUCR $35 $55 TWCR $36 $56 SPMCR $37 $57 TIFR $38 $58 TIMSK $39 $59 TCNT1L $2C $4C TCNT1H $2D $4D TCCR1B $2E $4E TCCR1A $2F $4F TCNT0 $3A $5A GICR $3B $5B GIFR
Contoh:
IN R20, 0x16 Pembahasan:
Salin isi dr lokasi 0x16 pd I/O memory ke
dalam R20
Alamat I/O 0x16 adalah milik PINB
Jadi, arti program tsb: salin isi PINB ke R20
Contoh:
IN R19, 0x10 Pembahasan:
Salin isi dr lokasi 0x10 pd I/O memory ke dalam R19
Alamat I/O 0x10 adalah milik PIND
Agar dapat bekerja lebih mudah, sintaks sebelumnya bisa ditulis sbb:
IN R19, PIND
* Butuh file header jika menggunakan nama dr suatu alamat I/O
Contoh:
Jumlahkan nilai pada PINC dgn isi pd PIND
dan simpan hasilnya pd lokasi 0x300 pd data
memory
Jawab:
IN R1, PINC ; R1 = PINC IN R2, PIND ; R2 = PIND
IN vs. LDS
Kita tahu bahwa LDS jg bisa digunakan utk
menyalin isi dr suatu lokasi ke GPR
Lalu, apa keuntungan menggunakan IN
untuk membaca isi dr I/O register
ketimbang memakai LDS?
IN vs. LDS
Beberapa keuntungan menggunakan instruksi IN, sbb:
CPU mengeksekusi instruksi IN lebih cepat drpd LDS (IN = 1 siklus, LDS = 2 siklus)
IN adalah instruksi 2-byte, sdgkn LDS 4-byte. Berarti, IN menghabiskan lebih sedikit memori Kita dpt menggunakan nama dr I/O register sbg ganti alamatnya
OUT OUT to I/O Location
OUT Katakan ke CPU untuk menulis
nilai pd GPR ke
I/O register
Setelah program ini dieksekusi, I/O
register akan memiliki nilai yg sama dgn
GPR
Contoh:
LDI R20, 0xE6 OUT SPL, R20 Pembahasan:
Masukkan nilai 0xE6 ke register R20 Keluarkan nilai pd R20 ke SPL
Contoh:
Salin nilai PIND ke PORTA
Jawab:
IN R0, PIND OUT PORTA, R0
Contoh:
Buatlah program untuk mendapatkan data
dari PINB dan kirim ke PORTC secara terus
menerus Jawab:
ULANGI: IN R16, PINB OUT PORTC, R16
MOV MOVe or Copy data among GPR
MOV Katakan ke CPU untuk menyalin
data
antar register GPR
Contoh:
MOV R10, R20 Pembahasan:
Salin isi register R20 ke register R10
Sebagai contoh, jika R20 memiliki nilai 60, maka setelah eksekusi nilai R10 juga 60
SUB SUBstract
SUB Katakan ke CPU untuk mengurangi
Contoh:
Kurangi nilai register R10 dgn 1 (hex) Jawab:
LDI R16, 0x1 ;R16 = 1
SUB R10, R16 ;R10 = R10 – 1
Contoh: Hitunglah 0x34 – 0x25 Jawab: LDI R20, 0x34 ;R20 = 0x34 LDI R21, 0x25 ;R21 = 0x25 SUB R20, R21 ;R20 = R20 – R21
INC INCrement
INC Katakan ke CPU untuk Menambah
nilai Rd dengan 1 dan simpan hasilnya di
Rd
Contoh:
INC R2 ; R2 = R2 + 1 Pembahasan:
Tambahkan isi dari R2 dengan 1 Simpan hasilnya di R2
Contoh:
Naikkan satu nilai pada register data
memory yang berlokasi di 0x430
Jawab:
LDS R20, 0x430 ;R20 = [0x430] INC R20 ;R20 = R20 + 1 STS 0x430, R20 ;[0x430] = R20
DEC DECrement
DEC Katakan ke CPU untuk mengurangi
nilai Rd dengan 1 dan simpan hasilnya di
Contoh:
Kurangi nilai register R10 dgn 1
Jawab:
DEC R10 ;R10 = R10 – 1
Contoh:
Isi register R15 dengan 3. Kemudian kurangi
sampai menjadi nol
Jawab:
LDI R16, 3 ;R16 = 3 MOV R15, R16 ;R15 = 3 DEC R15 ;R15 = 2 DEC R15 ;R15 = 1
COM COMplement
COM Komplemen (invert) isi dari Rd dan
simpan hasilnya di Rd
Contoh:
Tempatkan nilai alamat 0x55 ke R2 kemudian kirim nilai R2 ini ke PORTB. Nilai R2 selanjutnya diinvers dan kirim kembali ke PORTB
Jawab:
LDS R2, 0x55 ;R2 = 0x55
OUT PORTB, R2 ;PORTB = 0x55 COM R2 ;invers R2
Contoh:
Berdasarkan program sblmnya, tulislah program utk men-toggle nilai I/O register PORTB secara terus-menerus
Jawab:
LDI R16, 0x55 ;R16 = 0x55(01010101) OUT PORTB, R16 ;PORTB = 0x55
L1: COM R16 ;invers R16
OUT PORTB, R16 ;PORTB = 0xAA(10101010) JMP L1
Sintaks yang melibatkan 1 GPR
Kusuma Wardana, M.Sc. 85
Mazidi, Naimi and Naimi, 2011, The AVR
Microcontroller and Embedded System: Using
Assembly and C, Prentice Hall
www.atmel.com/
Morton, John, 2007, AVR: An Introductory
Course, Newnes Publisher
Gadre, Dhananjaya, 2001, Programming and
Customizing the AVR Microcontroller,
McGraw-Hill
Daniel J.Pack and Steven F.Barrettt, 2008, Atmel AVR Microcontroller Primer: