Capaian Pembelajaran

  • Memahami konsep komunikasi serial asynchronous
  • Mengkonfigurasi UART pada mikrokontroler AVR
  • Memprogram transmisi dan penerimaan data serial
  • Menghitung baud rate dan konfigurasi register
  • Mengimplementasikan komunikasi PC-mikrokontroler

1. Konsep Dasar UART

UART (Universal Asynchronous Receiver/Transmitter) adalah protokol komunikasi serial yang memungkinkan pertukaran data antara dua perangkat secara asynchronous (tidak memerlukan clock bersama).

Karakteristik UART

  • Asynchronous - Tidak memerlukan sinyal clock
  • Full-duplex - Dapat mengirim dan menerima secara bersamaan
  • Point-to-point - Komunikasi antara dua perangkat
  • Simple - Implementasi hardware yang sederhana

Frame Data UART

Bit Fungsi Deskripsi
Start Bit 1 bit Menandai awal transmisi (logika 0)
Data Bits 5-9 bit Data aktual yang dikirimkan (biasanya 8 bit)
Parity Bit 0-1 bit Deteksi error (optional)
Stop Bit(s) 1-2 bit Menandai akhir transmisi (logika 1)

2. Konfigurasi UART pada AVR

Mikrokontroler AVR memiliki hardware UART yang dapat dikonfigurasi melalui beberapa register:

Register Konfigurasi UART

  • UCSRA - USART Control and Status Register A
  • UCSRB - USART Control and Status Register B
  • UCSRC - USART Control and Status Register C
  • UBRRL/UBRRH - USART Baud Rate Register
  • UDR - USART Data Register

Kalkulator Baud Rate

Hitung nilai UBRR untuk baud rate tertentu:

Pilih parameter untuk menghitung
uart_init.c - Inisialisasi UART

#include 

#define F_CPU 16000000UL
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1

void UART_Init(unsigned int ubrr) {
    // Set baud rate
    UBRR0H = (unsigned char)(ubrr >> 8);
    UBRR0L = (unsigned char)ubrr;
    
    // Enable receiver and transmitter
    UCSR0B = (1 << RXEN0) | (1 << TXEN0);
    
    // Set frame format: 8 data bits, 1 stop bit, no parity
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}

int main(void) {
    UART_Init(MYUBRR);
    
    while(1) {
        // Program utama
    }
    
    return 0;
}
                        

3. Simulasi Komunikasi UART

Simulator Komunikasi UART

Ambil peran sebagai mikrokontroler atau PC untuk memahami aliran data

Mikrokontroler AVR

Transmitter/Receiver

TX:
Waiting...
RX:
Waiting...

Computer

Receiver/Transmitter

RX:
Waiting...
TX:
Waiting...

Visualisasi Sinyal UART

4. Contoh Program UART Lengkap

Fungsi Transmit dan Receive

uart_functions.c - Fungsi Dasar UART

#include 
#include 

// Fungsi untuk mengirim satu karakter
void UART_Transmit(unsigned char data) {
    // Tunggu sampai buffer transmit kosong
    while (!(UCSR0A & (1 << UDRE0)));
    // Masukkan data ke buffer, kirim data
    UDR0 = data;
}

// Fungsi untuk menerima satu karakter
unsigned char UART_Receive(void) {
    // Tunggu sampai data diterima
    while (!(UCSR0A & (1 << RXC0)));
    // Ambil dan return data dari buffer
    return UDR0;
}

// Fungsi untuk mengirim string
void UART_SendString(char *str) {
    while (*str) {
        UART_Transmit(*str);
        str++;
    }
}

// Contoh penggunaan
int main(void) {
    UART_Init(MYUBRR);
    char received;
    
    UART_SendString("System Ready!\r\n");
    
    while(1) {
        // Baca input dari user
        received = UART_Receive();
        
        // Echo kembali ke user
        UART_Transmit('E');
        UART_Transmit('C');
        UART_Transmit('H');
        UART_Transmit('O');
        UART_Transmit(':');
        UART_Transmit(' ');
        UART_Transmit(received);
        UART_Transmit('\r');
        UART_Transmit('\n');
    }
}
                        

Tips Penting

  • Selalu tunggu flag UDRE0 sebelum mengirim data
  • Periksa flag RXC0 sebelum membaca data received
  • Gunakan terminator (\\r\\n) untuk memudahkan parsing di PC
  • Implementasikan timeout untuk menghindari blocking infinite

5. Aplikasi UART dalam Embedded Systems

Contoh Implementasi

  • Debugging - Mengirim data status ke PC untuk monitoring
  • Configuration - Menerima konfigurasi dari user melalui serial
  • Data Logging - Mengirim data sensor ke komputer
  • Device Control - Mengontrol perangkat dari PC/tablet
sensor_monitor.c - Monitoring Sensor via UART

#include 
#include 
#include 

void UART_SendNumber(int number) {
    char buffer[10];
    itoa(number, buffer, 10); // Convert integer to string
    UART_SendString(buffer);
}

int main(void) {
    UART_Init(MYUBRR);
    int temperature = 25;
    int humidity = 60;
    
    UART_SendString("=== Sensor Monitoring System ===\r\n");
    
    while(1) {
        // Baca sensor (simulasi)
        temperature++;
        if(temperature > 35) temperature = 20;
        
        humidity--;
        if(humidity < 40) humidity = 80;
        
        // Kirim data ke PC
        UART_SendString("Temperature: ");
        UART_SendNumber(temperature);
        UART_SendString("°C, Humidity: ");
        UART_SendNumber(humidity);
        UART_SendString("%\r\n");
        
        _delay_ms(2000); // Delay 2 detik
    }
}
                        

Latihan Praktikum

Implementasikan komunikasi UART antara mikrokontroler dan PC

Tugas 1: Program Echo Sederhana

Buat program yang menerima karakter dari PC dan mengirimkannya kembali (echo):

  • Konfigurasi UART dengan baud rate 9600
  • Implementasikan fungsi receive character
  • Implementasikan fungsi transmit character
  • Buat loop utama untuk echo data
  • Test menggunakan terminal serial (Putty, Arduino Serial Monitor)

Tugas 2: Sensor Data Logger

Buat sistem monitoring yang mengirim data sensor ke PC setiap 2 detik:

  • Baca data dari sensor suhu (simulasi dengan variable)
  • Format data: "TEMP:25.5C"
  • Tambahkan timestamp: "[12:30:15] TEMP:25.5C"
  • Implementasikan command parsing dari PC
  • Response untuk command "STATUS" dengan system info