bab i avr atmega 8535l - 123seminarsonly.com … · fitur yang tersedia pada atmega 8535 adalah :...
TRANSCRIPT
1
BAB I
AVR ATMega 8535L
1.1 Sekilas Tentang AVR
AVR : Alf and Vegard RISC atau
AVR : Advanced Virtual RISC
RISC: Reduced Instruction Set Computer
Arsitektur mikrokontroler jenis AVR pertamakali dikembangkan pada tahun
1996 oleh dua orang mahasiswa Norwegian Institute of Technology yaitu Alf-Egil
Bogen dan Vegard Wollan.
Mikrokontroler AVR kemudian dikembangkan lebih lanjut oleh Atmel. Seri
pertama AVR yang dikeluarkan adalah mikrokontroler 8 bit AT90S8515, dengan
konfigurasi pin yang sama dengan mikrokontroler 8051, termasuk address dan
data bus yang termultipleksi. Mikrokontroler AVR menggunakan teknologi
RISC dimana set instruksinya dikurangi dari segi ukurannya dan
kompleksitas mode pengalamatannya.
Pada awal era industri komputer, bahasa pemrograman masih
menggunakan kode mesin dan bahasa assembly. Untuk mempermudah dalam
pemrograman para desainer komputer kemudian mengembangkan bahasa
pemrograman tingkat tinggi yang mudah dipahami manusia. Namun akibatnya,
instruksi yang ada menjadi semakin komplek dan membutuhkan lebih banyak
memori. Dan tentu saja siklus eksekusi instruksinya menjadi semakin lama.
Dalam AVR dengan arsitektur RISC 8 bit, semua instruksi berukuran 16 bit
dan sebagian besar dieksekusi dalam 1 siklus clock. Berbeda dengan
mikrokontroler MCS-51 yang instruksinya bervariasi antara 8 bit sampai 32
bit dan dieksekusi selama 1 sampai 4 siklus mesin, dimana 1 siklus mesin
membutuhkan 12 periode clock. Dalam perkembangannya, AVR dibagi
menjadi beberapa varian yaitu AT90Sxx, ATMega, AT86RFxx dan ATTiny.Pada
dasarnya yang membedakan masing-masing varian adalah kapasitas memori
dan beberapa fitur tambahan saja.
2
1.2 Karakteristik mikrokontroler AVR seri ATMega8535
1.2.1 Fitur ATMega8535
Fitur yang tersedia pada ATMega 8535 adalah :
• Frekuensi clock maksimum 16 MHz
• Jalur I/O 32 buah, yang terbagi dalam PortA, PortB, PortC dan PortD
• Analog to Digital Converter 10 bit sebanyak 8 input
• Timer/Counter sebanyak 3 buah
• CPU 8 bit yang terdiri dari 32 register
• Watchdog Timer dengan osilator internal
• SRAM sebesar 512 byte
• Memori Flash sebesar 8 Kbyte dengan kemampuan read while write
• Interrupt internal maupun eksternal
• Port komunikasi SPI
• EEPROM sebesar 512 byte yang dapat diprogram saat operasi
• Analog Comparator
• Komunikasi serial standar USART dengan kecepatan maksimal 2,5 Mbps
3
1.2.2 Konfigurasi Pin ATMega8535
Gambar 1.1 Konfigurasi Pin ATMega8535
1.2.3 Peta Memori ATMega8535
ATMega8535 memiliki dua jenis memori yaitu Data Memory dan Program
Memory ditambah satu fitur tambahan yaitu EEPROM Memory untuk
penyimpan data.
• Program Memory
ATMega8535 memiliki On-Chip In-System Reprogrammable Flash Memory untuk
menyimpan program. Untuk alasan keamanan, program memory dibagi menjadi
dua bagian yaitu Boot Flash Section dan Application Flash Section. Boot
Flash Section digunakan untuk menyimpan program Boot Loader, yaitu program
yang harus dijalankan pada saat AVR reset atau pertamakali diaktifkan.
Application Flash Section digunakan untuk menyimpan program aplikasi yang
dibuat user. AVR tidak dapat menjalankan program aplikasi ini sebelum
4
menjalankan program Boot Loader. Besarnya memori Boot Flash Section dapat
diprogram dari 128 word sampai 1024 word tergantung setting pada konfigurasi
bit di register BOOTSZ. Jika Boot Loader diproteksi, maka program pada
Application Flash Section juga sudah aman.
Gambar 1.2 Peta Program Memory
• Data Memory
Gambar berikut menunjukkan peta memori SRAM pada ATMega8535. Terdapat
608 lokasi address data memori. 96 lokasi address digunakan untuk
Register File dan I/O Memory sementara 512 lokasi address lainnya
digunakan untuk internal data SRAM. Register File terdiri dari 32 general
purpose working register, I/O register terdiri dari 64 register.
5
Gambar 1.3 Peta Data Memory
• EEPROM Data Memory
ATMega8535 memiliki EEPROM sebesar 512 byte untuk menyimpan data.
Lokasinya terpisah dengan system address register, data register dan control
register yang dibuat khusus untuk EEPROM.
1.3 Status Register (SREG)
Status Register adalah register yang memberikan informasi yang dihasilkan dari
eksekusi instuksi aritmatika. Informasi ini berguna untuk mencari alternatif alur
program sesuai dengan kondisi yang dihadapi.
BIT 7 6 5 4 3 2 1 0
I T H S V N Z
R/W R/W R/W R/W R/W R/W R/W R/W R/W
Initial
Value
0 0 0 0 0 0 0 0
6
Bit 7 – I : Global Interrupt Enable
Jika bit Global Interrupt Enable diset, maka fasilitas interupsi dapat dijalankan. Bit
ini akan clear ketika ada interrupt
yang dipicu dari hardware, setelah program interrupt dieksekusi, maka bit ini
harus di set kembali dengan instruksi SEI.
Bit 6 – T : Bit Copy Storage
Instruksi bit copy BLD dan BST menggunakan bit T sebagai sumber atau tujuan
dalam operasi bit.
Bit 5 – H : Half Carry Flag
Bit 4 – S : Sign Bit
Bit S merupakan hasil exlusive or dari Negative Flag N dan Two’s Complement
Overflow Flag V.
Bit 3 – V : Two’s Complement Overflow Flag
Digunakan dalam operasi aritmatika
Bit 2 – N : Negative Flag
Jika operasi aritmatika menghasilkan bilangan negatif, maka bit ini akan set.
Bit 1 – Z : Zero Flag
Jika operasi aritmatika menghaslkan bilangan nol, maka bit ini akan set.
Bit 0 – Z : Zero Flag
7
1.4 Bahasa Assembly AVR
Bahasa yang dipakai untuk memprogram mikrokontroler AVR adalah bahasa
assembly AVR atau bahasa C. Dalam buku ini semua program ditulis dalam
bahasa assembly AVR. Berikut adalah contoh sebuah program aplikasi untuk
mikrokontroler AVR :
.include “m8535def.inc”
.org 0x0000 rjmp main Inisialisasi program
main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND)
out SPH,r16 ldi r16,0xff out ddra,r16 Program utama out PortA,r16 cbi PortA,0 cbi PortA,1
stop: rjmp stop Sebuah program harus terdiri dari dua bagian, yaitu inisialisasi program dan
program utama. Inisialisasi program harus disertakan agar program utama dapat
berjalan. Berikut adalah urutan langkah inisialisasi program :
1. Menentukan jenis mikrokontroler yang digunakan dengan cara memasukkan
file definisi device (m8535def.inc) ke dalam program utama.
.include “m8535def.inc” ;
2. Menuliskan original address program, yaitu 0x0000. Kemudian dilanjutkan
dengan instruksi rjmp / relative jump ke label main. Hal ini dimaksudkan agar
program memory tidak tumpang tindih dengan data memory.
.org 0x0000 rjmp main
8
3. Menentukan isi Stack Pointer dengan address terakhir RAM (RAMEND).
Untuk ATMega8535 yaitu 0x025F. Ini dimaksudkan agar program utama mulai
ditulis setelah address terakhir RAM.
main: ldi r16,low(RAMEND) ; low byte address RAM = 5F out SPL,r16 ldi r16,high(RAMEND) ; high byte address RAM = 02 out SPH,r16
9
BAB II
Operasi Port Input Output
2.1 Register I/O
Setiap port ATMega8535 terdiri dari 3 register I/O yaitu DDRx, Portx dan PINx.
• DDRx (Data Direction Register)
Register DDRx digunakan untuk memilih arah pin. Jika DDRx = 1 maka
Pxn sebagai pin output Jika DDRx = 0
maka Pxn sebagai input.
• Portx (Port Data Register)
Register Portx digunakan untuk 2 keperluan yaitu untuk jalur output atau
untuk mengaktifkan resistor pullup.
1. Portx berfungsi sebagai output jika DDRx = 1 maka :
Portxn = 1 maka pin Pxn akan berlogika high.
Portxn = 0 maka pin Pxn akan berlogika low.
2. Portx berfungsi untuk mengaktifkan resistor pullup jika DDRx = 0 maka :
Portxn = 1 maka pin Pxn sebagai pin input dengan resistor pull up.
Portxn = 0 maka pin Pxn sebagai output tanpa resistor pull up.
Tabel 2.1 Konfigurasi Port
Catatan :
x menunjukkan nama port (A,B,C,D)
n menunjukkan nomor bit (0,1,2,3,4,5,6,7)
Nilai awal (initial value) seluruh register I/O adalah 00h.
10
• PINx (Port Input Pin Address)
Digunakan sebagai register input.
2.2 Instruksi I/O
in : membaca data I/O port ke dalam register
contoh : in r16,PinA
out : menulis data register ke I/O port
contoh : out PortA,r16
ldi : (load immediate) : menulis konstanta ke register sebelum konstanta
tersebut dikeluarkan ke I/O port
contoh : ldi r16,0xff
sbi : (set bit in I/O) : membuat logika high pada sebuah bit I/O port
contoh : sbi PortB,7
cbi : (clear bit in I/O) : membuat logika low pada sebuah bit I/O port
contoh : cbi PortB,5
sbic : (skip if bit in I/O is clear) : lompati satu instruksi jika bit I/O port dalam
kondisi clear/low
contoh : sbic PortA,3
sbis : (skip if bit in I/O is set) : lompati satu instruksi jika bit I/O port dalam kondisi
set/high
contoh : sbis PortB,3
11
Percobaan 1.1. Menghidupkan dan Mematikan LED dengan OUT
Pada percobaan berikut LED yang terhubunga pada Port C akan dihidupkan dan
dimatikan dengan menggunakan perintah OUT.
Gambar 2.1. Rangkaian LED
.include "8535def.inc" start: ldi R16,0b11111111 out DDRC,R16 ; ldi R16,0b11110000 out PortC,R16 stop: rjmp stop
Percobaan 2.2. Menghidupkan dan Mematikan LED dengan SBI dan CBI
Pada percobaan berikut sebut LED yang terhubung dengan Port C bit 0 ( PC.0 )
akan dihidupkan atau dimatikan satu bit dengan perintah SBI ( set bit IO ) dan
CBI ( Clear bit IO )
.include "8535def.inc" start: sbi DDRC,0 ;PortC, bit 0 as output cbi PORTC,0 ;send logic '0' to PortC bit 0 ; stop: rjmp stop
12
Percobaan 2.3. Menghidupkan dua buah LED
Pada percobaan berikut akan dihidupkan LED yang terhubung dengan Port C bit
0 dan bit 7 ( PortC.0 dan PortC.7 ) dengan menggunakan perintah CBI ( clear bit
IO ).
.include "8535def.inc" start: sbi DDRC,0 ;PortC, bit 0 & 7 as output sbi DDRC,7 cbi PORTC,0 ;send logic '0' to PortC bit 0 & 7 cbi PORTC,7 ; stop: rjmp stop
Percobaan 2.4. Mengedipkan LED dengan Waktu Tunda
Pada percobaan birikut akan dihidupkan dan dimatikan 8 buah LED yang
terhubung ke PORTC, secara bersamaan, dengan menggunakan instruksi OUT
Sehingga 8 buah LED akan tampak berkedip. Untuk menghasilkan efek berkedip
maka diperlukan pembuatan subrutin waktu tunda yang dibuat secara software.
.include "m8535def.inc"
.org 0x0000 ; ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ; init: ldi R16, 0b11111111 ; Make pin PC output out DDRC, R16 ; main: ldi R16, 0b00000000 ; out PORTC,R16 rcall delay ldi R16, 0b11111111 ; out PORTC,R16 rcall delay getout: rjmp main ;repaet until power removed
13
delay: ; provides some delay so that the LED is visible ; ============================= ; delay loop ; 499998 cycles: about 1/2 seconds ; ----------------------------- ; delaying 499995 cycles: ldi R29, $Ff WGLOOP0: ldi R30, $ff WGLOOP1: ldi R31, $10 WGLOOP2: dec R31 brne WGLOOP2 dec R30 brne WGLOOP1 dec R29 brne WGLOOP0 ret
Percobaan 2.5. Menghidupkan LED secara berurutan Pada percobaan ini LED yang terhubung pada PortC akan dihidupkan secara bergantian dengan mulai BIT 0 sampai BIT 7, sehingga semua LED akan hidup semua. Percobaan ini juga menyerupai percobaan 2.5. yang menggunakan subrutin waktu tunda, untuk melihat efek perubahan LED yang nyala. .include “m8535def.inc” .org 0x0000 ; ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ; ldi R16,0b11111111 out DDRC,R16 main: ldi R16,0b11111111 out PORTC,R16 rcall delay ; cbi PORTC,0 rcall delay cbi PORTC,1 rcall delay cbi PORTC,2 rcall delay cbi PORTC,3
14
rcall delay cbi PORTC,4 rcall delay cbi PORTC,5 rcall delay cbi PORTC,6 rcall delay cbi PORTC,7 rcall delay ; rjmp main ; epeat untilpower removed ☺ ; provides some delay so that the LED is visible delay: ldi R29, $20 WGLOOP0: ldi R30, $ff WGLOOP1: ldi R31, $ff WGLOOP2: dec R31 brne WGLOOP2 dec R30 brne WGLOOP1 dec R29 brne WGLOOP0 ret
2.6. Menghidupkan Secara Bergantian
Pada percobaan ini LED yang terhubung ke PORT C akan digeser ke KIRI
secara berurutan mulai BIT 0 sampai BIT 7 dengan menggunakan perintah ROL,
percobaan ini juga menggunakan subrutin waktu tunda, untuk melihat efek
pergeseran LED.
.include "m8535def.inc"
.org 0x0000 ; ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ; ldi R16,0b11111111 out DDRC,R16 ldi R16,0b11111110 sec main:
15
out PORTC,R16 rol R16 rcall delay ; rjmp main ; repaet until power removed :-) ; provides some delay so that the LED is visible delay: ldi R29, $20 WGLOOP0: ldi R30, $ff WGLOOP1: ldi R31, $ff WGLOOP2: dec R31 brne WGLOOP2 dec R30 brne WGLOOP1 dec R29 brne WGLOOP0 ret 2.7. Percobaan Pengambilan Data pada PortB Pada percobaan ini pengambilan logika 0 dan 1 dilakukan dengan menggunakan
Port B 8 buah melalui penekanan tombol push button SW1 sampai dengan SW8,
dengan harapan apabila sw ditekan maka port B akan mendapatkan logika 0,
data logika 0 akan diolah oleh mikrokontroller selanjutnya dengan menggunakan
port C maka dapat menghidupkan LED.
Gambar 2.2. Rangkaian SW
16
.include "m8535def.inc"
.org 0x0000 main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ; start: ldi R16,0b11111111 out DDRC,R16 ldi R16,0b11111111 out PORTC,R16 ; ldi R16,0b00000000 out DDRB,R16 ldi R16,0b11111111 out PORTB,R16 ; get: in R16,PINB out PORTC,R16 rjmp get
Percobaan 2.8. Menghidupkan dan mematikan LED dengan menggunakan
SW tunggal.
Pada percobaan ini SW yang digunakan adalah yang terhubung dengan
menggunakan port B bit 0, dan menghubungkan LED pada port C bit 0.
.include "m8535def.inc" .org 0x0000 main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ; start: ldi R16,0b11111111 out DDRC,R16 ldi R16,0b11111111 out PORTC,R16 ; cbi DDRB,0 sbi PORTB,0
17
; get: sbic PINB,0 rjmp ledOFF rjmp ledON ; ledOFF: sbi PORTC,0 rjmp get ledON: cbi PORTC,0 rjmp get
Latihan :
1. Jelaskan listing program berikut ini
.include "m8535def.inc"
.org 0x00 rjmp main
main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,0x00 out ddra,r16 ; PortA as input ldi r16,0xff out ddrb,r16 ; PortB as output out ddrc,r16 ; PortC as output ulang: in r16,PortA out PortB,r16 ldi r16,0x0f out PortC,r16 cbi PortC,0 sbic PortA,5 cbi PortC,1 sbi PortC,6 sbis PortA,5 sbi PortC,7 ldi r16,0x00 out PortB,r16 out PortC,r16
rjmp ulang
2. Buatlah program agar dapat membaca data pada PortC dan mengeluarkan
data tersebut pada PortA.
18
3. Buatlah program agar PortA mengeluarkan data 20h jika PortB,1 berlogika 0.
4. Buatlah program agar PortA mengeluarkan data 15h jika PortC,1 dan PortD,2
berlogika 1, selain kondisi tersebut PortA mengeluarkan data 00h.
Jawaban Latihan no 3:
.include "m8535def.inc"
.org 0x00 rjmp main
main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,0xff out ddra,r16 ; PortA as output ldi r16,0x00 out ddrc,r16 ; PortC as output out ddrd,r16 ; PortD as output ldi r16,0x00 ldi r17,0x15
ulang: sbis PortC,1 rjmp ulang1 sbis PortD,2 rjmp ulang1 out PortA,r17 rjmp ulang
ulang1: out PortA,r16 rjmp ulang
19
BAB III
Operasi Aritmatika
3.1 Operasi Aritmatika
Instruksi Aritmatika
add : Menambahkan isi dua register.
Contoh : add r15,r14 ; r15=r15+r14
adc : Menambahkan isi dua register dan isi carry flag
Contoh : adc r15,r14 ; r15=r15+r14+C
sub : Mengurangi isi dua register.
Contoh : sub r19,r14 ; r19=r19-r14
mul : Mengalikan dua register. Perkalian 8 bit dengan 8 bit menghasilkan
bilangan 16 bit yang disimpan di r0 untuk byte rendah dan di r1 untuk byte tinggi.
Untuk memindahkan bilangan 16 bit antar register digunakan instruksi movw
(copy register word)
Contoh : mul r21,r20 ; r1:r0=r21*r20
3.2 Contoh Program
• Penjumlahan
.include "m8535def.inc"
.org 0x00 rjmp main
main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,0x80 ldi r17,0x80 add r16,r17 ldi r18,0x02 adc r16,r18
here: rjmp here
20
• Pengurangan
.include "m8535def.inc"
.org 0x00 rjmp main
main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,0x09 ldi r17,0x06 sub r16,r17 ldi r17,0x03 sub r16,r17 ldi r17,0x06 sub r16,r17
here: rjmp here
• Perkalian
.include "m8535def.inc"
.org 0x00 rjmp main
main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,5 ldi r17,100 mul r16,r17 movw r17:r16,r1:r0 ; Copy r1:r0 to r17:r16
here: rjmp here • Pembagian
.include "m8535def.inc"
.org 0x00
.def drem8u =r15 ;remainder/sisa
.def dres8u =r16 ;result/hasil
.def dd8u =r16 ;dividend/yang dibagi
.def dv8u =r17 ;divisor/pembagi
.def dcnt8u =r18 ;loop counter rjmp main
21
main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi dd8u,4 ldi dv8u,2 rcall div8u
here: rjmp here ; div8u: sub drem8u,drem8u ;clear remainder and carry
ldi dcnt8u,9 ;init loop counter d8u_1: rol dd8u ;shift left dividend dec dcnt8u ;decrement counter brne d8u_2 ;if done ret ;return d8u_2: rol drem8u ;shift dividend into remainder sub drem8u,dv8u remainder = remainder - divisor brcc d8u_3 ;if result negative add drem8u,dv8u ;restore remainder clc ;clear carry to be shifted into result rjmp d8u_1 ;else
d8u_3: sec ;set carry to be shifted into result rjmp d8u_1
Latihan :
Buatlah program untuk menyelesaikan persamaan matematika berikut ini :
1. r21=r22+5
2. r21=r22-5
3. r16:r17=r21*5
4. r16:r17=(r21+5)*(r22-5)
22
BAB IV
Operasi Logika
4.1 Operasi Logika
Instruksi Logika
and : Untuk meng-and-kan dua register
Contoh : and r23,r27 ; r23=r23 and r27
andi : Untuk meng-and-kan register dengan konstanta immediate
Contoh : andi r25,0b11110000
or : Untuk meng-or-kan dua register
Contoh : or r18,r17 ; r18=r18 or r17
ori : Untuk meng-or-kan register dengan konstanta immediate
Contoh : ori r15,0xfe
inc : Untuk menaikkan satu isi sebuah register
Contoh : inc r14
dec : Untuk menurunkan satu isi sebuah register
Contoh : dec r15
clr : Untuk mengosongkan (membuat jadi nol) isi register
Contoh : clr r15 ; r15=0x00
ser : Set all bit in register. Membuat jadi satu isi register
Contoh : ser r16 ; r16=0xff
4.2 Contoh Program
• Operasi Logika
.include "m8535def.inc"
.org 0x00 rjmp main
main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,0b01110111
23
ldi r17,0b00001111 and r16,r17 ori r16,0b00001000 clr r16 inc r16 ser r16 dec r16
here: rjmp here
Latihan :
1. Buatlah program untuk memecahkan persoalan berikut :
2. Buatlah program dengan ketentuan sbb :
Jawaban no 2: .include "m8535def.inc" .org 0x00 rjmp main
main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 mulai: sbic PortA,1 ; skip if PortA,1 = 0 rjmp cek10_11 rjmp cek00_01
cek10_11: ; PortA,1=1 sbic PortA,0 ; PortA,1=1, PortA,0=0 (10) rjmp setAll ; ulang: ldi r21,10 dec r21 dec r21
24
dec r21 dec r21 dec r21 dec r21 dec r21 dec r21 dec r21 dec r21 rjmp ulang
setAll: ser r20 ser r21 rjmp mulai ;
cek00_01: ; PortA,1=0 sbis PortA,0 ; skip if PortA,0=1 rjmp clearAll ulang2: ldi r20,0 inc r20 inc r20 inc r20 inc r20 inc r20 inc r20 inc r20 inc r20 inc r20 inc r20 rjmp ulang2
clearAll: clr r20 clr r21 rjmp mulai
25
BAB V
Percabangan
5.1 Operasi Percabangan
Instruksi Percabangan
sbic (skip if bit in I/O is cleared) : Skip jika bit I/O yang diuji clear
sbis (skip if bit in I/O is set) : Skip jika bit I/O yang diuji set
sbrc (skip if bit in register is clear) : Skip jika bit dalam register yang diuji clear
cp (compare) : Membandingkan isi dua register
mov (move) : Meng-copy isi dua register
cpi (compare with immediate) :Membandingakan isi register dengan
konstanta tertentu.
breq (branch if equal) : Lompat ke label tertentu jika suatu hasil
perbandingan adalah sama.
brne (branch if not equal) : Lompat ke label tertentu jika suatu hasil
perbandingan adalah tidak sama.
rjmp (relative jump) : Lompat ke label tertentu.
rcall (relative call) : Memanggil subrutin.
ret (return) : Keluar dari sub rutin.
5.2 Contoh Program
• Operasi Percabangan
.include "m8535def.inc"
.org 0x00 rjmp main
main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 clr r16 ; r16=0x00
naik: inc r16 ; increment r16 cpi r16,5 ; r16=5 ? breq lagi ; branch to lagi if r16 = 5 rjmp naik ; jump to naik if r16 ≠ 5
26
lagi: ldi r18,5 ; r18 = 5 dec r16 ; decrement r16 cp r16,r18 ; compare r16 & r18 brne lompat ; branch to lompat if r16=r18 rjmp lagi ; jump to lagi if r16≠r18 lompat: rcall rutin1 rcall rutin2 henti: rjmp henti rutin1: mov r17,r16 ret rutin2: mov r19,r18 ret
Latihan :
Buatlah program delay dari flowchart berikut ini :