Anda di halaman 1dari 97

Materi 7: Branch, Call and

Time Delay Loop

I Nyoman Kusuma Wardana


Sistem Komputer STMIK STIKOM Bali

Kusuma Wardana - Bahasa Rakitan 2016 1


Branches and Looping
Program Counter (PC)
Calculating the Short Branch
Address
Unconditional Branches
Call Instruction & Stack
AVR time delay

Kusuma Wardana - Bahasa Rakitan 2016 2


Kusuma Wardana - Bahasa Rakitan 2016 3
Loop  pengulangan instruksi atau operasi
dlm suatu waktu tertentu
Loop  salah satu teknik pemrograman yg
paling sering digunakan
Di AVR, ada berbagai teknik utk melakukan
pengulangan
Salah satunya dgn melakukan operasi yg
sama berulang-ulang sampai tujuan akhir
terpenuhi

Kusuma Wardana - Bahasa Rakitan 2016 4


Contoh:
LDI R24, 0 ;R24 = 0
LDI R25, 3 ;R25 = 3
ADD R24, R25 ;R24 = 0x03
ADD R24, R25 ;R24 = 0x06
ADD R24, R25 ;R24 = 0x09
ADD R24, R25 ;R24 = 0x0C
ADD R24, R25 ;R24 = 0x0F
ADD R24, R25 ;R24 = 0x12

Bgmn jika agar isi R24 mencapai 0x50?  boros


ruang
Kusuma Wardana - Bahasa Rakitan 2016 5
BRNE  BRanch if Not Equal
BRNE  memakai zero flag
Lompatlah jika Z = 0

BACK: ............ ;start loop


............ ; body loop
............ ; body loop
DEC Rn ; decrement Rn, Z=1 jika Rn=0
BRNE BACK ; kembali jika z=0

Kusuma Wardana - Bahasa Rakitan 2016 6


Contoh:
Buatlah program dgn kasus berikut:
Kosongkan R20, kemudian tambahkan nilai
3 ke R20 sebanyak sepuluh kali. Terakhir,
kirim hasil penjumlahan ke PORTB

Gunakan zero flag dan BRNE

Kusuma Wardana - Bahasa Rakitan 2016 7


Jawab:
.INCLUDE “M16DEF.INC”
LDI R16, 10 ;R16 = 10 (utk counter)
LDI R20, 0 ;R20 = 0 (kosongkan R20)
LDI R21,3 ;R21 = 3
LAGI: ADD R20, R21 ;R20 = R20 +3
DEC R16 ;decrement R16 (counter)
BRNE LAGI ;ulangi sampai count = 0
OUT PORTB, R20 ;kirim hasil akhir ke PORTB

Kusuma Wardana - Bahasa Rakitan 2016 8


Load counter LDI R16, 10

Clear R20 LDI R20, 0

Isi R21 dgn 3


LDI R21,3

Tambahkan R20 dan R21 LAGI: ADD R20, R21

Decrement counter DEC R16

tidak Apakah BRNE LAGI


counter = 0?

ya
OUT PORTB, R20
Keluarkan hasilnya pd PORTB
Kusuma Wardana - Bahasa Rakitan 2016 9
Contoh:
Berdasarkan contoh sebelumnya,
berapakah maksimum pengulangan yg
bisa dilakukan?
Jawab:
Karena R16 = 8-bit register, maka R16
hanya bisa meng-handle pengulangan
sebanyak 0xFF (255 dec)
Oleh karena itu, pengulangan maks = 255
kali
Kusuma Wardana - Bahasa Rakitan 2016 10
Utk mengatasi keterbatasan pengulangan
(misal maks 255 pd contoh sebelumnya)
digunkanlah loop di dalam loop (nested
loop)
Menggunakan 2 register sbg counter
Contoh:
Buat program utk:
Muati register PORTB dgn nilai 0x55
Komplemenkan (invers) PORTB 700 kali

Kusuma Wardana - Bahasa Rakitan 2016 11


Jawab:
.INCLUDE “M16DEF.INC”
.ORG 0
LDI R16, 0x55 ;R16 = 0x55
OUT PORTB, R16 ;PORTB = 0x55
LDI R20, 10 ;R20 = 10 (loop luar)
LOP_1: LDI R21, 70 ;R21 = 70 (loop dalam)
LOP_2: COM R16 ;komplemen R16
OUT PORTB, R16 ;keluarkan ke PORTB
DEC R21 ;dec R21 (loop dalam)
BRNE LOP_2 ;ulangi 70 kali
DEC R20 ;dec R20 (loop luar)
BRNE LOP_1 ;ulangi 10 kali
Kusuma Wardana - Bahasa Rakitan 2016 12
Kusuma Wardana - Bahasa Rakitan 2016 13
Dua register memberikan kita maksimum
65.025 (255 x 255) pengulangan
Jika menggunakan tiga register  lebih dr
16 juta kali!

Contoh:
Tulislah program utk melakukan
pengulangan sebanyak 100.000 kali !

Kusuma Wardana - Bahasa Rakitan 2016 14


Jawab:
LDI R16, 0x55
OUT PORTB, R16
LDI R23, 10
LOP_3: LDI R22, 100
LOP_2: LDI R21, 100
LOP_1: COM R16
DEC R21
BRNE LOP_1
DEC R22
BRNE LOP_2
DEC R23
BRNE LOP_3
Kusuma Wardana - Bahasa Rakitan 2016 15
Jenis-jenis percabangan bersyarat lainnya:

Instruksi Aksi
BRLO Bercabang jika C=1
BRSH Bercabang jika C=0
BREQ Bercabang jika Z=1
BRNE Bercabang jika Z=0
BRMI Bercabang jika N=1
BRPL Bercabang jika N=0
BRVS Bercabang jika V=1
BRVC Bercabang jika V=0

Kusuma Wardana - Bahasa Rakitan 2016 16


BREQ  BRanch if EQual
BREQ  Z flag dicek. Jika tinggi (1), maka
CPU akan melompat ke alamat target

Contoh:

OVER:IN R20, PINB ;baca PINB & taruh di R20


TST R20 ;set flag sesuai R20
BREQ OVER ;lompat jika R20 = 0

Kusuma Wardana - Bahasa Rakitan 2016 17


OVER: IN R20, PINB ;baca PINB & taruh di R20
TST R20 ;set flag sesuai R20
BREQ OVER ;lompat jika R20 = 0

Jika PINB = 0, maka CPU akan melompat ke


OVER
TST  set flag sesuai dgn isi dr register tsb
tanpa melakukan operasi aritmatika (misal
increment/decrement)

Kusuma Wardana - Bahasa Rakitan 2016 18


BRSH  BRanch if Same or Higher
BRSH  C flag dicek. Jika rendah (0), maka
CPU akan melompat ke alamat target
Jika C =1, maka tdk akan bercabang,
namun akan mengeksekusi perintah
selanjutnya
Contoh:
Buatlah program utk menentukan apakah
RAM pd lokasi 0x200 berisi nilai 0. jika ya,
isilah dgn nilai 0x55 ke dalamnya
Kusuma Wardana - Bahasa Rakitan 2016 19
Jawab: Buatlah program utk menentukan apakah RAM pd lokasi 0x200
berisi nilai 0. jika ya, isilah dgn nilai 0x55 ke dalamnya

.EQU LOKASI = 0x200


LDS R30, LOKASI
TST R30
BRNE NEXT ;brcabang jk R30 ≠ 0 (Z=0)
LDI R30, 0x55 ;isi 0x55 jk R30 = 0
STS LOKASI, R30
NEXT:...
Kusuma Wardana - Bahasa Rakitan 2016 20
Kusuma Wardana - Bahasa Rakitan 2016 21
Program Counter (PC)

Salah satu register yg sangat penting!


PC  digunakan oleh CPU utk
mendapatkan alamat dr instruksi
selanjutnya utk dieksekusi

Kusuma Wardana - Bahasa Rakitan 2016 22


CPU mengambil (fetch) instruksi (opcode)
dr program ROM dan selanjutnya PC naik
scr otomatis memposisikan alamat utk
instruksi berikutnya
Semakin lebar PC  semakin banyak lokasi
memori yg dpt diakses
Misal, 14-bit PC dapat mengakses 16K
lokasi program memori (214 = 16K)

Kusuma Wardana - Bahasa Rakitan 2016 23


µC AVR  memiliki Flash memory dgn lebar
memori sebesar 2-byte
Contoh: ATmega32 mempunyai 32K byte 
diorganisasikan 16K x 2 byte.
PC = 14bit (214 = 16K lokasi memori)

Kusuma Wardana - Bahasa Rakitan 2016 24


ATmega64  memiliki 64K byte ROM
64K dipecah menjd 32K x 2 byte
Fokus pd 32K - nya
Oleh karena itu, lebar PC adlh 15-bit, sebab
215=32K

Kusuma Wardana - Bahasa Rakitan 2016 25


Untuk 16-bit PC  ruang memori kode adlh
64K (216 = 64K): mengambil lokasi 0000-$FFFF
Jika 22-bit  ruang = 000000 - $3FFFFF

Kusuma Wardana - Bahasa Rakitan 2016 26


AVR On-Chip Program ROM Address Range

Kusuma Wardana - Bahasa Rakitan 2016 27


Contoh:
Temukanlah rentang alamat ROM dr µC
berikut:
ATtiny25 dgn 2KB
ATmega16 dgn 16KB
ATmega64 dgn 64KB

Kusuma Wardana - Bahasa Rakitan 2016 28


Jawab:

ATtiny25
2K byte  2 x 1024 = 2048 memori ROM
Karena lebar tiap alamat adlh 2 byte,
maka akan mempunyai 1024 lokasi (2048/2
= 1024).
Maka rentang lokasi = 0000 - $03FF

Kusuma Wardana - Bahasa Rakitan 2016 29


Jawab:

ATmega16
16K byte  16 x 1024 = 16.384 byte memori
ROM
Karena lebar tiap alamat adlh 2 byte, maka
akan mempunyai 8192 lokasi (16.384 /2 =
8192)
Maka rentang lokasi = 0000 - $1FFF

Kusuma Wardana - Bahasa Rakitan 2016 30


Jawab:

ATmega64
64K byte  64 x 1024 = 65.535 byte memori
ROM
Karena lebar tiap alamat adlh 2 byte, maka
akan mempunyai 32.768 lokasi (65.535 /2 =
32.768)
Maka rentang lokasi = 0000 - $7FFF

Kusuma Wardana - Bahasa Rakitan 2016 31


AVR On-Chip Program ROM Address Range

Kusuma Wardana - Bahasa Rakitan 2016 32


Placing Code in Program ROM

.INCLUDE "M16DEF.INC"
.EQU LOC = 0x300 ;lokasi LOC pd SRAM $300
.ORG 00 ;mulai pd lokasi 0

LDI R16, 0x25 ;R16=0x25


LDI R17, $34 ;R17=0x34
LDI R18, 0x31 ;R18=0x31
ADD R16, R17 ;R16=R16+R17
ADD R16, R18 ;R16=R16+R18
LDI R17, 11 ;R17=0x0B
ADD R16, R17 ;R16=R16+R17
STS LOC, R16 ;simpan pd 0x300
HERE: JMP HERE ;diam selamanya di sini

Kusuma Wardana - Bahasa Rakitan 2016 33


Ubah seting pd AVR Studio utk membuat
list file: Project  Assembler Options

Kusuma Wardana - Bahasa Rakitan 2016 34


Sebagian isi list file:
...

.EQU LOC = 0x300 ;lokasi LOC pd SRAM $300


.ORG 00 ;mulai pd lokasi 0

000000 e205 LDI R16, 0x25 ;R16=0x25


000001 e314 LDI R17, $34 ;R17=0x34
000002 e321 LDI R18, 0x31 ;R18=0x31
000003 0f01 ADD R16, R17 ;R16=R16+R17
000004 0f02 ADD R16, R18 ;R16=R16+R18
000005 e01b LDI R17, 11 ;R17=0x0B
000006 0f01 ADD R16, R17 ;R16=R16+R17
000007 9300 0300 STS LOC, R16 ;simpan pd 0x300
000009 940c 0009 HERE: JMP HERE ;diam selamanya disini

...

Kusuma Wardana - Bahasa Rakitan 2016 35


Amati untuk program counter (PC) utk LDI,
ADD dan STS pd AVR Instruction Set, sbb:

Kusuma Wardana - Bahasa Rakitan 2016 36


Penambahan PC menunjukkan sasaran
target lokasi selanjutnya

000000 e205 LDI R16, 0x25


000001 e314 PC = PC+1 LDI R17, $34
...
000007 9300 0300 STS LOC, R16
000009 940c 0009 PC = PC+2 HERE: JMP HERE

Kusuma Wardana - Bahasa Rakitan 2016 37


Alamat 0000 berisi E205  opcode utk
memindahkan nilai ke R16 dan operand
(dlm hal ini 0x25) ke R16
Dgn demikian, instruksi LDI R16, 0x25
memiliki kode mesin E205
Dimana E = opcode, 205 = operand

.EQU LOC = 0x300 ;lokasi LOC pd SRAM $300


.ORG 00 ;mulai pd lokasi 0

000000 e205 LDI R16, 0x25 ;R16=0x25


...
Kusuma Wardana - Bahasa Rakitan 2016 38
Lihat instruksi LDI pd AVR Instruction Set dan
amati byte Opcode (dlm biner), sbb:

LDI Rd, K 16 ≤ d ≤ 31, 0 ≤ r ≤ 255

Kusuma Wardana - Bahasa Rakitan 2016 39


Opcode LDI Rd, K dlm hex:

Amati pada list file:


000000 e205 LDI R16, 0x25 ;R16=0x25
000001 e314 LDI R17, $34 ;R17=0x34
000002 e321 LDI R18, 0x31 ;R18=0x31

Kusuma Wardana - Bahasa Rakitan 2016 40


Kusuma Wardana - Bahasa Rakitan 2016 41
SEMUA percabangan bersyarat (misal
BRSH, BREQ dan BRNE) adlh short jump
Short jump  alamat target harus lebih
kecil dr 64 byte dlm Program Counter
(PC)

Kusuma Wardana - Bahasa Rakitan 2016 42


Short jump (short branch)  instruksi 2 byte
2 byte tersebut:
Opcode = 9-bit
relative address (operand) = 7-bit
Contoh BRSH

kkkkkkk = relative address


Sisanya = opcode

Kusuma Wardana - Bahasa Rakitan 2016 43


Contoh BRSH

kkkkkkk = relative address


Sisanya = opcode
Asumsi kode mesinnya adalh:
1111 0100 0000 1000
Maka:
Relative address= 0000001
Opcode = 111101000
Kusuma Wardana - Bahasa Rakitan 2016 44
Target address  relatif terhadap nilai pd
program counter (PC)
Relative address positif  melompat maju
Relative address negatif  melompat
mundur
Relative address memiliki nilai antara: -64 -
+63
Utk menghitung target address:

𝑻𝒂𝒓𝒈𝒆𝒕 𝑨𝒅𝒅. = 𝑹𝒆𝒍𝒂𝒕𝒊𝒗𝒆 𝑨𝒅𝒅. +𝑷𝑪

Kusuma Wardana - Bahasa Rakitan 2016 45


𝑻𝒂𝒓𝒈𝒆𝒕 𝑨𝒅𝒅. = 𝑹𝒆𝒍𝒂𝒕𝒊𝒗𝒆 𝑨𝒅𝒅. + 𝑷𝑪

Kusuma Wardana - Bahasa Rakitan 2016 46


Kusuma Wardana - Bahasa Rakitan 2016 47
JMP (Jump)
JMP  unconditional Jump: dpt pergi ke
lokasi memori mana saja dlm rentang 4M
(word) ruang memori
Mrpkn perintah 4-byte (32-bit):
10-bit: opcode
22-bit: alamat target

Kusuma Wardana - Bahasa Rakitan 2016 48


Kusuma Wardana - Bahasa Rakitan 2016 49
22-bit target address  dpt menjangkau
4M (words) lokasi memori dgn rentang:
000000 - $3FFFFF
Ingat 222=4.194.304
Jd, perintah JMP dpt mengkover seluruh
ruang memori
Tidak semua keluarga AVR dpt diberi
instruksi JMP!!!

Kusuma Wardana - Bahasa Rakitan 2016 50


Wlpn AVR dpt mempunyai ruang memori
sampai 8M-byte, tdk semua keluarga AVR
mempunyai sedemikian besar kapasitas
ROM
Bbrp jenis AVR hanya memiliki 4K-32K on-
chip ROM  setiap byte begitu berharga
Oleh karena itu, terdapat alternatif  yaitu
RJMP (Relative Jump)

Kusuma Wardana - Bahasa Rakitan 2016 51


RJMP (Relative Jump)
RJMP  instruksi 2-byte (16-bit):
4-bit: opcode
12-bit: relative address
Rentang alamat: 000-$FFF
Dibagi mnjd lompat maju dan lompat
mundur dlm rentang -2048 sampai +2047
relatif thd PC

Kusuma Wardana - Bahasa Rakitan 2016 52


Jika lompat maju: relative address = positif
Jika lompat mundur: relative address =
negatif
Dlm hal ini, RJMP seperti conditional
branch, namun 12 bit digunakan sbg offset
address

Kusuma Wardana - Bahasa Rakitan 2016 53


IJMP (Indirect Jump)
IJMP  mrpkn instruksi 2-byte
Ketika dieksekusi, PC dimuati dgn nilai dr
suatu register Z
Jadi, akan melompat ke alamat yg
ditunjukkan oleh nilai dr register Z

Kusuma Wardana - Bahasa Rakitan 2016 54


Pd percabangan yg lain  target address
bersifat statik
Namun, pd IJMP  target bersifat dinamis
Kita dpt scr dinamis mengubah alamat
target dgn mengubah isi register Z

Kusuma Wardana - Bahasa Rakitan 2016 55


Kusuma Wardana - Bahasa Rakitan 2016 56
Call  digunakan utk memanggil subrutin
Subrutin melaksanakan tugas tertentu yg
sering dilakukan
Penggunaan instruksi call membuat
program lebih terstruktur dan menghemat
memori
4 Jenis Call: CALL, RCALL, ICALL, EICALL

Kusuma Wardana - Bahasa Rakitan 2016 57


CALL
Call  instruksi 4-byte (32-bit):
10-bit: opcode
22-bit: target address
Seperti halnya JMP  call dpt mengakses
sampai 4M dgn rentang: 000000-$3FFFFF

Kusuma Wardana - Bahasa Rakitan 2016 58


Formasi perintah CALL

Kusuma Wardana - Bahasa Rakitan 2016 59


Utk memastikan bahwa CPU akan kembali
ke program utama setelah memanggil
CALL,  maka perintah dibawah CALL scr
otomatis akan disimpan pada stack
Setelah selesai mengeksekusi subrutin,
maka diperlukan perintah RET utk kembali
lg ke asal
Setiap subrutin memerlukan perintah RET

Kusuma Wardana - Bahasa Rakitan 2016 60


Stack and Stack Pointer
Stack  lokasi pd RAM yg digunakan utk
menyimpan informasi sementara
Register yg digunakan utk mengakses stack
dinamakan SP (Stack Pointer)
Terdpt 2 register:
1. SPL (utk low bit SP) dan
2. SPH (utk high bit SP)

Kusuma Wardana - Bahasa Rakitan 2016 61


Utk instruksi yg kurang atau sama dgn 8-bit,
cukup digunakan SPL
Jika lebih, dipakai keduanya

Kusuma Wardana - Bahasa Rakitan 2016 62


Perintah utk menyimpan informasi pd stack
disebut PUSH
Perintah utk me-load informasi dr stack ke
register disebut POP
Dgn kata lain, register di “pushed” ke stack
utk disimpan lalu mem “popped-off ” stack
utk diambil informasinya

Kusuma Wardana - Bahasa Rakitan 2016 63


Pushing onto the Stack
SP diarahkan ke top of stack (TOS)
Karena kita push ke stack, maka data akan
disimpan pd tempat yg diarahkan oleh SP
Kemudian SP dikurangi 1
Contoh:
PUSH R10 ;simpan R10 ke stack, dec SP

Kusuma Wardana - Bahasa Rakitan 2016 64


Popping from the Stack
Proses mrpkn kebalikan dr PUSH
Ketika POP dieksekusi  SP dinaikkan
(increment) 1 dan TOS disalin balik ke
register
Stack bersifat LIFO (Last-In-First-Out)
Contoh:
POP R16 ;salin isi stack ke R16, in SP

Kusuma Wardana - Bahasa Rakitan 2016 65


Inisialisasi Stack Pointer
Ketika uC dinyalakan  SP bernilai 0, yaitu
pd R0
Oleh karena itu, kita hrs menginisialisasinya
ke suatu alamat pd RAM
Pd AVR, stack berjalan dr memori lebih
tinggi ke meori lebih rendah (makanya kita
mengurangi alamat SP)
Oleh karena itu, utk pertama kali, kita
alamatkan pd memori yg paling tinggi
Kusuma Wardana - Bahasa Rakitan 2016 66
Setiap uC AVR memiliki ukuran RAM yg
berbeda
Jika kita ingin menginisialisasi SP, gunakan
perintah RAMEND
Ingat, SP terdiri dr 2: SPL dan SPH
Gunakan RAMEND utk kedua register tsb

Kusuma Wardana - Bahasa Rakitan 2016 67


.INCLUDE “M16DEF.INC”

Contoh: .ORG 0
;inisialisasi SP pd lokasi terakhir dari
Tentukan isi dari ; RAM(RAMEND)

stack, stack LDI R16, HIGH(RAMEND) ;load SPH


OUT SPH, R16
poniter, serta R20, LDI R16, LOW(RAMEND) ;load SPL
R22 dan R31 dari OUT SPL, R16

program berikut:
LDI R31, 0
LDI R20, 0x21
LDI R22, 0x66

PUSH R20
PUSH R22

LDI R20, 0
LDI R22, 0

POP R22
POP R31
Kusuma Wardana - Bahasa Rakitan 2016 68
.INCLUDE “M16DEF.INC”
.ORG 0
;inisialisasi SP pd lokasi terakhir dari
; RAM(RAMEND)
LDI R16, HIGH(RAMEND) ;load SPH
OUT SPH, R16
LDI R16, LOW(RAMEND) ;load SPL
OUT SPL, R16

LDI R31, 0
LDI R20, 0x21
LDI R22, 0x66

PUSH R20
PUSH R22

LDI R20, 0
LDI R22, 0

POP R22
POP R31
Kusuma Wardana - Bahasa Rakitan 2016 69
Ketika subrutin dipanggil, prosesor
menyimpan alamat tepat di bawah CALL &
segera lari ke subrutin yg dituju
Ketika RET dieksekusi, lokasi paling atas pd
stack disalin ke program counter (PC) dan
stack pointer dinaikkan

Kusuma Wardana - Bahasa Rakitan 2016 70


Contoh:
Toggle semua bit pd PORTB dengan
mengirim nilai $55 dan $AA terus-menerus.
Letakkan time delay diantaranya

Kusuma Wardana - Bahasa Rakitan 2016 71


.INCLUDE “M16DEF.INC”
.ORG 0

Jawab:
LDI R16, HIGH(RAMEND) ;load SPH
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16 ;load SPL
BACK : LDI R16, 0x55 ; R16 = 0x55
OUT PORTB, R16 ; kirim 55 (hex) ke port B
CALL DELAY ; delai
LDI R16, 0xAA ; R16 = 0xAA
OUT PORTB, R16 ; kirim AA (hex) ke port B
CALL DELAY ; delai
RJMP BACK ; lakukan secara terus-menerus
;------- ini adalah subrutin untuk delay ---------
.ORG 0x300 ; tempatkan delay di alamat 0x300
DELAY: LDI R20, 0xFF ; R20 = 255 (sbg counter)
LAGI: NOP ; no operation (buang2 detak)
NOP
DEC R20
BRNE LAGI ; lakukan sampai R20 mnjd 0
RET ; kembali ke caller
Kusuma Wardana - Bahasa Rakitan 2016 72
Upper Limit of the Stack
Kita dpt menentukan dimana saja lokasi
stack pd general purpose RAM (SRAM)
Jd, nilai stack bisa sebesar ukuran RAM yg
dimiliki
Stack TIDAK DAPAT dideklarasikan di
register memory atau I/O memory

Kusuma Wardana - Bahasa Rakitan 2016 73


8 bit

Ingat: kita tdk dpt


Data Address
Space R0
R1

mendefinisikan
$0000 R2
$0001 General

...
Purpose
stack pd register

...
Registers R31
$001F

memory, atau di
I/O Address
TWBR $00
$0020
TWSR $01

I/O memory
Standard I/O

...
...
Registers
SPH $3E

Jd, SP hrs diset


$005F SREG $3F
$0060

diatas alamat
General
purpose

0x60 ...
RAM
(SRAM)

$FFFF

Kusuma Wardana - Bahasa Rakitan 2016 74


Analisis stack dr instruksi CALL berikut:
.ORG 0
000000 e004 LDI R16, HIGH(RAMEND)
000001 bf0e OUT SPH, R16
000002 e50f LDI R16, LOW(RAMEND)
000003 bf0d OUT SPL, R16
000004 e505 BACK : LDI R16, 0x55
000005 bb08 OUT PORTB, R16
000006 940e 0300 CALL DELAY
000008 ea0a LDI R16, 0xAA
000009 bb08 OUT PORTB, R16
00000a 940e 0300 CALL DELAY
00000c cff7 RJMP BACK
.ORG 0x300
000300 ef4f DELAY: LDI R20, 0xFF
000301 0000 LAGI: NOP
000302 0000 NOP
000303 954a DEC R20
000304 f7e1 BRNE LAGI
000305 9508 RET
Kusuma Wardana - Bahasa Rakitan 2016 75
Memanggil banyak subrutin:

Kusuma Wardana - Bahasa Rakitan 2016 76


RCALL (Relative Call)
RCALL instruksi 2-byte (16-bit)
4-bit: opcode
12-bit: target address
Target address harus antara: -2048 – +2047
Tdk ada perbedaan antara RCALL dan
CALL, namun yg membedakan adlh range
address yg bisa dijangkau

Kusuma Wardana - Bahasa Rakitan 2016 77


ICALL (Indirect Call)
ICALL instruksi 2-byte (16-bit)
Z register menentukan alamat target
Z register = 16 bit  dpt menjangkau 64K
words

Kusuma Wardana - Bahasa Rakitan 2016 78


Kusuma Wardana - Bahasa Rakitan 2016 79
Utk membuat time delay menggunakan
bhs assembly, trdapat 2 faktor yg
mempengaruhi akurasi, sbb:

1. Frekuensi kristal
Kristal terkoneksi pd pin XTAL1 dan XTAL2.
Durasi dr periode clock utk siklus intruksi
adlh fungsi dr frekuensi kristal ini

Kusuma Wardana - Bahasa Rakitan 2016 80


2. Desain AVR
Salah satu utk mempercepat kinerja
mikrokontroler membwt single instruction
cycle
Mengapa AVR dpt membuat 1 siklus utk 1
instruksi? Krn sbb:
1. Menggunakan arsitektur Harvard
2. Menggunakan RISC
3. Menggunakan pipeline

Kusuma Wardana - Bahasa Rakitan 2016 81


Subrutin delay terdiri dr 2 bagian:
1. Seting counter
2. Loop
Kita sering mengkalkulasi time dalay
brdasarkan instruksi di dlm loop

Kusuma Wardana - Bahasa Rakitan 2016 82


Register 8 bit  max 255
Salah satu utk memperlambat delay 
menggunakan perintah NOP
NOP  No OPeration : wasting time
NOP menghabiskan 2 byte ROM dieksekusi
1 clock cycle
NOP  terlalu mahal utk 1 clock cycle
Alternatif  pakai nested loop

Kusuma Wardana - Bahasa Rakitan 2016 83


Contoh:
Dgn menggunakan kristal 1 MHz, tentukan
lamanya delay dr program berikut:

;------ini adalah subrutin delay


.ORG 0X300
DELAY: LDI R20, 0XFF ;R20 = 255: counter
AGAIN:
NOP
NOP
DEC R20
BRNE AGAIN ;ulangi sampai R20 = 0
RET ; kembali ke caller

Kusuma Wardana - Bahasa Rakitan 2016 84


Jawab:
Lihat AVR Instruction Set, kemudian carilah
instruction cycle
Instruction Cycles
DELAY: LDI R20, 0XFF 1
AGAIN: NOP 1
NOP 1
DEC R20 1
BRNE AGAIN 2/1
RET 4

Kusuma Wardana - Bahasa Rakitan 2016 85


Time delay = [1+(1+1+1+2)x255 + 4]x1us =1280us
Ingat, BRNE menghabiskan 2 siklus jika lompat
dan 1 siklus ketika tidak lompat.
Jadi, time delay =1280us – 1 = 1279us

Instruction Cycles
DELAY: LDI R20, 0XFF 1
AGAIN: NOP 1
NOP 1
DEC R20 1
BRNE AGAIN 2/1
RET 4

Kusuma Wardana - Bahasa Rakitan 2016 86


Loop Inside a Loop Delay
Loop Inside a Loop Delay = nested loop
Digunakan untuk membuat delay yang
lebih lama

Kusuma Wardana - Bahasa Rakitan 2016 87


Contoh:
Dgn menggunakan kristal 1 MHz, tentukan
lamanya delay dr program berikut:

DELAY: LDI R16, 200


AGAIN: LDI R17, 250
HERE: NOP
NOP
DEC R17
BRNE HERE
DEC R16
BRNE AGAIN
RET

Kusuma Wardana - Bahasa Rakitan 2016 88


Jawab:
HERE Loop= [(5x250)-1] x 1us = 1.249us
AGAIN mengulangi HERE sbanyak 200x,
maka:
200 x 1249 = 249.800 us
Instruction Cycles
DELAY: LDI R16, 200 1
AGAIN: LDI R17, 250 1
HERE: NOP 1
NOP 1
DEC R17 1
BRNE HERE 2/1
DEC R16 1
BRNE AGAIN 2/1
RET 4

Kusuma Wardana - Bahasa Rakitan 2016 89


Kemudian instruksi diluar kalang:
Instruction Cycles

AGAIN: LDI R17, 250 1


...
DEC R16 1
BRNE AGAIN 2/1

[(4 x 200) – 1] x 1us = 799us


Total = 249.800 + 799 = 250.599us
Kita blm memasukkan “LDI R16, 200” dan “RET”
TOTAL semuanya = 1us + 250.599us + 4us =
250.604us
Kusuma Wardana - Bahasa Rakitan 2016 90
Kusuma Wardana - Bahasa Rakitan 2016 91
Non-pipeline fetch 1 execute 1 fetch 2 execute 2 fetch 3 execute 3

Pipeline fetch 1 execute 1

fetch 2 execute 2

fetch 3 execute 3

fetch 4 execute 4

fetch 5 execute 5

Time
T1 T2 T3 T4 T5 T6

Kusuma Wardana - Bahasa Rakitan 2016 92


Kusuma Wardana - Bahasa Rakitan 2016 93
Kusuma Wardana - Bahasa Rakitan 2016 94
Single-cycle

Pipeline

Kusuma Wardana - Bahasa Rakitan 2016 95


Kita dpt menggunakan pipeline utk
mempercepat eksekusi dr instruksi
Pd pipeline  proses utk mengeksekusi
dipecah menjadi langkah2 kecil dan
dikerjakan scr paralel
Kelemahan pipeline  kecepatan eksekusi
terbatasi oleh kecepatan terendah dr
bagian pipeline tsb

Kusuma Wardana - Bahasa Rakitan 2016 96


Mazidi, Naimi and Naimi, 2011, The AVR
Microcontroller and Embedded System:
Using Assembly and C, Prentice Hall
www.atmel.com/
Vahid, Frank and Gigarvis, Tony, 1999,
Embedded System Design: Unified
Hardware/Software Approach
Morton, John, 2007, AVR: An Introductory
Course, Newnes Publisher

Kusuma Wardana - Bahasa Rakitan 2016 97

Anda mungkin juga menyukai