Anda di halaman 1dari 19

Laporan Praktikum

Sistem Tertanam
Modul Praktikum
Akses I/O dan Software Delay

Nama : Muhammad Ziyad Ain Nur Rafif


NPM : 2006570151
Rekan Kerja : Hendriawan Alfitodinova
Roviani Amelia
Hari : Rabu
Tanggal : 21 September 2022
Modul ke :1

Laboratorium Komputer - Departemen Fisika


Fakultas Matematika dan Ilmu Pengetahuan Alam
Universitas Indonesia
2022
1

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

Gambar 1.1. Konfigurasi Pin ATmega128


[Atmel. (n.d.). ATmega128 Datasheet.]

Universitas Indonesia
2

Mikrokontroler dapat disebut sebagai komputer kecil, karena sudah memiliki


komponen-komponen tertanam yang mendukung operasi yang menyamai komputer
pada umumnya. Tentunya mikrokontroler berbeda dengan mikroprosesor karena
mikroprosesor masih membutuhkan komponen luar tambahan untuk melakukan kerja
atau operasi tertentu yang optimal. Dan juga, mikroprosesor ini juga merupakan bagian
dari mikrokontroler. Jadi, secara umum mikrokontroler memiliki komponen CPU,
RAM, ROM, port I/O, dan timer yang sudah tertanam sehingga tidak membutuhkan
komponen tambahan.
Salah satu jenis mikrokontroler adalah ATmega128, yang merupakan
mikrokontroler AVR. AVR sendiri adalah salah satu jenis mikrokontroler yang cukup
sering digunakan untuk sistem tertanam. ATmega128 memiliki 64 pin dengan fungsi
dan tujuan yang masing-masing bisa diprogram atau diubah. Jika dilihat pada Gambar
1.1, masing-masing pin memiliki nama dan fungsi masing-masing seperti PF0 sebagai
ADC0, pin 52 dan 21 sebagai VCC, dan lainnya. Berdasarkan nama tersebut, terdapat
tujuh pin yang Bernama PA, PB, PC, hingga PG yang dapat diprogram sesuai fungsinya
atau diubah sebagai input dan output. Tujuh pin ini memiliki masing-masing 8 sub-pin
dengan pin PG hanya memiliki 5 sub-pin, dan jumlah sub-pin ini dapat diartikan
sebagai bit yang dapat dimasukkan ke port tersebut. Jadi, misal untuk pin E dapat
dimasukkan data sebesar 8-bit dalam biner.

Universitas Indonesia
3

Bahasa Assembly

Gambar 1.2. Langkah untuk Membuat Program dengan Assembly


[Mazidi, M. Ali; Naimi, Samad; Naimi, Sepehr. (2011). The AVR Microcontroller
and Embedded Systems using Assembly and C. Prentice Hall]

Bahasa assembly adalah bahasa pemrograman yang biasas digunakan untuk


mikrokontroler. Bahasa ini juga disebut dengan low-level language atau bahasa tingkat
rendah karena langsung berurusan dengan struktur internal pada CPU atau prosesor
sehingga kita juga dapat mengerti dan memahami apa yang dilakukan oleh prosesor
atau komputer secara langsung. Dengan bahasa assembly, kita bekerja dengan data
dalam satu bit atau kata pada setiap waktu. Prosesor akan menyimpan data di memori,
hal ini biasa dilakukan dengan menambahkan chip eksternal di dalam sistem sebuah
komputer. Untuk mengubah atau memanipulasi data, prosesor menggunakan register
yang ada di dalam CPU. Sebenarnya, tidak ada komputer yang “mengerti” bahasa
assembly secara langsung. Maka dari itu, dibutuhkanlah sebuah compiler yang
berfungsi untuk menerjemahkan mnemonik yang digunakan menjadi opcode yang
dapat dimengerti oleh komputer. Compiler ini disebut assembler.
Beberapa langkah untuk membuat dan memasukkan pemrograman bahasa
assembly ke mikrokontroler dapat dilihat pada Gambar 1.2. Jika dilihat awalnya kita
membuat program kode-kodenya terlebih dahulu. Untuk membuat program ini dapat

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

diterjemahkan menjadi opcode. Untuk mikrokontroler AVR, terdapat sangat banyak


mnemonik juga dengan fungsinya masing-masing. Beberapa mnemonik dasar dan
fungsinya adalah:
1) LDI (Load Immediately)
Berfungsi untuk me-load atau memasukkan angka atau data 8-bit secara
langsung ke register 16 sampai 31.
2) OUT
Berfungsi untuk menyimpan atau mengeluarkan data dari register yang sudah
disimpan ke port I/O. Biasanya mnemonik ini juga digunakan setelah LDI
untuk mendefinisikan sebuah port menjadi input ataupun output.
3) RJMP (Relative Jump)
Berfungsi untuk jump atau melompat ke alamat atau baris kode yang
ditentukan. Bisa berfungsi sebagai looping juga.
4) AND
Berfungsi sebagai operasi logika AND antara data pada dua register berbeda.
5) ADD
Berfungsi sebagai operasi penambahan biner ataupun heksa. Penambahan ini
dilakukan tanpa carry out.
6) ADC (Add with Carry)
Berfungsi sebagai operasi penambahan dengan adanya carry out.
7) ADIW (Add Immediate to Word)
Berfungsi untuk menambahkan angka secara langsung dan terus menerus
kepada pasangan register. Angka yang ditambahkan dapat diatur dengan angka
desimal.
8) SBIC (Skip if Bit is Clear)
Berfungsi untuk melompati atau men-skip satu baris kode di bawahnya jika bit-
nya clear atau 0.
9) CALL
Berfungsi untuk memanggil baris kode pada suatu alamat yang ditentukan.

Universitas Indonesia
6

10) CLR (Clear Register)


Berfungsi sesuai namanya, yaitu menghapus semua data yang ada di register.
Operasi ini dilakukan dengan melakukan operasi XOR antara register dengan
register itu sendiri.

Universitas Indonesia
7

FLOWCHART

Gambar 1.3. Flowchart Program Modul 1

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

LDI R16, HIGH(RAMEND)


OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, 0XFF
OUT DDRE, R16

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
LDI R16, 0X8
OUT PORTE, R16
CALL DELAY
LDI R16, 0X10
OUT PORTE,R16
CALL DELAY

Universitas Indonesia
9

LDI R16, 0X20


OUT PORTE, R16
CALL DELAY
LDI R16, 0X40
OUT PORTE, R16
CALL DELAY
LDI R16, 0X80
OUT PORTE, R16
CALL DELAY
RJMP MAIN

.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

Percobaan 2 – Menghentikan LED dengan Button


.INCLUDE "M128DEF.INC"
.ORG 0

LDI R16, HIGH(RAMEND)


OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, 0XFF
OUT DDRE, R16
LDI R16, 0XFF
OUT PORTA, R16
LDI R16, 0X0
OUT DDRA, R16

Universitas Indonesia
10

MAIN:
BIT0: LDI R16, 0X1
OUT PORTE,R16
CALL DELAY
SBIC PINA,0
RJMP BIT1
RJMP BIT0

BIT1: LDI R16, 0X2


OUT PORTE, R16
CALL DELAY
SBIC PINA,0
RJMP BIT2
RJMP BIT1

BIT2: LDI R16, 0X4


OUT PORTE,R16
CALL DELAY
SBIC PINA,0
RJMP BIT3
RJMP BIT2

BIT3: LDI R16, 0X8


OUT PORTE, R16
CALL DELAY
SBIC PINA,0
RJMP BIT4
RJMP BIT3

BIT4: LDI R16, 0X10


OUT PORTE,R16
CALL DELAY
SBIC PINA,0
RJMP BIT5
RJMP BIT4

Universitas Indonesia
11

BIT5: LDI R16, 0X20


OUT PORTE, R16
CALL DELAY
SBIC PINA,0
RJMP BIT6
RJMP BIT5

BIT6: LDI R16, 0X40


OUT PORTE, R16
CALL DELAY
SBIC PINA,0
RJMP BIT7
RJMP BIT6

BIT7: LDI R16, 0X80


OUT PORTE, R16
CALL DELAY
SBIC PINA,0
RJMP MAIN
RJMP BIT7

.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
12

HASIL
Percobaan 1 – Running LED dengan Delay 0.25 s

Gambar 1.4. Hasil Simulasi Percobaan 1 pada Proteus

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

Percobaan 2 – Menghentikan Running LED dengan Button

Gambar 1.5. Hasil Simulasi Percobaan 2 pada Proteus

Percobaan kedua sebenarnya adalah lanjutan dari Percobaan 1, di mana


Percobaan 1 adalah dasarnya dan untuk melakukan percobaan 1 maka ada sedikit
elemen yang ditambah. Namun, praktikan tetap mengubah arsitektur dari program
Percobaan 1 sehingga percobaan ini dapat berjalan dengan baik. Hasilnya sudah sesuai
dengan ekspektasi, di mana ketika button yang diinput ke port A dipencet, maka
running LED akan berhenti berjalan dan tetap menyala di satu LED, dan ketika dilepas
maka akan lanjut berjalan ke LED selanjutnya hingga looping kembali.

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

LDI R16, 0XFF


OUT PORTA, R16
LDI R16, 0X0
OUT DDRA, R16

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.

Gambar 1.6. Sistem Pull-up Resistor pada Mikrokontroler


[Pull-up Resistors Explained. (2017). Retrieved September 27, 2022, from
https://atmega32-avr.com/pull-resistors-explained/]

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

BIT1: LDI R16, 0X2


OUT PORTE, R16
CALL DELAY
SBIC PINA,0
RJMP BIT2
RJMP BIT1

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

 Mnemonik adalah instruksi berupa singkatan yang biasa digunakan di bahasa


Assembly
 Untuk membuat sebuah port menjadi input maka dimasukkan 0 dalam biner
atau heksa ke DDR-nya, dan sebaliknya untuk menjadi output maka
dimasukkan 1 dalam biner atau heksa ke DDR-nya
 Delay digunakan rangkaian menjadi praktis dan dapat dilihat secara kasat mata
karena siklus clock untuk menjalankan program sangat cepat
 Mnemonik SBIC dapat digunakan untuk mengatur button sehingga rangkaian
berhenti sementara, dapat digunakan sebagai interrupt sederhana.

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

LINK VIDEO YOUTUBE


Percobaan 1 - https://youtu.be/yvkjbpz-4tk
Percobaan 2 - https://youtu.be/BCDZZY4oteM
Universitas Indonesia

Anda mungkin juga menyukai