Capaian Pembelajaran

  • Memahami konsep GPIO dan konfigurasinya
  • Mampu mengkonfigurasi pin sebagai input/output
  • Membuat program kontrol LED dasar
  • Memahami konsep current limiting resistor
  • Membuat berbagai pattern LED (blink, chase, dll)

1. Konsep Dasar GPIO

GPIO (General Purpose Input/Output) adalah pin pada mikrokontroler yang dapat dikonfigurasi sebagai input atau output sesuai kebutuhan program. Setiap pin GPIO dapat membaca sinyal digital (input) atau mengirim sinyal digital (output).

Karakteristik GPIO

  • Bidirectional - Dapat sebagai input atau output
  • Digital Only - Hanya sinyal HIGH (1) atau LOW (0)
  • Configurable - Diatur melalui software
  • Voltage Levels - Biasanya 5V atau 3.3V
  • Current Limited - Arus maksimum 20-40mA per pin

Register GPIO pada AVR

Register Fungsi Contoh Keterangan
DDRx Data Direction Register DDRB, DDRC, DDRD Mengatur arah pin (0=input, 1=output)
PORTx Data Output Register PORTB, PORTC, PORTD Mengatur output level (HIGH/LOW)
PINx Data Input Register PINB, PINC, PIND Membaca status input pin
Pull-up Resistor Internal Pull-up PORTx dengan DDRx=0 Mengaktifkan pull-up internal

Tips Konfigurasi GPIO

  • Selalu set DDRx sebelum menggunakan PORTx atau PINx
  • Gunakan bit manipulation untuk kontrol individual pin
  • Untuk input, aktifkan pull-up resistor jika diperlukan
  • Perhatikan current rating untuk menghindari kerusakan

2. Simulator Kontrol LED

Simulator Kontrol LED dengan GPIO

Klik pada pin untuk mengubah konfigurasinya, lalu gunakan kontrol untuk mengatur LED

ATMega328P - PORT B

PB7
OUTPUT HIGH
PB6
OUTPUT LOW
PB5
OUTPUT HIGH
PB4
OUTPUT LOW
PB3
INPUT
PB2
INPUT
PB1
INPUT
PB0
INPUT

Kontrol LED

Pin PB5 configured as OUTPUT, currently HIGH - LED ON

Pentingnya Current Limiting Resistor

LED membutuhkan resistor pembatas arus untuk mencegah kerusakan. Tanpa resistor, arus yang mengalir akan terlalu besar dan merusak LED maupun pin mikrokontroler. Nilai resistor biasanya 220-470 ohm untuk LED standar.

3. Pemrograman LED Dasar

Program LED Blink Sederhana

blink_led.c - Program LED Berkedip
// Output akan muncul di sini Klik "Run Code" untuk mengeksekusi program

Penjelasan Kode

Bit Manipulation pada AVR

  • DDRB |= (1 << DDB5) - Set bit 5 DDRB menjadi 1 (output)
  • PORTB |= (1 << PORTB5) - Set bit 5 PORTB menjadi 1 (HIGH)
  • PORTB &= ~(1 << PORTB5) - Clear bit 5 PORTB menjadi 0 (LOW)
  • _delay_ms(500) - Delay 500 milidetik

Variasi Program LED

led_patterns.c - Berbagai Pola LED
// Pilih fungsi yang ingin dijalankan

4. LED Pattern Generator

Generator Pola LED 8-bit

200 ms

Nilai PORTB: 0x00 | Binary: 00000000

5. Best Practices GPIO Programming

Tips dan Trik Pemrograman GPIO

Praktik Terbaik

  • Initialization - Selalu inisialisasi DDRx sebelum menggunakan PORTx
  • Bit Manipulation - Gunakan operasi bit untuk kontrol individual pin
  • Pull-up Resistors - Aktifkan untuk input yang membutuhkan state default HIGH
  • Current Limiting - Selalu gunakan resistor untuk LED dan komponen output
  • Debouncing - Implementasikan software debouncing untuk input mekanis

Common Mistakes to Avoid

Kesalahan Umum

  • Lupa mengatur DDRx sebelum menggunakan pin
  • Melebihi current rating pin (max 20-40mA)
  • Tidak menggunakan resistor current limiting untuk LED
  • Menggunakan PINx register untuk output
  • Tidak implement debouncing untuk push buttons
gpio_best_practices.c - Contoh Implementasi Terbaik
#include 
#include 

// Definisi pin untuk kemudahan maintenance
#define LED_PIN     PB5
#define BUTTON_PIN  PB0

// Inisialisasi GPIO
void gpio_init() {
    // Set LED pin sebagai OUTPUT
    DDRB |= (1 << LED_PIN);
    
    // Set button pin sebagai INPUT dengan pull-up
    DDRB &= ~(1 << BUTTON_PIN);
    PORTB |= (1 << BUTTON_PIN);
}

// Fungsi debouncing sederhana
uint8_t button_pressed() {
    if (!(PINB & (1 << BUTTON_PIN))) {
        _delay_ms(50);  // Debounce delay
        if (!(PINB & (1 << BUTTON_PIN))) {
            return 1;
        }
    }
    return 0;
}

int main(void) {
    gpio_init();
    
    while(1) {
        if (button_pressed()) {
            // Toggle LED
            PORTB ^= (1 << LED_PIN);
            
            // Tunggu sampai button dilepas
            while (!(PINB & (1 << BUTTON_PIN)));
            _delay_ms(50);  // Debounce release
        }
    }
    
    return 0;
}

Latihan Praktikum

Tugas untuk menguasai pemrograman GPIO dan kontrol LED

Tugas 1: Program LED Dasar

Buat program untuk mengontrol LED dengan berbagai pola:

  • LED blink dengan periode dapat diatur
  • Running light dari kiri ke kanan dan sebaliknya
  • Binary counter 0-255 dengan LED
  • Knight rider pattern (seperti KITT car)

Tugas 2: Kontrol LED dengan Input

Implementasikan kontrol LED menggunakan push button:

  • Toggle LED dengan single button press
  • Change LED pattern dengan multiple buttons
  • Adjust LED brightness menggunakan PWM
  • Implementasikan debouncing untuk button

Tugas 3: Project Mini - Traffic Light

Buat simulasi traffic light dengan 3 LED (Merah, Kuning, Hijau):

  • Implementasikan sequence: Merah -> Merah+Kuning -> Hijau -> Kuning -> Merah
  • Tambahkan pedestrian crossing button
  • Buat timing yang dapat disesuaikan
  • Tambahkan mode blink untuk maintenance