Minggu, 28 Februari 2016

UART/USART (Universal A/Synchronous Receiver Transmitter) pada UC ATMega328

     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

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”



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 7 – RXCn: USART Receive Complete
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 15:12 – Reserved Bits
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);
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;
}
}