Anda di halaman 1dari 20

LAPORAN PRAKTIKUM MIKROKONTROLER

INTERRUPTS

Hasna Azhar Fauziyyah Amani NIM 161344013

Tanggal Percobaan : Jum’at, 5 Oktober 2018

Penyerahan Laporan : Jum’at, 12 Oktober 2018

Ferry Satria , BSEE., MT

Rahmawati Hasanah, S.ST. M.T

POLITEKNIK NEGERI BANDUNG

D4 – Teknik Telekomunikasi 3NK

Teknik Elektro

2018
HASNA AZHAR 12 OKTOBER 2018
FAUZIYYAH AMANI MIKROPROSESSOR
INTERRUPT FERRY SATRIA , BSEE., MT
3TNK RAHMAWATI HASANAH ,
S.ST. M.T

A. PENDAHULUAN
ATMega8535 merupakan salah satu mikrokontroler 8 bit buatan Atmel untuk
keluarga AVR yang diproduksi secara masal pada tahun 2006. AVR ATMega8535
memiliki ruang pengalamatan memori data dan memori program yang terpisah. Memori
data terbagi manjadi 3 bagian, yaitu 32 buah register umum, 64 buah regisrter I/O, dan 512
byte SRAM internal.
Register keperluan menempati space data pada alamat terbawah, yaitu $00 sampai
$1F. Sementara itu, register khusus untuk menangani I/O dan kontrol terhadap
mikrokontroler menempati 64 alamat berikutnya, yaitu mulai dari $20 hingga $5F. Register
tersebut merupakan register yang khusus digunakan untuk mengaur fungsi terhadap
berbagai peripheral mikrokontroler, seperti kontrol register, timer/counter, fungsi-fungsi
I/O, dan sebagainya. Alamat memori berikutnya digunakan untuk SRAM 512 byte, yaitu
pada lokasi $60 sampai dengan $25F. Konfigurasi memori data ditunjukkan pada gambar
di bawah ini.

Register Umum Alamat

R0 $0000
R1 $0001
…... …..

R30 $001E
R31 $001F RAMEND

Register I/O

$00 $0020
$01 $0021
…... …..

$3E $005E
$3F $005F

SRAM Internal

$0060
$0061
…..

$025E
$025F RAMEND

Hasna Azhar Fauziyyah Amani 1


SREG (Status Register)

Digunakan untuk menyimpan informasi dan hasil operasi aritmatika terakhir. Data
SREG selalu berubah setiap instruksi atau operasi pad ALU dan datanya tidak otomatis
tersimpan apabila terjadi instruksi percabangan baik karena interupsi maupun lompatan.

a) Bit 7 – I : Global interrupt enable


Bit I digunakan untuk mengaktifkan interupsi secara umum (interupsi global). Jika bit
I bernilai ‘1’ maka interupsi secara umum aktif, tetapi jika ‘0’ maka tidak satupun
interupsi yang aktif.
b) Bit 6-T : Bit Copy Storage
Instruksi BLD dan BST menggunakan bit-T sebagai sumber atau tujuan dalam operasi
bit. Suatu bit dalam sebuah register GPR dapat disalin ke bit T menggunakan instruksi
BTS, dan sebaliknya bit-T dapat disalin kembali ke suatu bit dalam register GPR
menggunakan instruksi BLD.
c) Bit 5-H : Half Carry Flag
Half Carry Flag adalah carry out yang berasal dari bit ke 3 dan bit ke 4. Digunakan
untuk operasi BCD. H=1 jika ada carry out dari bit ke 3 pada penjumlahan, atau borrow
in pada bit 3 pada pengurangan. Half carry flag H digunakan pada operasi bilangan
BCD (Binary Coded Desimal).
d) Bit 4-S : Sign Bit
Bit-S merupakan hasil operasi XOR antara Flag-N (negatif) dan flag V (komplemen
dua overflow).
e) Bit 3-V : Two’s Complement Overflow Flag
Overflow flag digunakan operasi aritmatika bilangan bertanda. Overflow flag V = 1
jika terjadi signed overflow. Dan sebaliknya adalah v = 0.
f) Bit 2-N : Negative Flag
Apabila suatu operasi menghasilkan bilangan negatif, maka flag-N akan di-set; yang
menunjukan hasil negatif jika kita menggunakan signed interpretation N = 0 jika bit
MSB = 0.

Hasna Azhar Fauziyyah Amani 2


g) Bit 1-Z : Zero Flag
Bit akan di-set bila hasil operasi yang diperoleh adalah nol. Z = 1 jika hasil operasi
adalah 0, dan Z = 0 jika tidak sama dengan nol.
h) Bit 0-C : Carry Flag
Apabila suatu operasi menghasilkan carry, maka bit akan di-set. Carry flag juga
dipengaruhi oleh operasi pergeseran (shift) and rotasi (rotate).

B. TUJUAN
- Mahasiswa dapat mengetahui dan memahami pengoperasian Software AVR Studio 4
- Mahasiswa dapat membuat program dengan menggunakan program interrupt menggunakan
AVR Studio 4 Simulator.

C. LANGKAH KERJA
1. Setelah menginstall AVR Studio 4 Simulator, maka buka aplikasi AVR Studio
2. Lalu akan muncul tampilan sebagai berikut :

3. Pilih New Project – Atmel AVR Assembler lalu isikan Project Name nya.

Hasna Azhar Fauziyyah Amani 3


4. Pilih Finish kemudian isikan dengan program yang akan kita rancang

D. ANALISA
1. Buat program untuk menampilkan 2 karakter secara bergantian yang
dikendalikan melalui tombol interrupt INT0. H, P pada lokasi 7F.

PROGRAM KE – 1
.include "m8535def.inc" Analisa :
.org 0x00 .include"m8535def.inc" Assembler directive ini berfunsi untuk
rjmp main menunjukan bahwa prosesor yang digunakan adalah ATMega8535.
.org 0x0000 Assembler directive ini berfunsi untuk menunjukan alamat
.org 0x001 ;alamat awal (origin)
interrupt INT0 rjmp main relative rump berfungsii untuk menunjukan main program
rjmp int_0
.org 0x001 Assembler directive ini berfunsi untuk menunjukan alamat
main : awal (origin) pada interrupt 0 yaitu 001
ldi r16,low(ramend) rjmp int_0 relative rump berfungsii untuk menunjukan subrutin int_0
out spl,r16
ldi r16,high(ramend) ldi r16,low(ramend)
out sph,r16 out spl,r16
ldi r16,high(ramend)
;Set semua interupts out sph,r16
disable Berfungsi untuk melakukan set stack pointer dengan mengisi alamat
cli pada RAM Area yaitu RAMend (low byte ada high byte)

Hasna Azhar Fauziyyah Amani 4


ldi r24,0b00000000
out gicr,r24 Mula-mula gerbang interrupt ditutup sehingga dilakukan disable pada
interrupt agar pada selanjutnya interrupt dapat siap digunakan yaitu
; set port b dan port c dengan menggunakan perintah CLI (Clear Interrput).
sebagai output Kemudian register GICR diisi dengan nol dengan cara mengisi nilai nol
ldi r17,0xFF pada register r24 lalu diisikan pada GICR dengan perintah out gicr, r24.
out ddrb,r17 Register r17 diisi dengan FF lalu dimasukan ke port b dan port c
out ddrc,r17 menggunakan perintah out ddrb,r17 dan out ddrc,r17 yang dimana out
berfungsi untuk menyimpan dari register ke I/O Location. FF untuk
; set GICR mengatur port sebagai output sedangkan 00 untuk mengatur port sebagai
ldi r17, 0b01000000 input.
;int0
out gicr, r17 GICR (Genereal Interrupt Control Register) adalah register yang
dimana berfungsi untuk mengatur interrupt yang akan digunakan, untuk
; set MCUCR melakukan enable pada interrupt, bit nya diisi dengan 1 dan untuk
ldi r17,0b00000011 ;sisi disable diisi dengan 0. Pada soal ini kita menggunakan interrupt 0
naik sehingga yang diisikan adalah pada bit 6.
out mcucr,r17 7 6 5 4 3 2 1 0
INT1 INT0 INT2 - - - IVSEL IVCE
ldi r18,0xF7
out portb,r18 MCUCR (MCU Control Register) adalah register yang dimana
berfungsi untuk mengatur clock yang masuk.
ldi r20,0; 7 6 5 4 3 2 1 0
SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00
sei ; set interupts Apabila menggunakan interrupt 0, maka yang digunakan adalah ISC01
dan ISC00 yaitu pada bit 1 dan bit 0, karena yang ingin diatur adalah
lup: pada sisi naik, maka pada ISC01 dan ISC00 diisi dengan 11.
mov r21,r20
asr r21 Kemudian memasukan posisi digit yang diinginkan yaitu pada F7
brcs lup1 dengan mengisikan register r21 dengan F7 lalu dipindahkan ke portb.

ldi r21,0x8C FE FD FB F7 E7 DF BF 7F
out portc,r21
rcall delay Kemudian r20 berfungsi sebagai status ganjil dan genap untuk mengatur
rjmp lup kapan muncul huruf H dan P.

Hasna Azhar Fauziyyah Amani 5


lup1: Kemudian interrupt siap digunakan sehingga lakukan set interrupt
ldi r21,0x89 dengan perintah sei.
out portc,r21 Pada label lup, pindahkan isi register r20 yang dimana akan menyimpan
rcall delay status ke r21. Kemudian perintah asr (Arithmatic Shift Right) yang
rjmp lup dimana berfungsi menggeser 1 bit kekanan kemudian bit paling kanan
disimpan di carry flag agar mengecek bahwa bilangan tersebut ganjil
delay: atau genap, apabila ganjil maka bit paling kanan adalah 1 sedangkan
cli apabila genap maka bit paling kanan adalah 0. Kemudian BRCS (Branch
ldi r25,0X22 if Carry Set) ke lup1 yang dimana menampilkan huruf H.

loop0: Kemudian mengatur agar karakter yang ditampilkan


ldi r26,0x00 adalah karakter H dan P, sehingga port c diisi
dengan kode karakter yang mewakili karakter H dan
loop1: P pada 7 segment.
ldi r27,0x00 Urutan biner pada 7 segment :
h g f e d c b a
loop2: 7 segment terbagi menjadi 2 yaitu untuk yang anoda dan katoda. Pada
dec r27 anoda sisi yang aktif ada bit “0” dan sisi yang tidak aktif adalah “1”.
brne loop2 Sedangkan pada katoda sisi yang aktif ada bit “1” dan sisi yang tidak
dec r26 aktif adalah “0”.
brne loop1 Dalam membuat karakter H agar dapat ditampilkan di 7 segment anoda,
dec r25 maka karakter yang harus dimasukan adalah 1000 1001 (89) dan
brne loop0 karakter P agar dapat ditampilkan di 7 segment anoda, maka karakter
sei yang harus dimasukan adalah 1000 1100 (8C)
ret
Kemudian menggunakan subrutin delay, pada subrutin delay perlu diatur
int_0: GICR agar tidak berubah nilainya sehingga perlu di set kembali.
inc r20 Pada subrutin int_0 yaitu melakukan increment r20 dan reti (return
reti interrupt)
Hasil program ATMega8535 menggunakan simulator proteus yang menampilkan karakter H dan P.

Hasna Azhar Fauziyyah Amani 6


2. Buat program untuk menampilkan 4 karakter secara bergantian posisi digit D2
dikendalikan melalui interupt 0, N C 1 6

PROGRAM KE – 2
.include "m8535def.inc" Analisa :
.org 0x00 .include"m8535def.inc" Assembler directive ini berfunsi untuk
rjmp main menunjukan bahwa prosesor yang digunakan adalah ATMega8535.
.org 0x0000 Assembler directive ini berfunsi untuk menunjukan alamat
.org 0x001 ;alamat awal (origin)
interrupt INT0 rjmp main relative rump berfungsii untuk menunjukan main program
rjmp int_0
.org 0x001 Assembler directive ini berfunsi untuk menunjukan alamat
main : awal (origin) pada interrupt 0 yaitu 001
ldi r16,low(ramend) rjmp int_0 relative rump berfungsii untuk menunjukan subrutin int_0
out spl,r16
ldi r16,high(ramend) ldi r16,low(ramend)
out sph,r16 out spl,r16
ldi r16,high(ramend)
loop: out sph,r16
;Set semua interupts Berfungsi untuk melakukan set stack pointer dengan mengisi alamat
disable pada RAM Area yaitu RAMend (low byte ada high byte)
cli
ldi r24,0b00000000 Mula-mula gerbang interrupt ditutup sehingga dilakukan disable pada
out gicr,r24 interrupt agar pada selanjutnya interrupt dapat siap digunakan yaitu
dengan menggunakan perintah CLI (Clear Interrput).
; set port b dan port c
sebagai output Kemudian register GICR diisi dengan nol dengan cara mengisi nilai nol
ldi r17,0xFF pada register r24 lalu diisikan pada GICR dengan perintah out gicr, r24.
out ddrb,r17 Register r17 diisi dengan FF lalu dimasukan ke port b dan port c
out ddrc,r17 menggunakan perintah out ddrb,r17 dan out ddrc,r17 yang dimana out
berfungsi untuk menyimpan dari register ke I/O Location. FF untuk
; set GICR mengatur port sebagai output sedangkan 00 untuk mengatur port sebagai
ldi r17, 0b01000000 input.
;int0
out gicr, r17 GICR (Genereal Interrupt Control Register) adalah register yang
dimana berfungsi untuk mengatur interrupt yang akan digunakan, untuk

Hasna Azhar Fauziyyah Amani 7


; set MCUCR melakukan enable pada interrupt, bit nya diisi dengan 1 dan untuk
ldi r17,0b00000011 ;sisi disable diisi dengan 0. Pada soal ini kita menggunakan interrupt 0
naik sehingga yang diisikan adalah pada bit 6.
out mcucr,r17 7 6 5 4 3 2 1 0
INT1 INT0 INT2 - - - IVSEL IVCE
ldi r18,0xDF
out portb,r18 MCUCR (MCU Control Register) adalah register yang dimana
berfungsi untuk mengatur clock yang masuk.
ldi r20,0; 7 6 5 4 3 2 1 0
SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00
sei ; set interupts Apabila menggunakan interrupt 0, maka yang digunakan adalah ISC01
dan ISC00 yaitu pada bit 1 dan bit 0, karena yang ingin diatur adalah
lup: pada sisi naik, maka pada ISC01 dan ISC00 diisi dengan 11.
mov r21,r20
cpi r21,$00 Kemudian memasukan posisi digit yang diinginkan yaitu pada DF
breq lup1 dengan mengisikan register r21 dengan DF lalu dipindahkan ke portb.

cpi r21,$01 FE FD FB F7 E7 DF BF 7F
breq lup2
Kemudian r20 berfungsi sebagai status kapan muncul karakter N, C, 1
cpi r21,$02 dan 6.
breq lup3 Kemudian interrupt siap digunakan sehingga lakukan set interrupt
dengan perintah sei.
cpi r21,$03
breq lup4 Pada label lup, pindahkan isi register r20 yang dimana akan menyimpan
status ke r21. Lakukan perintah compare r21 terhadap nilai $01, $02,
lup1: $03 dan $04 apabila nilainya 1 maka akan menampilkan karakter N,
ldi r21,0xC8 apabila nilainya 2 maka akan menampilkan karakter C, apabila nilainya
out portc,r21 3 maka akan menampilkan karakter 1 dan apabila nilainya 4 maka akan
rcall delay menampilkan karakter 6.
rjmp lup Kemudian mengatur agar karakter yang ditampilkan adalah karakter N
C 1 6, sehingga port c diisi dengan kode karakter yang mewakili
lup2: karakter N, C, 1 dan 6 pada 7 segment.
ldi r21,0xC6 N = 1100 1000 (C8)
out portc,r21 C = 1100 0110 (C6)
rcall delay 1 = 1111 1001 (F9)

Hasna Azhar Fauziyyah Amani 8


rjmp lup 6 = 1000 0010 (82)
Urutan biner pada 7 segment :
lup3: h g f e d c b a
ldi r21,0xF9
out portc,r21
rcall delay
rjmp lup

lup4:
Rjmp loop berfungsi agar terus melakukan looping sehingga apabila
ldi r21,0x82
telah menampilkan 6 maka akan kembali menampilkan karakter N.
out portc,r21
rcall delay
Kemudian menggunakan subrutin delay, pada subrutin delay perlu diatur
rjmp lup
GICR agar tidak berubah nilainya sehingga perlu di set kembali.

rjmp loop
Pada subrutin interrupt, int_0 dilakukan increment pada status yang
disimpan pada r20, kemudian lakukan compare terhadap 4 kondisi yang
delay:
telah dijelaskan sebelumnya, apabila nilainya kurang dari 4 maka akan
cli
kembali ke program utama dengan menggunakan perintah reti (return
ldi r25,0X22
interrupt) sedangkan apabila nilainya lebih dari 4 maka akan di reset
kembali dan diisi dengan 00.
loop0:
ldi r26,0x00

loop1:
ldi r27,0x00

loop2:
dec r27
brne loop2
dec r26
brne loop1
dec r25
brne loop0
sei
ret

Hasna Azhar Fauziyyah Amani 9


int_0:
inc r20
cpi r20,$04
brlo reset
ldi r20,0

reset:
reti
Hasil program ATMega8535 menggunakan simulator proteus yang menampilkan karakter NC16

3. Buat program untuk menampilkan Upcounter Modulo 10 Desimal, yang


perubahan inputnya diatur interrupt 1 sisi naik ditampilkan di D7 yang dimana
baru berubah setelah menekan tombol interupt

PROGRAM KE – 3
.include"m8535def.inc" Analisa :
.org 0x00 .include"m8535def.inc" Assembler directive ini berfunsi untuk
rjmp main menunjukan bahwa prosesor yang digunakan adalah ATMega8535.
.org 0x0000 Assembler directive ini berfunsi untuk menunjukan alamat
.org 0x02 awal (origin)
rjmp int_1 rjmp main relative rump berfungsii untuk menunjukan main program

main: .org 0x002 Assembler directive ini berfunsi untuk menunjukan alamat
ldi r16,low(ramend) awal (origin) pada interrupt 1 yaitu 002
out spl,r16 rjmp int_1 relative rump berfungsii untuk menunjukan subrutin int_1
ldi r16,high(ramend)
out sph,r16 ldi r16,low(ramend)
out spl,r16
cli ldi r16,high(ramend)

Hasna Azhar Fauziyyah Amani 10


ldi r17,0x00 out sph,r16
out gicr,r17 Berfungsi untuk melakukan set stack pointer dengan mengisi alamat
pada RAM Area yaitu RAMend (low byte ada high byte)
ldi r17,0x0C
out mcucr,r17 Mula-mula gerbang interrupt ditutup sehingga dilakukan disable pada
interrupt agar pada selanjutnya interrupt dapat siap digunakan yaitu
ldi r17,0xFF dengan menggunakan perintah CLI (Clear Interrput).
out ddrb,r17
out ddrc,r17 Kemudian register GICR diisi dengan nol dengan cara mengisi nilai nol
pada register r17 lalu diisikan pada GICR dengan perintah out gicr, r17.
ldi r17,0xFE
out portb,r17 MCUCR (MCU Control Register) adalah register yang dimana
berfungsi untuk mengatur clock yang masuk.
ldi r17,0x80 7 6 5 4 3 2 1 0
out gicr,r17 SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00
Apabila menggunakan interrupt 1, maka yang digunakan adalah ISC11
ldi r20,0 dan ISC10 yaitu pada bit 3 dan bit 2, karena yang ingin diatur adalah
pada sisi naik, maka pada ISC11 dan ISC10 diisi dengan 11.
ldi zl,low(2*mem)
ldi zh,high(2*mem) Register r17 diisi dengan FF lalu dimasukan ke port b dan port c
menggunakan perintah out ddrb,r17 dan out ddrc,r17 yang dimana out
ldi r28,0 berfungsi untuk menyimpan dari register ke I/O Location. FF untuk
sei mengatur port sebagai output sedangkan 00 untuk mengatur port sebagai
input.
lup0:
mov r21,r20 Kemudian memasukan posisi digit yang diinginkan yaitu pada FE
cp r21,r28 dengan mengisikan register r21 dengan FE lalu dipindahkan ke portb.
breq lup1
rjmp lup0 FE FD FB F7 E7 DF BF 7F

lup1: GICR (Genereal Interrupt Control Register) adalah register yang


lpm r16,z dimana berfungsi untuk mengatur interrupt yang akan digunakan, untuk
out portc,r16 melakukan enable pada interrupt, bit nya diisi dengan 1 dan untuk
rcall delay disable diisi dengan 0. Pada soal ini kita menggunakan interrupt 1
rjmp lup0 sehingga yang diisikan adalah pada bit 7.

Hasna Azhar Fauziyyah Amani 11


delay: 7 6 5 4 3 2 1 0
cli INT1 INT0 INT2 - - - IVSEL IVCE
ldi r25,0
Kemudian r20 berfungsi sebagai status untuk menampilkan karakter.
lup3: Kemudian inisialisasi pointer z agar mengambil data dari program
dec r25 area dengan perintah
brne lup3 ldi zl,low(2*mem)
sei ldi zh,high(2*mem)
ret
r28 di clear yang dimana berfungsi untuk status pada penggunaan
int_1: interrupt.
inc r28 Kemudian interrupt siap digunakan sehingga lakukan set interrupt
inc r30 dengan perintah sei.
inc r20
cpi r20,0x0A Pada label lup0, pindahkan isi register r20 yang dimana akan
brlo reset menyimpan status ke r21. Lakukan perintah compare r21 terhadap r28
ldi r20,0 yang dimana sebelumnya telah di clear, seperti yang dijelaskan
ldi zl,low(2*mem) sebelumnya r28 berfungsi untuk menunjukan statusnya. Apabila nilainya
ldi zh,high(2*mem) sama maka akan menampilkan karakter yang sesuai yang dimana
ldi r28,0 diambil dari program area, dengan perintah BREQ (Branch if not Equal)
ke lup1.
reset:
reti Pada label lup1, mengambil data pada program area menggunakan
perintah lpm, kemudian menampilkan outputnya pada portc, rcall delay
mem: berfungsi untuk memberikan jeda waktu antara karakter selanjutnya.
.db rjmp lup0 yang dimana looping ke lup0.
0xc0,0xf9,0xa4,0xb0,0x
99,0x92,0x82,0xf8 Kemudian menggunakan subrutin delay, pada subrutin delay perlu diatur
.db 0x80,0x98 GICR agar tidak berubah nilainya sehingga perlu di set kembali.

Pada subrutin interrupt, int_1 dilakukan increment pada status yang


disimpan pada r28 dan r20, r30 juga melakukan increment alamat
pointer z. Melakukan compare r20 dengan A. apabila nilainya kurang
dari A maka akan kembali ke program utama dengan menggunakan
perintah reti (return interrupt) sedangkan apabila nilainya lebih dari A

Hasna Azhar Fauziyyah Amani 12


maka akan di reset kembali dan diisi dengan 00 dan juga inisialisasi
kembali pointer z.
Hasil program ATMega8535 menggunakan simulator proteus yang menampilkan karakter 0-9

4. Buat program untuk menampilkan Downcounter Modulo 10 Desimal, yang


perubahan inputnya diatur interrupt 1 sisi naik ditampilkan di D0 yang dimana
baru berubah setelah menekan tombol interupt

PROGRAM KE – 4
.include"m8535def.inc" Analisa :
.org 0x00 .include"m8535def.inc" Assembler directive ini berfunsi untuk
rjmp main menunjukan bahwa prosesor yang digunakan adalah ATMega8535.
.org 0x0000 Assembler directive ini berfunsi untuk menunjukan alamat
.org 0x02 awal (origin)
rjmp int_0 rjmp main relative rump berfungsii untuk menunjukan main program

main: .org 0x002 Assembler directive ini berfunsi untuk menunjukan alamat
ldi r16,low(ramend) awal (origin) pada interrupt 1 yaitu 002
out spl,r16 rjmp int_1 relative rump berfungsii untuk menunjukan subrutin int_1

Hasna Azhar Fauziyyah Amani 13


ldi r16,high(ramend)
out sph,r16 ldi r16,low(ramend)
out spl,r16
ldi zl,low(2*mem) ldi r16,high(ramend)
ldi zh,high(2*mem) out sph,r16
ldi r26,$6A Berfungsi untuk melakukan set stack pointer dengan mengisi alamat pada
clr r27 RAM Area yaitu RAMend (low byte ada high byte)

loop: Mula-mula inisialisasi pointer z dan pointer x, inisialisasi pointer x


lpm r16,z+ merupakan alamat akhir pada data area yaitu 6A. Kemudian pada label
st -x,r16 loop, mengambil data pada program area dengan menggunakan pointer
cpi r26,$60 z dengan perintah lpm ke register. Kemudian dari register ke data area
brne loop dengan menggunakan pointer x. Pointer x menurun agar data disimpa
ada data area dalam posisi terbalik. Lakukan compare alamat data area
cli yaitu 60.
ldi r17,0x00
out gicr,r17 Mula-mula gerbang interrupt ditutup sehingga dilakukan disable pada
interrupt agar pada selanjutnya interrupt dapat siap digunakan yaitu
ldi r17,0x0C dengan menggunakan perintah CLI (Clear Interrput).
out mcucr,r17
Kemudian register GICR diisi dengan nol dengan cara mengisi nilai nol
ldi r17,0xFF pada register r17 lalu diisikan pada GICR dengan perintah out gicr, r17.
out ddrb,r17
out ddrc,r17 MCUCR (MCU Control Register) adalah register yang dimana
berfungsi untuk mengatur clock yang masuk.
ldi r17,0x7F 7 6 5 4 3 2 1 0
out portb,r17 SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00
Apabila menggunakan interrupt 1, maka yang digunakan adalah ISC11
ldi r17,0x80 dan ISC10 yaitu pada bit 3 dan bit 2, karena yang ingin diatur adalah
out gicr,r17 pada sisi naik, maka pada ISC11 dan ISC10 diisi dengan 11.

ldi r20,0 Register r17 diisi dengan FF lalu dimasukan ke port b dan port c
menggunakan perintah out ddrb,r17 dan out ddrc,r17 yang dimana out
ldi r26,$60 berfungsi untuk menyimpan dari register ke I/O Location. FF untuk
clr r27 mengatur port sebagai output sedangkan 00 untuk mengatur port sebagai
input.

Hasna Azhar Fauziyyah Amani 14


ldi r28,0
sei Kemudian memasukan posisi digit yang diinginkan yaitu pada FE
dengan mengisikan register r21 dengan FE lalu dipindahkan ke portb.
lup0:
mov r21,r20 FE FD FB F7 E7 DF BF 7F
cp r21,r28
breq lup1 GICR (Genereal Interrupt Control Register) adalah register yang
rjmp lup0 dimana berfungsi untuk mengatur interrupt yang akan digunakan, untuk
melakukan enable pada interrupt, bit nya diisi dengan 1 dan untuk
lup1: disable diisi dengan 0. Pada soal ini kita menggunakan interrupt 1
ld r16,x sehingga yang diisikan adalah pada bit 7.
out portc,r16
rcall delay 7 6 5 4 3 2 1 0
rjmp lup0 INT1 INT0 INT2 - - - IVSEL IVCE

delay: Kemudian r20 berfungsi sebagai status untuk menampilkan karakter.


cli Kemudian inisialisasi pointer z agar mengambil data dari program
ldi r25,0 area dengan perintah
ldi zl,low(2*mem)
lup3: ldi zh,high(2*mem)
dec r25
brne lup3 r28 di clear yang dimana berfungsi untuk status pada penggunaan
sei interrupt.
ret Kemudian interrupt siap digunakan sehingga lakukan set interrupt
dengan perintah sei.
int_0:
inc r28 Pada label lup0, pindahkan isi register r20 yang dimana akan
inc r26 menyimpan status ke r21. Lakukan perintah compare r21 terhadap r28
inc r20 yang dimana sebelumnya telah di clear, seperti yang dijelaskan
cpi r20,0x0A sebelumnya r28 berfungsi untuk menunjukan statusnya. Apabila nilainya
brlo reset sama maka akan menampilkan karakter yang sesuai yang dimana
ldi r20,0 diambil dari program area, dengan perintah BREQ (Branch if not Equal)
ldi r26,$60 ke lup1.
clr r27
ldi r28,0 Pada label lup1, mengambil data pada data area menggunakan perintah
ld, kemudian menampilkan outputnya pada portc, rcall delay berfungsi

Hasna Azhar Fauziyyah Amani 15


reset: untuk memberikan jeda waktu antara karakter selanjutnya. rjmp lup0
reti yang dimana looping ke lup0.

mem: Kemudian menggunakan subrutin delay, pada subrutin delay perlu diatur
.db GICR agar tidak berubah nilainya sehingga perlu di set kembali.
0xc0,0xf9,0xa4,0xb0,0x
99,0x92,0x82,0xf8 Pada subrutin interrupt, int_1 dilakukan increment pada status yang
.db 0x80,0x98 disimpan pada r28 dan r20, r26 juga melakukan increment alamat
pointer x. Melakukan compare r20 dengan A. apabila nilainya kurang
dari A maka akan kembali ke program utama dengan menggunakan
perintah reti (return interrupt) sedangkan apabila nilainya lebih dari A
maka akan di reset kembali dan diisi dengan 00 dan juga inisialisasi
kembali pointer x.
Hasil program ATMega8535 menggunakan simulator proteus yang menampilkan karakter 9-0

5. Buat program untuk menampilkan Menampilkan A-F, yang perubahan inputnya


diatur interrupt 2 sisi naik ditampilkan di D0

Hasna Azhar Fauziyyah Amani 16


PROGRAM KE – 5
.include"m8535def.inc" Analisa :
.org 0x00 .include"m8535def.inc" Assembler directive ini berfunsi untuk
rjmp main menunjukan bahwa prosesor yang digunakan adalah ATMega8535.
.org 0x0000 Assembler directive ini berfunsi untuk menunjukan alamat
.org 0x012 awal (origin)
rjmp int_2 rjmp main relative rump berfungsii untuk menunjukan main program

main: .org 0x012 Assembler directive ini berfunsi untuk menunjukan alamat
ldi r16,low(ramend) awal (origin) pada interrupt 2 yaitu 012
out spl,r16 rjmp int_2 relative rump berfungsii untuk menunjukan subrutin int_2
ldi r16,high(ramend)
out sph,r16 ldi r16,low(ramend)
out spl,r16
cli ldi r16,high(ramend)
ldi r17,0x00 out sph,r16
out gicr,r17 Berfungsi untuk melakukan set stack pointer dengan mengisi alamat pada
RAM Area yaitu RAMend (low byte ada high byte)
ldi r17,0b01000000
out mcucsr,r17 Mula-mula gerbang interrupt ditutup sehingga dilakukan disable pada
interrupt agar pada selanjutnya interrupt dapat siap digunakan yaitu
ldi r17,0xFF dengan menggunakan perintah CLI (Clear Interrput).
out ddrd,r17
out ddrc,r17 Kemudian register GICR diisi dengan nol dengan cara mengisi nilai nol
pada register r17 lalu diisikan pada GICR dengan perintah out gicr, r17.
ldi r17,0x7F
out portd,r17 MCUCSR (MCU Control Status and Register) adalah register yang
dimana berfungsi untuk mengatur enable dan disable.
ldi r17,0x20 7 6 5 4 3 2 1 0
out gicr,r17 - ISC2 - - WDRF BORF EXTRF PORF

ldi r20,0 Apabila menggunakan interrupt 2, maka yang digunakan adalah ISC2
yaitu pada bit 6, karena yang ingin di enable maka pada bit 6 diisi
ldi zl,low(2*mem) dengan 1.
ldi zh,high(2*mem)

Hasna Azhar Fauziyyah Amani 17


Register r17 diisi dengan FF lalu dimasukan ke port d dan port c
ldi r28,0 menggunakan perintah out ddrd,r17 dan out ddrc,r17 yang dimana out
sei berfungsi untuk menyimpan dari register ke I/O Location. FF untuk
mengatur port sebagai output sedangkan 00 untuk mengatur port sebagai
input.
lup0:
mov r21,r20 Kemudian memasukan posisi digit yang diinginkan yaitu pada 7F
cp r21,r28 dengan mengisikan register r17 dengan 7F lalu dipindahkan ke portd.
breq lup1
rjmp lup0 FE FD FB F7 E7 DF BF 7F

lup1:
lpm r16,z GICR (Genereal Interrupt Control Register) adalah register yang
out portc,r16 dimana berfungsi untuk mengatur interrupt yang akan digunakan, untuk
rcall delay melakukan enable pada interrupt, bit nya diisi dengan 1 dan untuk
rjmp lup0 disable diisi dengan 0. Pada soal ini kita menggunakan interrupt 1
sehingga yang diisikan adalah pada bit 5.
delay:
cli 7 6 5 4 3 2 1 0
ldi r25,0 INT1 INT0 INT2 - - - IVSEL IVCE

lup3: Kemudian r20 berfungsi sebagai status untuk menampilkan karakter.


dec r25 Kemudian inisialisasi pointer z agar mengambil data dari program
brne lup3 area dengan perintah
sei ldi zl,low(2*mem)
ret ldi zh,high(2*mem)

int_2: r28 di clear yang dimana berfungsi untuk status pada penggunaan
inc r28 interrupt.
inc r30 Kemudian interrupt siap digunakan sehingga lakukan set interrupt
inc r20 dengan perintah sei.
cpi r20,0x06
brlo reset Pada label lup0, pindahkan isi register r20 yang dimana akan
ldi r20,0 menyimpan status ke r21. Lakukan perintah compare r21 terhadap r28
ldi zl,low(2*mem) yang dimana sebelumnya telah di clear, seperti yang dijelaskan
ldi zh,high(2*mem) sebelumnya r28 berfungsi untuk menunjukan statusnya. Apabila nilainya

Hasna Azhar Fauziyyah Amani 18


ldi r28,0 sama maka akan menampilkan karakter yang sesuai yang dimana
diambil dari program area, dengan perintah BREQ (Branch if not Equal)
reset: ke lup1.
reti
Pada label lup1, mengambil data pada data area menggunakan perintah
mem: ld, kemudian menampilkan outputnya pada portc, rcall delay berfungsi
.db untuk memberikan jeda waktu antara karakter selanjutnya. rjmp lup0
0x88,0x83,0xC6,0xA1,0 yang dimana looping ke lup0.
x86,0x8E
Kemudian menggunakan subrutin delay, pada subrutin delay perlu diatur
GICR agar tidak berubah nilainya sehingga perlu di set kembali.

Pada subrutin interrupt, int_2 dilakukan increment pada status yang


disimpan pada r28 dan r20, r30 juga melakukan increment alamat
pointer z. Melakukan compare r20 dengan 6. apabila nilainya kurang
dari 6 maka akan kembali ke program utama dengan menggunakan
perintah reti (return interrupt) sedangkan apabila nilainya lebih dari 6
maka akan di reset kembali dan diisi dengan 00 dan juga inisialisasi
kembali pointer z.
Hasil program ATMega8535 menggunakan simulator proteus yang menampilkan karakter A-F

E. KESIMPULAN

Hasna Azhar Fauziyyah Amani 19