USART (Universal Synchronous and Asynchronous Serial Receiver and Transmitter)

Blok Diagram USART terdiri dari 3 bagian yaitu:
– Clock Generator yang terdiri dari synchronization logic, baud rate generator dan XCK pin (untuk mode synchronous)
– Transmitter yang terdiri dari serial buffer, serial shift register, parity generator dan control logic yang mengatur format serial.
– Receiver yang terdiri dari data recovery, parity checker, shift register dan serial buffer.

Berdasarkan clocknya USART ATMega8535 terbagi menjadi 4 mode yaitu:
- Normal Asynchronous
- Double Speed Asynchronous
- External Clock
- Synchrononous Clock Operation
Tampak pada gambar di atas bahwa baud rate dari internal clock diatur oleh Pre Scaler yang diberi nilai dari register UBRR dan untuk external clock diatur melalui XCK pin yang disinkronkan dengan osilator dan dikondisikan oleh Edge Detector.
Untuk perhitungan nilai baudrate digunakan rumus sebagai berikut

Insialisasi USART
Sebelum digunakan USART terlebih dahulu harus diinisialisasi, hal ini dilakukan dengan memberikan nilai-nilai awal pada register-register fungsi khusus yang mengatur USART. Untuk itu terlebih dahulu kita harus mengenali register-register tersebut.

Bit 7 – RXC: USART Receive Complete
Bit ini akan set pada saat ada data yang belum terbaca dan akan clear saat data telah terbaca. Bit ini juga akan clear apabila RXEN (RX Enable) dimatikan. Bit ini juga dapat membangkitkan Receive Complete Interrupt
Bit 6 – TXC: USART Transmit Complete
Bit ini akan set saat data yang ada di Transmit Shift Register terkirim keluar. Bit ini akan clear secara otomatis saat Transmit Complete Interrupt dieksekusi atau juga dapat dengan menuliskan logic 1 di posisi bit tersebut. Bit ini juga dapat membangkitkan Transmit Complete Interrupt
Bit 5 – UDRE: USART Data Register Empty
Flag ini mengindikasikan bahwa USART Data Register telah siap untuk menerima data baru. UDRE Flag juga dapat membangkitkan Data Register Empty Interrupt
Bit 4 – FE: Frame Error
Bit ini akan set apabila terjadi Framing error saat menerima data. Selalu tuliskan 0 pada bit ini saat menulis ke UCSRA
Bit 3 – DOR: Data OverRun
Bit ini akan set apabila terjadi OverRun yaitu kondisi di mana saat receive buffer penuh dan ada data baru yang akan masuk. Bit ini akan clear saat data di receive buffer dibaca. Selalu tuliskan 0 pada bit ini saat menulis ke UCSRA
Bit 2 – PE: Parity Error
Bit ini akan set apabila terdapat parity error saat menerima data dan kondisi parity checking UPM1=1. Bit ini akan clear saat receive buffer (UDR) dibaca. Selalu tuliskan 0 pada bit ini saat menulis ke UCSRA
Bit 1 – U2X: Double the USART Transmission Speed
Bit ini berfungsi untuk menggandakan kecepatan baudrate USART dengan menuliskan logika 1 pada bit ini maka baudrate akan dikali 2
Bit 0 – MPCM: Multi Processor Communication Mode
Bit ini berfungsi untuk komunikasi multiprocessor, apabila bit ini set maka data yang masuk di USART akan diabaikan apabila tidak memiliki informasi alamat yang sesuai

Bit 7 – RXCIE: RX Complete Interrupt Enable
Dengan menuliskan logika 1 pada bit ini maka RX Complete Interrupt akan aktif saat RXC Flag aktif dan Global Interrupt Flag di SREG aktif
Bit 6 – TXCIE: TX Complete Interrupt Enable
Dengan menuliskan logika 1 pada bit ini maka TX Complete Interrupt akan aktif saat TXC Flag aktif dan Global Interrupt Flag di SREG aktif
Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable
Dengan menuliskan logika 1 pada bit ini maka Data Register Empty Interrupt akan aktif saat Data Register kosong dan Global Interrupt Flag di SREG aktif
Bit 4 – RXEN: Receiver Enable
Dengan menuliskan logika 1 pada bit ini maka Receiver di pin RXD akan aktif
Bit 3 – TXEN: Transmitter Enable
Dengan menuliskan logika 1 pada bit ini maka Transmitter di pin TXD akan aktif
Bit 2 – UCSZ2: Character Size
Bit ini akan dikombinasi dengan UCSZ1 dan UCSZ0 untuk mengatur ukuran data bit dalam satu frame pada transmitter atau receiver
Bit 1 – RX8: Receive Data Bit 8
Bit ini adalah data bit ke 9 pada komunikasi 9 bit dan akan terbaca lebih dahulu sebelum membaca low bit pada UDR
Bit 0 – TX8: Transmit Data Bit 8
Bit ini adalah bit ke 9 pada komunikasi 9 bit dan harus dituliskan terlebih dahulu sebelum menuliskan low bit pada UDR

Bit 7- URSEL: Register Select
Bit ini harus diset 1 pada saat akan menuliskan data pada UCSRC
Bit 6 – UMSEL: USART Mode Select
Bit ini berfungsi untuk mengatur mode USART, 0 = Asynchronous dan 1 = Synchronous

Bit 5:4 – UPM1:0 Parity Mode
Bit ini berfungsi untuk mengatur mode parity USART sesuai tabel berikut

Bit 3 – USBS: Stop Bit Select
Logika 0 pada bit ini untuk 1 stop bit dan logika 1 pada bit ini untuk 2 stop bit
Bit 2:1 – UCSZ1:0 Character Size
Bit ini dikombinasi dengan UCSZ2 pada UCSRB dan berfungsi untuk mengatur ukuran data dalam satu frame sesuai pada tabel berikut
Bit 0 – UCPOL: Clock Polarity
Bit ini berfungsi untuk mengatur polaritas XCK dan hanya digunakan pada mode Synchronous, untuk Mode Asynchronous sebaiknya dituliskan 0 pada bit ini.

Contoh program dibawah ini digunakan untuk komunikasi data serial asynchronous dengan baud rate 9600 bps. Karena menggunakan crystal 20 MHz maka agar diperoleh error terkecil maka digunakan mode Double Speed Asynchronous Operation dengan perhitungan baudrate sebagai berikut:
Baud = fosc / (8 * (UBRR+1))
9600 = 20000000 / (8*(UBRR+1))
8*(UBRR+1) = 20000000/9600 = 2083,3
UBRR+1= 2083,3/8 = 260,4
UBRR = 260,4-1 = 259,4 atau dalam hexa 0x103
Oleh karena itu Register UBRRH diisi 01 dan UBRRL disi 03
Listing 4.1
#include<avr/io.h>
#include<util/delay.h>
#define FOSC 20000000 //Dari deklarasi ini akan diperoleh nilai
#define BAUD 9600 //MYUBRR = 259 atau 0x103h
#define MYUBRR FOSC/8/BAUD-1 //
void USART_INIT(unsigned int baud){
UBRRH=(unsigned char)(baud>>8);
UBRRL=(unsigned char)(baud);
UCSRA=0x02;
UCSRB=(1<<RXEN|1<<TXEN);
UCSRC=(1<<USBS|3<<UCSZ0|1<<URSEL);
}
void USART_Transmit(unsigned char data){
while(!(UCSRA&(1<<UDRE)));
UDR=data;
}
unsigned char USART_Receive (void){
while(!(UCSRA&(1<<RXC)));
return(UDR);
}
int main (void){
unsigned char data_serial;
USART_INIT(MYUBRR);
while(1){
data_serial=USART_Receive();
USART_Transmit(data_serial);
}
}
Pada program di atas, semua data yang diterima di USART Receiver (RXD) akan dikirimkan kembali ke USART Transmitter (TXD). Dengan menghubungkan port USART ATMega8535 ke DU-232 (Delta USB to Serial 232) maka semua data yang dikirimkan melalui Port USB PC lewat layar dump terminal akan ditampilkan kembali ke layar.
DELTA ELECTRONIC
Paulus Andi Nalwan, ST