Sistem Tertanam
Modul Praktikum
Akses I/O dan Software Delay
MODUL 1
Akses I/O dan Software Delay
TUJUAN
Mempelajari pemrograman Bahasa Assembly untuk menyusun sistem
mikrokontroler ATmega128.
Menyusun pemrograman untuk mengakses Input/Output (I/O) pada
mikrokontroler ATmega128 dengan Bahasa Assembly.
Mempelajari konsep pemrograman software delay dalam Bahasa Assembly.
TEORI DASAR
Mikrokontroler
Universitas Indonesia
2
Universitas Indonesia
3
Bahasa Assembly
Universitas Indonesia
4
menggunakan software AVR Studio karena sudah bisa membuat dan juga meng-
compile program tanpa software lain. Setelah dibuat dan di-compile dengan assembler,
kita lihat terdapat beberapa pilihan file dari hasil program kita. Jika kita ingin
mengirimnya ke mikrokontroler yang digunakan untuk melihat hasil dari programnya,
maka kita gunakan file dengan format .hex dan men-download dengan AVR Flash.
Atau jika kita ingin mengirimnya ke EEPROM AVR, maka kita gunakan file .eep.
EEPROM sendiri adalah singkatan dari Electronically Erasable Read-Only Memory,
yang merupakan memori internal yang non-volatil dan memiliki jangka waktu hidup
yang panjang. Karena sifatnya yang non-volatil, maka meskipun tidak ada suplai daya,
data yang tersimpan akan tetap ada sampai data tersebut dihapus oleh penggunanya
sehingga memori ini sangat bagus untuk menyimpan data yang jarang berubah seperti
parameter sebuah alat.
Bahasa assembly pada dasarnya memiliki format empat kolom kata, yaitu
[label:] mnemonic [operands] ;comments
Label berfungsi sebagai alamat atau nama dari baris kode yang ingin kita buat.
Mnemonik adalah instruksi yang ingin kita lakukan dengan kode tersebut. Operands
adalah target atau nilai yang ingin kita operasikan dengan kode itu, misalnya kita ingin
memasukkan angka biner ke register 16, maka operand-nya dapat ditulis: R16, biner. Dan
bagian comment sebenarnya tidak wajib, hanya jika kita ingin menaruh komentar
tentang operasi yang dilakukan oleh kode tersebut.
Bahasa assembly sangat banyak menggunakan angka-angka bit sebagai data,
karena pin dari mikrokontroler itu sendiri dapat direpresentasikan sebagai digit bit.
Jenis bit yang digunakan bisa berupa desimal, biner, atau heksadesimal, tergantung
mnemonik yang digunakan. Untuk biner dan heksa juga memiliki format di dalam
assembly. Misal, jika ingin menaruh 15 dalam biner maka ditulis di bagian operand
dengan 0b1111. Atau jika dalam heksa ditulis dengan 0xF.
Pada bagian sebelumnya telah disebutkan kata mnemonik. Mnemonik adalah kata
yang cukup lazim digunakan di ilmu komputer, teknik, dan juga pemrograman.
Mnemonik adalah kode dan singkatan yang dapat diingat. Masing-masing
mikrokontroler memiliki mnemonik yang berbeda-beda, yang juga harus
Universitas Indonesia
5
Universitas Indonesia
6
Universitas Indonesia
7
FLOWCHART
Universitas Indonesia
8
Program yang digunakan memiliki prinsip input manual sehingga flowchart yang
digunakan cukup panjang. Dan juga karena Percobaan 2 merupakan kelanjutan dari
Percobaan 1, maka hanya satu flowchart yang dibuat karena memang prinsipnya juga
sama. Lalu, karena program akan berjalan terus secara loop dan tidak ada program
internal yang dapat menghentikan operasi, untuk menghentikannya harus langsung
mematikan hardware atau stop simulation pada software, maka tidak terminator stop
pada flowchart sehingga program akan loop terus menerus.
PROGRAM
Percobaan 1 – Running LED dengan Delay 0.25 s
.INCLUDE "M128DEF.INC"
.ORG 0
Universitas Indonesia
9
.ORG 0X900
DELAY: LDI R18, 10
OUTER_LOOP: LDI R28, LOW(3796)
LDI R29, HIGH(3796)
DELAY_LOOP: ADIW R28,1
BRNE DELAY_LOOP
DEC R18
BRNE OUTER_LOOP
RET
Universitas Indonesia
10
MAIN:
BIT0: LDI R16, 0X1
OUT PORTE,R16
CALL DELAY
SBIC PINA,0
RJMP BIT1
RJMP BIT0
Universitas Indonesia
11
.ORG 0X900
DELAY: LDI R18, 10
Universitas Indonesia
12
HASIL
Percobaan 1 – Running LED dengan Delay 0.25 s
Pada percobaan pertama, running LED dibuat dengan software Proteus untuk
skematik rangkaian dan AVR Studio 4 untuk programnya. Pada proteus digunakan bar
LED sebagai outputnya, dan dengan program yang sudah dilampirkan di atas, LED
berhasil menyala berurutan dari 1, 2, 3, hingga LED ke-8 dan akan kembali ke awal
sehingga terjadi looping. Untuk delay-nya sudah dilakukan perhitungan dan
seharusnya didapatkan angka yang benar, namun jika dilihat secara kasat mata agak
sulit sehingga diasumsikan secara sekilas bahwa delay yang didapatkan sudah sebesar
0.25 s. Setelah itu, program dimasukkan ke mikrokontroler ATmega128 dan
didapatkan hasil yang sama juga seperti di simulasi, yang dapat dilihat lebih lengkap
di video.
Universitas Indonesia
13
ANALISIS
Pada praktikum sistem tertanam ini, praktikan bekerja dengan sekelompok
untuk membuat program mikrokontrolernya. Untuk percobaan pertama adalah
membuat running LED. Pada program, yang dilakukan pertama kali adalah
mendefinisikan bahwa program dibuat untuk mikrokontroler ATmega128 dengan kode
berikut.
.INCLUDE "M128DEF.INC"
.ORG 0
Baris kode dapat diistilahkan sebagai baris kode “default” ketika kita ingin memulai
program untuk ATmega128 sehingga pasti ada untuk setiap file kode.
Universitas Indonesia
14
Setelah itu, baris kode berikutnya adalah bagian untuk mengaktifkan stack
pointer dan juga untuk mendefinisikan input dan output.
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, 0XFF
OUT DDRE, R16
Kode RAMEND di sini dimaksudkan dengan alamat terakhir pada SRAM, untuk
menyimpan data register secara sementara. SPL dan SPH adalah singkatan dari stack
pointer high dan low. Perintah ini digunakan agar stack pointer dapat menyimpan data.
Lalu, untuk mendefinisikan I/O, dalam hal ini port E sebagai output, maka pada DDRE
dimasukkan nilai 1 untuk semua pin nya. Karena port E memiliki 8 pin, maka nilai
yang dimasukkan adalah 1111 1111, atau dalam kode digunakan bilangan
heksadesimal FF. Hal ini sesuai dengan teori di mana jika kita ingin mendefinisikan
input maka bilangan 1 dimasukkan ke port target.
Bagian utama dari program yang dibuat adalah bagian MAIN, di mana baris ini
berisi perintah utama untuk rangkaian kita.
MAIN: LDI R16, 0X1
OUT PORTE,R16
CALL DELAY
LDI R16, 0X2
OUT PORTE, R16
CALL DELAY
LDI R16, 0X4
OUT PORTE,R16
CALL DELAY
Pada bagian ini, LED yang menyala langsung didefinisikan dengan bilangan heksa.
Jadi, untuk LED yang paling atas menyala, maka digunakan angka heksa 1, atau dalam
biner 0000 0001 karena ada 8-bit dan sistem port di mikrokontroler ini juga mengikuti
sistem LSB (least significant bit). Selanjutnya praktikan terus membuat kode secara
manual untuk LED kedua yang menyala, LED ketiga yang menyala, dan seterusnya
hingga LED ke delapan dengan bilangan heksa. Dan sesuai teori juga bahwa untuk
Universitas Indonesia
15
menaruh bilangan heksa pada program diperlukan prefiks 0x sehingga komputer dapat
mengidentifikasi bahwa bilangan heksa yang dimasukkan.
Pada baris kode MAIN terlihat ada perintah CALL DELAY setiap transisi LED menyala.
Instruksi ini sangat diperlukan karena ATmega memiliki frekuensi clock 10 MHz atau
10,000,000 siklus dalam satu detik. Biasanya satu perintah seperti LDI atau OUT hanya
memerlukan 1 siklus clock sehingga pada pengamatan di dunia nyata, LED yang
bergantian hampir tidak dapat terlihat secara kasat mata.
DELAY: LDI R18, 10
OUTER_LOOP: LDI R28, LOW(3796)
LDI R29, HIGH(3796)
DELAY_LOOP: ADIW R28,1
BRNE DELAY_LOOP
DEC R18
BRNE OUTER_LOOP
RET
Baris kode di atas adalah kode untuk mendapatkan delay sebesar 0.25 s. Untuk
delay ini digunakan mnemonik ADIW, yaitu untuk memasukkan data secara langsung ke
register, dalam hal ini memasukkan angka 1, dan juga BRNE atau branch of not equal.
Untuk mendapatkan delay 0.25 s maka kita ingin mikrokontroler tetap pada kondisinya
selama 2,500,000 siklus (karena total siklus setiap detik adalah 10 juta). Bagian
DELAY_LOOP dapat menghasilkan 262,145 siklus. Jumlah ini belum cukup, perlu sekitar
9.54 kali lagi DELAY_LOOP atau 10 kali lagi jika dibulatkan ke atas. Maka, dimasukkan
angka 10 ke R18 untuk mengulang DELAY_LOOP 10 kali. Karena perhitungan ini tidak
exact (ada pembulatan), pastinya ada kelebihan siklus yang dibuang oleh delay, ketika
dihitung ada 121,451 siklus yang lebih atau ada 3,796 siklus DELAY_LOOP yang terlalu
banyak dilakukan. Sehingga pada bagian OUTER_LOOP dimasukkan angka 3,796 untuk
menyesuaikan jumlah delay yang dilakukan sehingga sesuai dengan yang diinginkan.
Untuk Percobaan 2 seperti yang sudah disebutkan pada bagian sebelumnya,
program dari percobaan ini merupakan kelanjutan dari Percobaan 1, namun praktikan
tetap mengubah sedikit arsitekturnya sehingga program dapat berjalan sesuai
ekspektasi. Untuk delay yang digunakan tetap sama, 0.25 s, sehingga subroutine
DELAY tidak ada perubahan.
Universitas Indonesia
16
Baris kode di atas adalah tambahan untuk mendefinisikan port A sebagai input dari
button. Baris kode PORTA berfungsi untuk mengaktifkan pull-up resistor dari semua
port A. Pull-up resistor ini berfungsi agar port A dapat menerima input 0 dan 1 dari
button. Sistemnya dapat dilihat pada Gambar 1.5 di bawah.
Dan juga, untuk membuat seluruh port A menjadi input, maka dimasukkan nilai 0 ke
A, dalam hal ini 0000 0000 biner atau 0 heksa ke DDRA.
MAIN:
BIT0: LDI R16, 0X1
OUT PORTE,R16
CALL DELAY
SBIC PINA,0
RJMP BIT1
RJMP BIT0
Universitas Indonesia
17
Baris kode di atas adalah perintah utama untuk Percobaan 2 ini. Perbedaan
dengan program Percobaan 1 adalah di sini setiap input untuk setiap bit LED dipisah
menjadi alamatnya masing-masing, yang ditandai dengan BIT0, BIT1, dan seterusnya
hingga BIT7. Untuk mengaktifkan program button, digunakanlah mnemonik SBIC,
atau seperti yang sudah dijelaskan pada Teori Dasar adalah Skip if Bit is Clear. Jadi,
sistem dari kode ini adalah, jika ada 0 yang dimasukkan ke input, dalam hal ini dengan
button, maka kode ini akan men-skip atau melewati satu baris kode di bawahnya, bukan
satu bagian kode penuh. Misalnya, untuk SBIC pada BIT0, jika button dipencet, maka
akan menginput 0 karena adanya pull-up resistor, dan karena ada SBIC, maka baris
kode RJMP BIT1 akan dilewati dan program akan langsung ke baris kode RJMP BIT0.
Jadi, sistem pemberhentian running LED di sini jatuhnya seperti looping di LED
tersebut saat button dipencet dan ditahan. Karena RJMP BIT1 dilewati dan yang aktif
adalah RJMP BIT0, maka program akan kembali ke BIT0 sehingga LED masih tetap
di bit yang ke-nol.
Ketika button dilepas atau tidak dipencet, maka akan menginput 1 ke port input
sehingga SBIC tidak berlaku. Karena SBIC tidak berlaku maka kode RJMP BIT1 akan
dilaksanakan sehingga secara tidak langsung, program akan menuju ke bagian BIT1
yang merupakan LED setelahnya dan juga akan melewati RJMP BIT0 yang merupakan
kode untuk me-looping sehingga LED akan berjalan seperti awal. Sistem ini
diimplementasikan di setiap bit LED sehingga di mana pun kita memencet button,
maka LED akan berhenti di saat itu dan ketika dilepas akan melanjutkan running-nya,
sesuai dengan tujuan dan ekspektasi dari Percobaan 2.
Universitas Indonesia
18
KESIMPULAN
Pemrograman bahasa Assembly pada dasarnya terdiri dari tiga baris kode, yaitu
LABEL: MNEMONIC, OPERAND
REFERENSI
[1] Atmel. (n.d.). ATmega128 Datasheet.
[2] Atmel. (n.d.). AVR Instruction Sets.
[3] Camera, Dean. (2006). Using the EEPROM Memory in AVR-GCC. Retrieved
September 26, 2022, from
https://teslabs.com/openplayer/docs/docs/prognotes/EEPROM%20Tutorial.pdf
[4] Catsoulis, John. (2005). Designing Embedded Hardware. Van Duuren Media.
[5] Mazidi, M. Ali; Naimi, Samad; Naimi, Sepehr. (2011). The AVR Microcontroller
and Embedded Systems using Assembly and C. Prentice Hall.
[6] Pull-up Resistors Explained. (2017). Retrieved September 27, 2022, from
https://atmega32-avr.com/pull-resistors-explained/
[7] Subroutines and The Stack Pointer. (2018). Retrieved September 26, 2022, from
http://www.rjhcoding.com/avr-asm-functions.php