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 Decrement counter
tidak
Apakah counter = 0?
LAGI: ADD R20, R21
DEC R16
BRNE LAGI
ya Keluarkan hasilnya pd PORTB
OUT PORTB, R20
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 .ORG 00
HERE:
LDI LDI LDI ADD ADD LDI ADD STS JMP
;lokasi LOC pd SRAM $300 ;mulai pd lokasi 0
R16, 0x25 R17, $34 R18, 0x31 R16, R17 R16, R18 R17, 11 R16, R17 LOC, R16 HERE
;R16=0x25 ;R17=0x34 ;R18=0x31 ;R16=R16+R17 ;R16=R16+R18 ;R17=0x0B ;R16=R16+R17 ;simpan pd 0x300 ;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 .ORG 00
000000 e205 000001 e314 000002 e321 000003 0f01 000004 0f02 000005 e01b 000006 0f01 000007 9300 0300 000009 940c 0009 HERE:
;lokasi LOC pd SRAM $300 ;mulai pd lokasi 0
LDI LDI LDI ADD ADD LDI ADD STS JMP HERE
R16, R17, R18, R16, R16, R17, R16, LOC,
0x25 ;R16=0x25 $34 ;R17=0x34 0x31 ;R18=0x31 R17 ;R16=R16+R17 R18 ;R16=R16+R18 11 ;R17=0x0B R17 ;R16=R16+R17 R16 ;simpan pd 0x300 ;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 PC = PC+1 000001 e314 ... 000007 9300 0300 PC = PC+2 000009 940c 0009
LDI R16, 0x25 LDI R17, $34
HERE:
Kusuma Wardana - Bahasa Rakitan 2016
STS LOC, R16 JMP HERE
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 .ORG 00 000000 ...
e205
;lokasi LOC pd SRAM $300 ;mulai pd lokasi 0 LDI R16, 0x25 Kusuma Wardana - Bahasa Rakitan 2016
;R16=0x25 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 000001 e314 000002 e321
LDI R16, 0x25 LDI R17, $34 LDI R18, 0x31 Kusuma Wardana - Bahasa Rakitan 2016
;R16=0x25 ;R17=0x34 ;R18=0x31 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 onchip 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: Tentukan isi dari stack, stack poniter, serta R20, R22 dan R31 dari program berikut:
.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
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 BACK :
;load SPL
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
;
LAGI:
NOP
; no operation (buang2 detak)
R20 = 255 (sbg counter)
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
...
R0 R1 R2
General Purpose Registers
...
$0000 $0001
R31
$001F
I/O Address
...
Standard I/O Registers
SPH SREG
$005F
$00 $01
...
TWBR TWSR
$0020
$3E $3F
$0060 ...
Ingat: kita tdk dpt mendefinisikan stack pd register memory, atau di I/O memory Jd, SP hrs diset diatas alamat 0x60
Data Address Space
General purpose 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 :
000005 bb08
OUT PORTB, R16
LDI R16, 0x55
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 .ORG 0X300 DELAY: LDI R20, 0XFF AGAIN: NOP NOP DEC R20 BRNE AGAIN RET
delay ;R20 = 255: counter
;ulangi sampai R20 = 0 ; kembali ke caller
Kusuma Wardana - Bahasa Rakitan 2016
84
Jawab: Lihat AVR Instruction Set, kemudian carilah instruction cycle DELAY: LDI R20, 0XFF AGAIN: NOP NOP DEC R20 BRNE AGAIN RET
Instruction Cycles 1 1 1 1 2/1 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 DELAY: LDI R20, 0XFF AGAIN: NOP NOP DEC R20 BRNE AGAIN RET
Instruction Cycles 1 1 1 1 2/1 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 DELAY: AGAIN: HERE:
LDI R16, 200 LDI R17, 250 NOP NOP DEC R17 BRNE HERE DEC R16 BRNE AGAIN RET
Instruction Cycles 1 1 1 1 1 2/1 1 2/1 4
Kusuma Wardana - Bahasa Rakitan 2016
89
Kemudian instruksi diluar kalang: Instruction Cycles AGAIN:
LDI R17, 250 ... DEC R16 BRNE AGAIN
1 1 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
Pipeline
fetch 1
execute 1 fetch 2
fetch 2
execute 2
execute 3 fetch 4
T1
T2
execute 3
execute 2 fetch 3
Time
fetch 3
T3
Kusuma Wardana - Bahasa Rakitan 2016
T4
execute 4 fetch 5
execute 5
T5
T6
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