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.
1
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
2
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
3
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.
4
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
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
0
0
0
0
0
0
0
0
Value
5
0
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
6
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
7
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
8
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.
9
• 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
10
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
11
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
12
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 13
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:
14
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
15
.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 16
; 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.
17
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
18
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
19
• 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
20
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)
21
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 22
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 23
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
24
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
25
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 :
26