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