UART/USART adalah merupakan komunikasi serial. Disamping komunikasi
serial ada juga komunikasi secara paralel. Pada tahun 1980-an
komunikasi parallel mempergunakan 25 terminal dan komunikasi serial
mempergunakan 8 terminal. Diabad milineum sekarang kedua jenis
komunikasi tersebut sudah tidak populer lagi dan digantikan dengan
komunikasi serial tetapi dengan mempergunakan 3 terminal dan bahkan
konikasi serial hanya dengan mempergunakan dua terminal. Gambar 1 dan
gambar 2 adalah komunikasi parallel dan serial pada tahun 80-an.

Gambar 1. Terminal pada Komunikasi Parallel

Gambar 2. Terminal pada Komunikasi Serial
Bit
7 – RXCn: USART Receive Complete
Bit
15:12 – Reserved Bits
Gambar 1. Terminal pada Komunikasi Parallel
Gambar 2. Terminal pada Komunikasi Serial
Saat ini komunikasi serial hanya mempergunakan tiga terminal yang
terdiri dari (Rx, Tx dan GND) yang dikenal dengan nama full duplex.
Selain itu ada juga metode half duplex yang hanya mempergunakan dua
wire tetapi tetap tiga terminal, dengan Rx dan Tx mempergunakan wire
yang sama. UART/USART hanya berbeda dengan mempergunakan pulsa clock
yang sama atau tidak. Jika master membangkitkan pulsa untuk
kommunikasi maka disebut USART, tetapi jika masing masing device
membangkitkan sendiri pulsa clock maka disebut UART. Kedua metode,
UART dan USART, akan dibahas secara bersamaan
METODE
USART
Pengiriman
data serial secara UART berarti masing masing device membangkitkan
pulsa clock secara terpisah. Kecepatan clock ini menentukan
jumlah/kecepatan tranfer data atau yang dikenal dengan nama Baud
rate. Agar tidak terjadi
kesalahan membaca antara pengirim dan penerima maka kecepatan Baud
Rate pengirim dan
penerima harus sama. Jadi kalau Baud rate pengirim 4800 bps maka pada
sisi penerima harus memiliki baud rate 4800 bps.
Format
pengiriman data dengan metode UART terdiri dari idle,
Start bit, data bit, parity, dan stop bit kemudian
idle. Format pengiriman data
ini dikenal dengan nama Frame.
Keadaan Idle
dalam metode ini harus dalam kondisi High.
Start bit hanya satu bit ditandai dengan logika low. Data bit dapat 5
bit, 6 bit, 7 bit, 8 bit atau 9 bit. Parity dapat berupa even parity,
odd parity atau none (tampa parity). Stop bit harus
berlogika high dan dapat
berupa 1 bit
atau 2 bit. Jadi yang perlu dicatat pada komunikasi serial
secara UART adalah pada kedua sisi (pengirim dan penerima) harus
memiliki baud rate dan frame yang sama.
Parity
pada pengiriman ini menyesuaikan jumlah bit High pada data bit.
Artinya jika mempergunakan even parity dan data bit adalah
1-0-0-0-1-0-0-0 maka bit parity menghasilkan “0”, tetapi jika
data yang dikirimkan adalah 1-1-1-0-0-0-1-1 maka parity bit
menghasilkan “1”. Sebaliknya jika mempergunakan odd parity data
1-0-0-0-1-0-0-0 maka bit parity menghasilkan “1” dan data
1-1-1-0-0-0-1-1 maka parity bit menghasilkan “0”. Sedangkan
data yang dikirim dikodekan dalam bentuk ASCII. Contoh mengirimkan
huruf “K” dengan frame 8 data bit, even parity, dan
1 stop bit. Huruf “K” pada tabel ASCII bernilai 4B maka sinyal
pengiriman huruf “K” dengan format tersebut diperlihatkan pada
gambar 3.
Gambar 3. Bentuk Sinyal dalam pengiriman karakter “K”
Gambar 3. Bentuk Sinyal dalam pengiriman karakter “K”
Inisialisasi
USART
Sebelum
UART dipergunakan untuk komunikasi serial maka harus diinisialisasi.
Pada saat inisialisasi UART maka seluruh interrupt, yang dapat
mengendalikan UART, harus di-disable, termasuk global interrupt, yang
terdapat pada register SREG. Proses inisialisasi pada UART meliputi
pengaturan Baud rate, pengaturan format untuk frame dan
meng-enable-kan transmitter dan receiver bergantung pada kebutuhan.
Berikut adalah contoh
menginisialisasi UART.
#define
FOSC 1843200 // Clock Speed
#define
BAUD 9600
#define
MYUBRR FOSC/16/BAUD-1
void
main( void )
{
...
USART_Init(MYUBRR)
...
}
void
USART_Init( unsigned int ubrr)
{
/*Set
baud rate */
UBRR0H
= (unsigned char)(ubrr>>8);
UBRR0L
= (unsigned char)ubrr;
Enable
receiver and transmitter */
UCSR0B
= (1<
/*
Set frame format: 8data, 2stop bit */
UCSR0C
= (1<
}
USART
Transmitter di-enable dengan mensetting bit TXEN (Transmit Enable)
yang terdapat pada Register UCSRnB. Proses
pengiriman sebuah data diawali dengan mengisi buffer transmit dengan
sebuah data yang akan dikirim. Data, yang terletak pada buffer
transmit tersebut, akan dipindahkan ke shift register pada saat shift
register siap untuk mengirimkan sebuah frame yang baru.
Shift register tersebut
diisi dengan sebuah data baru jika jalur Tx berada dalam keadaan idle
atau segera setelah bit stop terakhir dari frame sebelumnya dikirim.
Berikut adalah potongan
program USART Transmit dengan mempergunakan metode polling terhadap
Data Register Empty Flag (UDREn).
void
USART_Transmit( unsigned char data )
{
/*
Wait for empty transmit buffer */
while
( !( UCSRnA & (1<
;
/*
Put data into buffer, sends the data */
UDRn
= data;
}
Fungsi
USART_Transmit mempergunakan metode menunggu buffer transmit menjadi
kosong dengan cara mengecek UDREn (USART Data Register Empty) Flag
yang terdapat pada register UCSRnA, Bila bit UDREn berubah menjadi
set menunjukkan bahwa buffer telah kosong dan siap menerima sebuah
data yang baru. Bit UDREn
tersebut diclearkan secara hardware jika buffer transmit terisi oleh
data yang akan dikirimkan tetapi belum dipindahkan ke shift register.
Sisi
Pengirim (UART Transmitter) mempunyai dua flag. Kedua flag tersebut
menunjukan keadaan (state) dari UART Transmitter tersebut. Kedua flag
pada UART transmitter, yaitu UDREn dan TXCn (Transmit Complete),
dapat juga dipergunakan untuk membangkitkan interrupt. Jika bit
UDRIEn (USART Data Register
Empty Interrupt Enable),
yang terdapat pada register UCSRnB, diset dan global interrupt juga
diset maka USART Data Register Empty Interrupt akan dijalankan ketika
UDREn berubah menjadi set.
Bit
TXCn, yang terdapat pada register UCSRnA,
diset secara hardware ketika seluruh frame, yang terdapat pada shift
register, telah dikirim sehingga buffer menjadi kosong. Bit tersebut
diclearkan secara hardware ketika vektor interrupt dari
transmit complete
dijalankan atau dapat juga diclearkan dengan cara secara software.
Jika bit TXCIEn (Transmit
Compete Interrupt Enable),
yang terdapat pada register UCSRnB, diset dan global interrupt juga
diset maka vektor interrupt dari
Transmit Complete Interrupt akan
dijalankan pada saat TXCn flag berubah menjadi set.
Sisi
penerima (receiver pin) bekerja sama seperti transmitter pin, dengan
cara bekerja kebalikan dari sisi penerima. Berikut
ini adalah potong/contoh program pada sisi penerima untuk menerima
data baru dengan mempergunakan metode polling terhadap RXCn (Receive
Complete) flag.
unsigned
char USART_Receive( void )
{
/*
Wait for data to be received */
while
( !(UCSRnA & (1<
;
/*
Get and return received data from buffer */
return
UDRn;
}
USART
Receiver dilengkapi dengan tiga error flag yaitu Frame Error (FEn),
Data Over Run (DORn), dan Parity Error (UPEn). Ketiga flag tersebut
dapat diakses melalui pembacaan register UCSRnA. Ketiga
error flag tersebut tidak dilengkapi dengan interrupt.
Frame Error (FEn) Flag clear
jika stop bit, bit yang terdapat pada frame pengiriman, terbaca
sesuai dengan format (berharga high). Jika stop bit tidak sesuau maka
bit FEn akan menjadi set. Selain itu bit Frame Error dapat
dipergunakan untuk mendeteksi kondisi Out of Synchronous,
pendeteksian break conditions dan penanganan protokol. Data
Over Run (DORn) flag menunjukkan bahwa data tidak terbaca (data loss)
karena buffer masih dalam kondisi penuh. Jika bit DORn set maka ada
satu atau lebih serial frame tidak terbaca. Bit DORn akan diclearkan
ketika frame yang diterima telah berhasil dipindahkan dari Shift
Register ke buffer receiver. Parity Error (UPEn) flag
mengindikasikan bahwa Frame pada receiver buffer mengalami parity
error. Jika Parity Check tidak diaktifkan maka bit UPEn akan selalu
terbaca clear.
Register
Register Pada USART
USART
Transmit Data Buffer Register dan USART Receive Data Buffer
Registers adalah sama atau dengan kata lain buffer Tx dan buffer
Rx adalah sama. Buffer tersebut adalah USART Data Register atau
UDRn. Buffer Transmit hanya dapat ditulis ketika bit UDREn, yang
terdapat pada register UCSRnA, berada dalam keadaan set. Saat data
diisikan ke buffer transmit, transmitter dalam keadaan enable,
Transmitter tersebut akan mengirimkan data ke Transmit Shift Register
jika Transmit Shift Register dalam keadaan kosong. Kemudian data akan
ditransmisikan secara serial melalui pin TxDn.
Bit
ini akan menjadi set ketika tidak ada lagi data yang akan dibaca pada
buffer receiver. Bit RXCn akan menjadi clear pada saat buffer
receiver dalam keadaan kosong. Jika receiver di disbale maka bit
Rxcn akan menjadi clear. Bit ini juga dapat dipergunakan untuk
membangkitkan interrupt yaitu Receive Complete interrupt.
Bit 6 – TXCn: USART Transmit Complete
Bit
ini akan menjadi set jika seluruh frame telah di transmit (shifted
out) dan tidak ada lagi data pada buffer transmit (UDRn). Bit TXCn
akan diclearkan secara hardware ketika vektor interrupt dijalankan
atau dapat diclearkan secara software. Selain itu bit ini dapat
membangkitkan interrupt yaitu Transmit Complete interrupt.
Bit 5 – UDREn: USART Data Register Empty
UDREn Flag, bit
ini dalam state high,
mengindikasikan bahwa buffer
transmit (UDRn) siap untuk menerima data berikutnya, hal ini berarti
buffer dalam keadaan kosong. Bit ini juga dapat mebangkitkan
interrupt yaitu Data
Register Empty interrupt.
Bit 4 – FEn: Frame Error
Jika Frame yang diterima tidak sesuai dengan format yang telah
ditentukan maka bit ini akan berubah menjadi set. Dalam mendeteksi
frame ini metoda yang dipergunakan dengan mengecek stop bit pada
frame tersebut. Jika stop bit low maka bit Fen akan menjadi set,
tetapi jika stop bit adalah high maka bit ini akan clear.
Bit 3 – DORn: Data OverRun
Bit ini akan menjadi set jika terjadi kondisi Data Over Run.
Data over Run terjadi ketika buffer receiver masih terisi (ada dua
data).
Bit 2 – UPEn: USART Parity Error
Jika parity checking dibuat menjadi enable maka bit UPEn akan
menjadi set pada saat mendeteksi terjadi error pada parity.
Bit 1 – U2Xn: Double the USART Transmission Speed
Bit
ini hanya mempunyai pengaruh terhadap komunikasi serial secara UART.
Jika bit ini diset maka mode Double
the USART Transmission Speed akan
diaktifkan.
Bit 0 – MPCMn: Multi-processor Communication Mode
Bila
bit MPCMn diset maka seluruh frame, yang diterima oleh USART
receiver, akan diabaikan
jika alamatnya tidak sesuai.
Bit
7 – RXCIEn: RX Complete Interrupt Enable n
Untuk mengaktifkan interrupt pada RXCn Flag maka kedua bit, yaitu
bit RXCIEn dan global interrupt, harus diset.
Bit 6 – TXCIEn: TX Complete Interrupt Enable n
Untuk
mengaktifkan interrupt pada TXCn
Flag maka kedua bit, yaitu bit TXCIEn
dan global interrupt, harus diset.
Bit 5 – UDRIEn: USART Data Register Empty Interrupt Enable n
Untuk
mengaktifkan interrupt pada UDREn
Flag maka kedua bit, yaitu bit UDRIEn
dan global interrupt, harus diset.
Bit 4 – RXENn: Receiver Enable n
Agar
USART Receiver menjadi enable maka bit ini harus diset.
Bit 3 – TXENn: Transmitter Enable n
Agar
USART Transmitter menjadi enable maka bit ini harus diset.
Bit 2 – UCSZn2: Character Size n
Untuk menentukan format pada frame data maka dipergunakan kombinasi
bit UCSZn2 dan dua buah bit UCSZn1 dan UCSZn0.
Bit 1 – RXB8n: Receive Data Bit 8 n
Dipergunakan
untuk mode operasi data 9 bit pada sisis receiver.
Bit 0 – TXB8n: Transmit Data Bit 8 n
Dipergunakan untuk mode operasi data 9 bit pada sisi transmitter.
Bits 7:6 – UMSELn1:0 USART Mode Select
Kedua bit ini menentukan mode operasi dari USART sebagaimana
diperlihatkan pada tabel.
Bit
3 – USBSn: Stop Bit Select
Bit ini menentukan jenis stop bit yang dipergunakan baik pada
transmitter maupun receiver.
Bit
2:1 – UCSZn1:0: Character Size
Untuk menentukan format pada frame data maka dipergunakan kombinasi
bit UCSZn2 dan dua buah bit UCSZn1 dan UCSZn0.
Bit
0 – UCPOLn: Clock Polarity
Bit ini dipergunakan hanya pada mode synchronous. Jika yang
dipergunakan adalah mode pengiriman data serial secara asynchronous
maka bit ini harus diclearkan.
Bit 11:0 – UBRR11:0: USART Baud Rate Register
Register 12 bit ini merupakan USART baud rate. Empat bit MSB dari
USART Baud rate dikandung oleh UBRRnH sedangkan delapan bit LSB USART
Baud rate dikandung dalam UBRRnL
Tabel berikut memberikan perhitungan untuk Baud rate.
Contoh Program Komunikasi Serial dengan mempergunakan UART.
//
Mempergunakan UC328 dengan frekuensi Clock 8 MHz.
//
Baud Rate 4800
//Frame
yang dipergunakan : 8 data bit, parity even, stop bit 1
//
Data yang akan dikirim adalah 0b11110000
#
include <avr /io.h>
int
main ( void )
{
int
UBBRValue = 103;
// UBBRValue
didapat dari tabel halaman 202
//-------PROSES
INISIALISASI -------------------------
//UBRR0H
dan UBRR0L dapat dilihat pada program inisialisasi UART
UBRR0H = (unsigned char) (UBBRValue >> 8);
UBRR0H = (unsigned char) (UBBRValue >> 8);
UBRR0L
= (unsigned char) UBBRValue;
//
Mengaktifkan pengiriman (Tx) dan penerimaan (Rx)
UCSR0B
= (1 << RXEN0) | (1 << TXEN0);
//
Mempergunakan komunikasi 8 bit
UCSRC
= (1 << UCSZ00 ) | (1 << UCSZ01 );
UCSR0B
&= ~(1 << UCSZ02 );
//Mempergunakan
satu stop bit
UCSRnC
&= ~(1 << USBSn);
//
Mempergunakan even parity
UCSR0C
|= (1 << UPM01);
UCSR0C
&= ~(1<<UPMn0);
//
Mempergunakan metode Asynchronous
UCSR0C
&= ~(1<<UMSEL01);
UCSR0C
&= ~(1<<UMSEL00);
//
====== PROSES INISIALISASI SELESAI =============
while(1)
{
//
Potongan program diambil dari fungsi USART_Transmit(unsigned char
data)
/*
Wait for empty transmit buffer */
while
( !( UCSR0A & (1<<UDRE0)) );
/*
Put data into buffer, sends the data */
UDR0
= 0b11110000 //data yang akan dikirim adalah 0b11110000;
}
}
mantap
BalasHapus