Pada percobaan pertama, praktikan diminta untuk membuat LED pada suatu port
mikrokontroller AVR ATmega128 menyala secara bergantian setiap beberapa waktu.
Flowchart pada Gambar 1 menjelaskan gambaran besar mengenai program yang mengatur
nyala LED tersebut.
Pada percobaan ini, praktikan memilih PORT E untuk dijadikan output yang akan
membuat LED tersebut menyala.
Karena LED pada PORT E mewakili 8 bit data pada register, maka praktikan meng-input
8 bit data pada register. Karena pembacaan 8 bit pada AVR mengikuti aturan LSB (Least
Significant Bit), maka praktikan meng-input data berbentuk biner 0B00000001 (desimal 1)
sebagai data yang di-input paling awal.
Kemudian, untuk membuat LED menyala secara bergantian, praktikan meng-input nilai
biner 0B00000010 (desimal 2) yang merupakan kelipatan 2 dari 1, lalu 0B00000100 (decimal
4) yang merupakan kelipatan 2 dari 2, dan seterusnya hingga nilai biner mencapai 0B10000000
(decimal 128). Setelah nilai biner mencapai 0B10000000, praktikan kembali meng-input nilai
0B01000000, dan seterusnya hingga nilai biner kembali ke 0B00000001. Data 8 bit ini lah
yang kemudian akan di-output dari register menuju PORT E yang kemudian akan di-display
oleh LED pada PORT E.
Supaya LED seakan menyala secara bergantian, praktikan menambah delay setelah LED
menyala. Delay yang diberikan sekitar sebesar 0,25 sekon.
Percobaan 2
Pada percobaan ini, praktikan memilih PORT B untuk dijadikan output yang akan
membuat LED menyala. Kemudian praktikan memilih PORT A untuk dijadikan input dari
tombol.
Seperti percobaan pertama, praktikan meng-input data berbentuk biner 0B00000001
(desimal 1) sebagai data yang di-input paling awal. Data tersebut akan di-output dari register
menuju PORT B yang kemudian akan di-display oleh LED.
Setelah LED menyala, program akan memeriksa apakah input di PORT A bernilai 0 yaitu
jika tombol ditekan, atau bernilai 1 yaitu ketika tombol tidak ditekan. Jika input bernilai 0,
maka program akan kembali mengeksekusi perintah sebelumnya, yaitu meng-input data biner
0B00000001, meng-output data dari register menuju PORT B, dan meng-display output. Jika
input bernilai 1, maka program akan mengeksekusi perintah setelahnya, yaitu meng-input data
biner 0B00000010, meng-output data dari register menuju PORT B, dan meng-display output.
Hal ini berlaku untuk seterusnya hingga nilai biner mencapai 0B10000000, yang dimana jika
input bernilai 0, maka program akan kembali mengeksekusi perintah sebelumnya, sedangkan
jika input bernilai 1, maka program akan mengeksekusi perintah setelahnya yaitu meng-input
data biner 0B00000001 dan meng-display data tersebut sebagai output di PORT B.
Supaya LED seakan menyala secara bergantian, praktikan menambah delay setelah LED
menyala. Delay yang diberikan sekitar sebesar 0,25 sekon.
HASIL
Percobaan 1
0B00000001 0B00000010
0B00000100 0B00001000
0B00010000 0B00100000
0B01000000 0B10000000
Tabel 1. Hasil percobaan 1 pada proteus
Pada percobaan pertama, terlihat bahwa LED menyala dari PORT E secara bergantian
dari 0B00000001 hingga 0B10000000. Kemudian, LED akan kembali menyala dengan
konfigurasi 0B01000000 hingga kembali lagi ke 0B00000001.
Percobaan 2
0B00000100 0B00010000
Keadaan tombol tidak ditekan Keadaan tombol ditekan
Tabel 2. Hasil percobaan 2 pada proteus
Pada percobaan kedua, terlihat bahwa LED terus menyala ketika tombol ditekan. Terlihat
juga bahwa LED bergantian menyala ketika tombol tidak ditekan.
PROGRAM
Percobaan 1
.INCLUDE "M128DEF.INC"
.ORG 0
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
RJMP MAIN
.ORG 0X900
BRNE DELAY_LOOP
DEC R18
BRNE OUTER_LOOP
RET
Percobaan 2
.INCLUDE "M128DEF.INC"
.ORG 0
CALL DELAY
SBIC PINA,0
RJMP MAIN2
RJMP MAIN1
CALL DELAY
SBIC PINA,0
RJMP MAIN3
RJMP MAIN2
CALL DELAY
SBIC PINA,0
RJMP MAIN4
RJMP MAIN3
MAIN4: LDI R16, 0B00001000
CALL DELAY
SBIC PINA,0
RJMP MAIN5
RJMP MAIN4
CALL DELAY
SBIC PINA,0
RJMP MAIN6
RJMP MAIN5
CALL DELAY
SBIC PINA,0
RJMP MAIN7
RJMP MAIN6
CALL DELAY
SBIC PINA,0
RJMP MAIN8
RJMP MAIN7
CALL DELAY
SBIC PINA,0
RJMP MAIN1
RJMP MAIN8
.ORG 0X900
BRNE DELAY_LOOP
DEC R18
BRNE OUTER_LOOP
RET
ANALISIS
Percobaan 1
Kode di atas adalah yang paling awal dituliskan pada program percobaan 1 dan
percobaan 2. .Include adalah directive. Directive berfungsi untuk memberikan informasi
kepada assembler terkait external source code, penyimpanan memori, dan sebagainya. .Include
adalah directive yang berfungsi untuk menentukan external source code file yang akan kita
pakai. Karena kita memakai mikrokontroler AVR ATmega128 maka file yang harus dipakai
adalah m128def.inc. Sedangkan .ORG adalah directive yang berfungsi untuk menentukan
lokasi program pada memori.
LDI (load immediately) adalah instruksi yang digunakan untuk meng-input data pada
register.
SPH (stack pointer high) dan SPL (stack pointer low) adalah register untuk mengatur
stack. Stack adalah storage dari RAM yang digunakan sementara untuk menyimpan data atau
address dari CPU. Stack digunakan karena jumlah register yang terbatas. SPH dan SPL
merupakan bagian dari stack pointer yang merupakan register 16 bit. SPH menyimpan 8 bit
tertinggi pada stack pointer sedangkan SPL menyimpan 8 bit terendah.
Kode di atas digunakan untuk menjadikan Port E sebagai output, yaitu dengan meng-
input data 0xFF pada (DDR) data direction register.
Kode di atas merupakan subroutine MAIN pada program. Kode ini merupakan
implementasi dari flowchart yang sebelumnya sudah dijelaskan. LDI R16 digunakan untuk
meng-input data biner 8 bit ke register. Pada percobaan ini praktikan menggunakan register
16. OUT PORTE digunakan untuk meng-output data dari register ke PORTE. Sedangkan
CALL DELAY digunakan untuk memanggil subroutine DELAY yang akan dijelaskan setelah
ini. Subroutine DELAY digunakan untuk menciptakan selang waktu tertentu setelah LED
menyala.
Percobaan 2
Sama seperti percobaan 1, terdapat directive .INCLUDE dan .ORG serta stack pointer
SPH dan SPL yang sudah dijelaskan sebelumnya. Pada percobaan 2, praktikan memilih PORT
B untuk dijadikan output dan PORT A untuk dijadikan input. Dengan demikian diperlukan data
0XFF untuk diinput ke register DDRB dan data 0X0 untuk diinput ke register DDRA.
Kode di atas merupakan bagian utama dari program. Program terbagi menjad 8
subroutine yaitu MAIN1 sampai MAIN8. Pada tiap subroutine MAIN terdapat instruction
yang sama. Instruction LDI dan OUT PORTB untuk menampilkan output pada LED. CALL
DELAY digunakan untuk memanggil subroutine DELAY.
PINA digunakan untuk memeriksa nilai input pada PORTA. SBIC digunakan untuk
mengambil keputusan. Jika PINA clear (bernilai 0), maka program melewatkan perintah
selanjutnya untuk dieksekusi. Jika PINA set (bernilai 1), maka program mengeksekusi perintah
selanjutnya. Pada percobaan ini, perintah setelah SBIC adalah RJMP. RJMP digunakan untuk
mengeksekusi subroutine yang dirujuk. Setelah SBIC subroutine yang dirujuk adalah
subroutine setelahnya. Barulah setelah itu RJMP merujuk pada subroutine yang sedang
berlaku.
PINA akan bernilai clear setelah tombol ditekan dan bernilai 1 jika tombol dibiarkan. Hal
ini dikarenakan adanya pull-up resistor pada tiap pin AVR.
Gambar 3. Pull-up resistor pada tiap pin AVR
[Mazidi, M. Ali; Naimi, Samad; Naimi, Sepehr (2011). The AVR Microcontroller and
Embedded Systems using Assembly and C. Prentice Hall]
Jika kita memberikan input 1, maka switch akan tertutup. Jika kita memberikan input 0,
maka switch akan terbuka. Tombol yang ditekan memberikan input 0.
Karena pada percobaan 2 diminta untuk memberikan selang waktu antara subroutine
MAIN sebesar 0,25 sekon, maka subroutine DELAY memiliki kode yang sama seperti
percobaan 1.
KESIMPULAN
1. Pada percobaan MODUL1: Akses I/O dan Software Delay kali ini praktikan
mempelajari tentang pemrograman bahasa Assembly untuk menyusun sistem
mikrokontroler ATmega128. Praktikan mempelajari struktur dari program yang
menggunakan bahasa Assembly seperti instruction, subroutine, directives, dan lain-
lain.
2. Mikrokontroler AVR ATMega128 memiliki akses Input/Output pada PORT nya.
Untuk membuat suatu PORTn menjadi output kita perlu menginput nilai 0xFF pada
register DDRn nya. Sedangkan untuk membuat suatu PORTn menjadi input kita perlu
menginput nilai 0x0 pada register DDRn nya. Pada tiap PORT di mikrokontroler AVR
ATMega128 terdapat pull-up resistor.
3. Pada bahasa Assembly, kita dapat mengatur software delay dengan mengatur lamanya
kode tereksekusi pada subroutine DELAY.
REFERENSI
[1] Mazidi, M. Ali; Naimi, Samad; Naimi, Sepehr (2011). The AVR Microcontroller and
Embedded Systems using Assembly and C. Prentice Hall
[2] ATmega128L 8-bit Atmel Microcontroller with 128KBytes In-System Programmable
Flash. (2022). Retrieved September 20, 2023, from Components101 website:
https://components101.com/microcontrollers/atmega128-8-bit-microcontroller
[3] (N.d.). 8-Bit Atmel Microcontroller with 128KBytes In-System Programmable Flash.
https://www.microchip.com/