2406416270# Tugas Pendahuluan Modul 2 Pembuat soal : AX
```text
Nama: Ahmad Malik Prasetyo
NPM: 2406416270
```
## 1. Sebutkan beberapa perbedaan dari assembly yang kalian pernah belajar pada mata kuliah OAKdengan assembly yang digunakan pada arduino (5 poin)
Assembly pada OAK adalah kode yang digunakan untuk sebuah Intel 8085/8086, sebuah microprocessor. Assembly pada arduino berbeda karena kita bekerja dengan microcontroller. Assembly yang digunakan pada arduino juga lebih modern dan dapat digunakan dengan bahasa C.
## 2. Isi tabel berikut (Ini akan mempermudah anda pada praktikum kedepannya) (15 poin)
| Register | Nama Lengkap | Fungsi | Penjelasan Bit | Contoh Pemakaian |
| :--- | :--- | :--- | :--- | :--- |
| DDRx | Data Direction Register | Mengatur arah pin sebagai Input atau Output | Bit = 0: Input, Bit = 1: Output | `SBI DDRB, 5` |
| PORTx (saat DDRx = 0) | Data Register | Mengatur sinyal pin untuk Input | DDRx Bit = 0: Floating, DDRx Bit = 1: Input dengan Pull-Up |
| PORTx (saat DDRx = 1) | Data Register | Mengatur sinyal pin untuk Output | DDRx Bit = 0: Output 0V (GND), DDRx Bit = 1: Output 5V (VCC) | `PORTA = 0xFF;` |
| PINx | Input Pin | Membaca sinyal yang dibawa dari Port | Bit = 0: Pin di bawah treshold / LOW; Bit = 1: Pin di atas threshold/HIGH | `data = PINA;` |
### Referensi:
- “ATmega328P 8-bit AVR Microcontroller with 32K Bytes In-System Programmable Flash DATASHEET.” Accessed: Feb. 08, 2026. [Online]. Available: https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf#page=60
- “AVR® MCU Digital I/O Ports - Developer Help,” developerhelp.microchip.com. https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/ioports/
- “3. Input/Output (I/O) ... | Digilab UI,” Digilabdte.com, 2026. https://learn.digilabdte.com/books/embedded-system-mbd/page/3-inputoutput-io-programming
## 3. Jelaskan Sebanyak - banyaknya Instruction Set dengan rinci pada tabel di bawah ini. (Ini akan mempermudah anda pada praktikum kedepannya) (15 poin)
| Mnemonic | Operand | Deskripsi | Contoh Pemakaian |
| :--- | :--- | :--- | :--- |
| LDI | Rd, K | Load Immediate - Memuat nilai konstanta 8-bit (K) ke register tujuan (Rd). Hanya bisa digunakan untuk register R16-R31. | `LDI R16, 0xFF` |
| ADD |Rd, Rr |menjumlahkan dua register kepada memory |ADD R1, R2 |
| SUB |Rd, Rr |pengurangan dua register kepada memory |SUB R1, R2 |
| AND |Rd, Rr |operasi AND dari dua register |AND R1, R2 |
| OR |Rd, Rr |operasi OR dari dua register |OR R1, R2 |
| MUL |Rd, Rr |perkalian dua register |MUL R1, R2 |
| JMP |label |melakukan JUMP ke alamat tertentu |JMP label |
|RCALL|label |memanggil subroutine |RCALL label|
| RET |- |kembali dari subroutine setelah dieksekusi |RET |
| CPI |Rd, k |membandingkan dua bilangan dan masukkan hasil ke flag |CPI R0, #0x05 |
| BREQ|k |melakukan branching ke alamat tertentu jika flag equal (Z) bernilai 1 |BREQ #0x100 |
| MOV |Rd, Rr |memindahkan data antar register |MOV R0, R1 |
| IN |Rd, k |membaca data dari register ke port I/O |IN R0, #0x10 |
| OUT |k, Rr |menulis data dari register ke port I/O |OUT 0x10, R0 |
| STS |k, Rr |menyimpan data ke SRAM |STS 0x10, R0 |
| ROL |Rd |memutar bit kekiri |ROL R0. |
| CBI |A, b |mengosongkan bit tertentu pada I/O |CBI 0x10, 0x01 |
| CLC |- |mengosongkan bit carry |CLC |
| SWAP|Rd |menukar posisi nibble atas dan bawah |SWAP R0 |
| ROR |Rd |memutar bit kekanan |ROR R0 |
|BREAK|- |memaksa program berhenti dan ke mode debug |BREAK |
| NOP |- |NO Operation - tidak ada instruksi |NOP |
|SLEEP|- |membuat microcontroller ke mode sleep |SLEEP |
| WDR |- |WatchDog Timer Reset - reset watchdog timer pada microcontroller |WDR |
> yes ini dari modul di gcr, sue me
### Referensi:
- “High Level Assembler and Toolkit Feature,” Ibm.com, Oct. 30, 2025. https://www.ibm.com/docs/en/hla-and-tf/1.6.0?topic=instructions-table-all-supported (accessed Feb. 08, 2026).
- “5. AVR Assembly Instru... | Digilab UI,” Digilabdte.com, 2026. https://learn.digilabdte.com/books/embedded-system-mbd/page/5-avr-assembly-instruction-set
- Digilab UI, “Modul 2 SSF_ Introduction to Assembly & I_O Programming.pdf,” Google.com, 2024. https://drive.google.com/file/d/1cpx6xfgYUv8_mlxX13FcxF_ieHUXVZaC/view?usp=classroom_web&authuser=0 (accessed Feb. 08, 2026).
## 4. Jelaskan salah satu cara untuk menerapkan delay tanpa library external, sertakan kode (5 poin)
Salah satu cara untuk mengimplementasikan delay pada Microcontroller adalah dengan membuat nested loop yang diulang sesuai dengan timing yang diinginkan. Metode ini dinamakan "Blocking Delay."
```assembly
; yes ini dari daste, again, sue me
; Delay approximately 1 second (with nested loop)
delay_1s:
LDI R18, 64 ; Outer counter
outer_loop:
LDI R24, lo8(62500) ; Inner counter low byte
LDI R25, hi8(62500) ; Inner counter high byte
inner_loop:
SBIW R24, 1 ; Subtract 16-bit counter (2 cycles)
BRNE inner_loop ; Loop if not 0 (2 cycles if taken)
DEC R18 ; Subtract outer counter
BRNE outer_loop ; Loop outer if not 0
RET
; Simple delay with single loop
delay_simple:
LDI R16, 255 ; Load counter
delay_loop:
DEC R16 ; Decrement counter (1 cycle)
BRNE delay_loop ; Branch if not zero (2 cycles)
RET ; Return (approximately 765 cycles total)
```
### Referensi:
- Electrical Engineering Essentials, “How Do You Implement Software Delays In Microcontrollers?,” YouTube, Nov. 30, 2025. https://www.youtube.com/watch?v=IEFWlmwjU18 (accessed Feb. 08, 2026).
- “7. Delay Implementatio... | Digilab UI,” Digilabdte.com, 2026. https://learn.digilabdte.com/books/embedded-system-mbd/page/7-delay-implementation-without-library
## 5. Jelaskan apa itu Memory Mapped Input Output (MMIO) dan hubungannya dengan AVR assembly yang akan kita lakukan. (5 poin)
MMIO merupakan metode dimana address dari device Input/Output dibagikan dengan memory dari device utama. Dari ini dapat diambil dua informasi yakni status device dan read/write value yang ada. Metode ini digunakan untuk mengurangi beban memory utama dan memudahkan pemrograman.
Ini dapat disambungkan dengan AVR Assembly karena I/O dalam AVR sendiri, seperti DDRx, PORTx, memiliki address yang sama dari SRAM pada Microcontroller AVR.
### Referensi:
- GeeksforGeeks, “Memory Mapped I/O and Isolated I/O,” GeeksforGeeks, Jun. 08, 2018. https://www.geeksforgeeks.org/computer-organization-architecture/memory-mapped-i-o-and-isolated-i-o/
- “Securly - Geolocation sharing,” Scribd.com, 2026. https://fr.scribd.com/doc/52568371/Memory-Mapped-IO (accessed Feb. 08, 2026).
## 6. Buatlah sebuah proyek Arduino di https://wokwi.com/ atau dengan Proteus yang dapat men-toggle (kalau sedang menyala maka akan dimatikan, dan sebaliknya) sebuah LED saat sebuah button ditekan! Proyek memiliki file .ino yang kosong dan menerapkan kode assembly di file .S. Cantumkan screenshot rangkaian yang telah kalian buat serta copas kode ke dalam TP yang memiliki Nama&NPM serta komentar pada setiap barisnya. (55 poin)

```assembly
; Ahmad Malik Prasetyo - 2406416270
; ima be real with you fam, ini kode gua refactor dari daste
; a.k.a, cuman ganti sesuai pin yang dipake
#define __SFR_OFFSET 0x00
#include "avr/io.h"
.global main
main:
SBI DDRB, 5
CBI DDRC, 0
SBI PORTC, 0
CLR R20
wait_press:
SBIC PINC, 0
RJMP wait_press
SBRC R20, 0
RJMP turn_off
turn_on:
SBI PORTB, 5
LDI R20, 1
RJMP debounce
turn_off:
CBI PORTB, 5
CLR R20
debounce:
RCALL delay
wait_release:
SBIS PINC, 0
RJMP wait_release
RCALL delay
RJMP wait_press
delay:
LDI R18, 50
d_outer:
LDI R24, lo8(10000)
LDI R25, hi8(10000)
d_inner:
SBIW R24, 1
BRNE d_inner
DEC R18
BRNE d_outer
RET
```