UART adalah
singkatan dari "Universal Asynchronous Serial Receiver and
Transmitter". Sebuah peralatan komunikasi antara dua unit komputer yang
hanya dihubungkan dengan sedikitnya dengan 1 kabel ditambah kabel Ground saja.
Dan hanya 2 kabel untuk komunikasi 2 arah ditambah dengan 1 kabel Ground.
Komunikasi ini telah lama menjadi standar bagi IBM-PC dan digunakan secara
mendunia. Bahkan sampai sekarang walaupun mulai menghilang dari dunia ini,
standar ini tidak terlupakan, dan masih banyak digunakan oleh berbagai keluarga
mikro kontroller.
Komunikasi ini secara sederhana adalah mengubah
data parallel menjadi data serial, dan dapat dikomunikasikan pada komputer lain
ditempat yang jauh. Secara sederhana komunikasi ini berbahan dasar sebuah shift
register, yakni komponen elektronika yang dapat menggeser data parallel
menjadi data serial, ataupun menerima data serial kemudian mengubahnya menjadi
data parallel.
Namun tentu
saja untuk komunikasi yang baik dan dengan
error minimal perlu sebuah proses yang lebih dari hanya
mengerjakan shift register. Akhirnya IBM-PC membuat beberapa langkah. Yakni
menentukan standar Bit rate masing-masing system yang terhubung. Bit rate ini kemudian juga umum disebut dengan
Baud Rate. Walaupun sebenarnya berbeda. Dengan kata
lain ke 2 alat harus sama-sama mengerti bahwa data yang sedang ditransfer berjumlah
sekian bit per detik, dengan tujuan alat yang lain (penerima)
tidak salah tafsir.
Baud Rate vs Bit Rate
Bit Rate
adalah kecepatan dan jumlah transfer bit data dalam 1 detik. Bit dalam hal ini
adalah bit data. Jika data adalah byte maka tentu saja terdapat 8-bit. Sedang
baud rate adalah hampir sama, yakni kecepatan transfer bit data frame dalam 1
detik. Bit dalam hal ini meliputi jumlah semua bit termasuk dengan start bit,
data bit, paritas, dan stop bit. Baud rate sangat lekat dengan komunikasi
serial. Terutama yang berjenis Asynchronous seperti komunikasi serial standar
RS-232 ini. Namun banyak komunikasi serial yang lain yang tidak menggunakan
frame, dan biasanya diperlukan kabel singkronisasi. Sehingga komunikasi semacam
itu, dapat menggunakan berhitungan bit rate, dan bukannya baud rate.
Komunikasi 1 arah vs 2 arah
Defaultnya
komunikasi serial adalah komunikasi 1 arah. Yakni dari komputer utama, menuju
komputer mikro ke 2, misalnya adalah modem. Biasanya dalam modem (modulator
and demodulator) dikontrol oleh mikro komputer mini yang bertugas hanya
untuk melakukan modulasi ke jalur telpon misalnya. Komunikasi 1 arah ini
disebut dengan komunikasi simplex. Namun ada kalanya
komunikasi searah tersebut tidak cukup untuk mendeteksi kesalahan dalam transfer.
Kita membutuhkan respon dari penerima apakah data yang telah kita kirimkan
sudah ditangani dengan baik atau tidak. Maka dimungkinkan adanya transfer data
serial dari modem ke komputer utama setiap setelah komputer utama selesai
mengirimkan data. Komputer Utama kemudian menunggu respon dari modem misalnya.
Komunikasi 2 arah bergantian semacam ini disebut dengan komunikasi half
duplex. Namun akhirnya dewasa ini komputer sudah semakin canggih. Bahkan
sebuah modem pun dapat menerima data dan mengirimkan data sekaligus, tanpa
terjadi kesalahan.
Komunikasi 2
arah bergantian dirasa kurang cepat lagi, sehingga dimungkinkan untuk melakukan
komunikasi 2 arah bersamaan, yang kemudian disebut dengan komunikasi full
duplex. Sekarang mikro kontroller pun sudah mampu melakukan komunikasi full
duplex. Hal tersebut dapat dilakukan dengan membuat mesin pengirim data dan
mesin penerima data secara terpisah. Mesin pengirim data biasanya disebut
dengan TX (Transmiter) sedang mesin penerima data disebut debagai RX
(Reciever). Walaupun mereka memiliki komponen elektronika terpisah, dan
memiliki buffer data terpisah serta juga memiliki peralatan interupsi terpisah,
mereka digerakkan oleh baud rate yang sama. Misalnya jika TX bekerja pada baud
rate 9600 bps maka RX tentu saja bekerja pada baud rate yang sama. Dalam
prakteknya TX dan RX digunakan sesuai dengan kebutuhan.
Register register komunikasi serial pada AVR
Register-register yang perlu diset dan digunakan dalam rangka membangun komunikasi serial antara lain adalah:
1. register data (UDR), untuk menyimpanndata yang dikirim dan diterima
2. register control (UCSRA, UCSRB dan UCSRC)
• Bit 7 – RXC: USART Receive Complete
RXC otomatis akan bernilai 1,
jika ada data baru di bufer penerima. RXC otomatis akan bernilai 0,
jika
data sudah dibaca atau bufer penerima kosong.
• Bit 6 – TXC: USART Transmit Complete
TXC otomatis akan bernilai 1, jika data
di buffer selesai dikirim.
• Bit 5 – UDRE: USART Data Register Empty
UDRE otomatis akan bernilai 1 , jika
register UDR kosong . receiver siap menerima data. UDRE=0,
UDR ada
isinya .
• Bit 4 – FE: Frame Error
FE otomatis akan bernilai 1, jika
ada frame eror.
• Bit 3 – DOR: Data OverRun
DOR otomatis akan bernilai 1, jika data
datang ketika bufer penuh(terjadi antrian).
• Bit 2 – PE: Parity Error
PE otomatis akan bernilai 1, jika
terjadi parity eror.
• Bit 1 – U2X: Double the USART Transmission
Speed
kita set U2X=0, kecepatan normal. U2X=1
kecepatan 2xbaudrate.
• Bit 0 – MPCM: Multi-processor Communication
Mode
kita set MCM=1 byte pertama yg diterima
harus 9 bit , jika tdk data byte akan diabaikan.bitini terjadi
hanya untuk
penerimaan saja pd komunikasi banyak microcontroller.
• Bit 7 – RXCIE: RX Complete Interrupt Enable
kita set RXCIE=1 , interupsi receive complete
aktif.
• Bit 6 – TXCIE: TX Complete Interrupt Enable
kita set TXCIE=1, interupsi transmit complete
aktif.
• Bit 5 – UDRIE: USART Data Register Empty
Interrupt Enable
kita set UDRIE=1, interupsi UDRE aktif.
• Bit 4 – RXEN: Receiver Enable
kita set RXEN=1, USART receiver aktif. micon
bisa mnerima data.
• Bit 3 – TXEN: Transmitter Enable
kita set TXEN=1, Usart Transmiter aktif.
micon bisa mengirim data.
• Bit 2 – UCSZ2: Character Size
kita set UCSZ2:UCSZ1:UCSZ0 = 011 ,
panjang data 8 BIT. (bit UCSZ1 dan UCSZ0 ada di register
UCSRC)
• Bit 1 – RXB8: Receive Data Bit 8
RXB8 menjadi bit ke-9 jika panjang data yg
diterima 9 bit .
• Bit 0 – TXB8: Transmit Data Bit 8
TXB8 menjadi bit ke-9 jika panjang data yg
dikirim 9 bit.
• Bit 7 – URSEL: Register Select . memilih UCSRC atau
UBRRH
kita set URSEL=1 , UCSRC aktif ,UBRRH
tdk aktif,
kita set URSEL=0 , UBRRH aktif , UCRSC
tdk aktif.
• Bit 6 – UMSEL: USART Mode Select
kita set UMSEL=1 , mode synceonous. UMSEL=0
mode asyncronous
• Bit 5:4 – UPM1:UMP0: Parity
Mode
• Bit 3 – USBS: Stop Bit Select
kita set USBS=0, stop bit =1 bit ,
USBS=1 panjang stop bit = 2 bit.
• Bit 2:1 – UCSZ1:0: Character Size
kita set UCSZ2:UCSZ1:UCSZ0 = 011 ,
panjang data 8 BIT. (bit UCSZ2 ada di register UCSRB)
• Bit 0 – UCPOL: Clock Polarity bit ini
digunakan untuk mode syncoronous saja.
kita set UCPOL=0 trnasmisi clock naik,
UCPOL=1 transmisi clock turun. (khusus yg ini don’t care
krn kita menggunakan
mode asyncronous)
3. Register 8 bit UBRRH dan 8 bit UBRRL , menyimpan parameter
baudrate 16 bit UBRR register.
Rumus untuk menghitung nilai UBRR
adalah sbb:
Contoh cara menghitung nilai UBRR :
diketahui baudrate
= 9600
frekwensi cristal yg digunakan 11.059.200 hz
pertanyaanya berapa
nilai UBBRH dan UBRL nya?
UBRR =
( (11.59200)/(16*9600) ) – 1 = 71.
maka nilai UBRR adalah 71 atau 0047H. (dlm
bentuk 16 bit hexa). dan penulisan nilai UBRR di program (ke dlm
register UBRRH dan UBRRL) menjadi:
UBRRH=0×00;
UBRRL=0×47;
UBRRL=0×47;
Tips Pemilihan nilai frekwensi Xtal
nilai UBRR adalah integer , maka pilih
lah nilai frekwensi xtal yg menghasilkan perhitungan integer .
misal contoh diatas saya ganti nilai Xtalnya jadi 8 Mhz ,baudrate 9600.
maka nilai UBRR nya jadi 51,0833 yg dimasukan ke UBRR adalah 51.
nilai ini akan menghasilkan kemungkinan komunikasi eror
sebesar0,2%. sedangkan jika menggunakan Xtal 11.059200 erornya 0%.
Cara lain untuk meseting
nilai UBRR adalah dgn menuliskan rumus perhitungan UBRR ke code program biarkan compiler yg menghitung nilai UBRR,, seperti contoh berikut ini:
#define
Frekwensi_Xtal 11059200// Clock Speed
#define
BAUDRATE 9600
#define
MYUBRR (Frekwensi_Xtal/(16*BAUDRATE))-1
void main(
void )
{
...
USART_Init (
MYUBRR );
...
}
void
USART_Init( unsigned int ubrr)
{
/* Set baud
rate ubrr= 0047 */
UBRRH =
(unsigned char)(ubrr>>8);
UBRRL =
(unsigned char)ubrr;
}
USART harus diinisialisasi sebelum komunikasi
dilakukan. Proses inisialisasi biasanya
terdiri dari pengaturan baud rate, pengaturan format frame dan
mengaktifkan(enable) Transmitter atau Receiver/Penerima tergantung pada
penggunaan. Untuk operasi USART dgn interupsi, Global Interrupt Flag harus
diclearkan (dan interupsi dinonaktifkan secara global) ketika melakukan
inisialisasi. Bit Flag TXC dapat digunakan untuk memeriksa bahwa Transmitter telah
menyelesaikan semua transfer, dan bit flag RXC dapat digunakan
untuk memeriksa bahwa tidak ada data yang belum dibaca dalam buffer
penerima. Perhatikan bahwa Flag TXC harus diclearkan sebelum
pengiriman (sebelum UDR ditulis) jika digunakan untuk pengiriman.
Berikut ini adalah contoh program komunikasi serial UART antara mikrokontroler AVR dengan PC dengan format data 1-bit start, 8-bit data, 1-bit stop, tidak menggunakan paritas dan baud rate (kecepatan transmisi) 9600 bps. Prinsip kerjanya adalah jika mikrokontroler menerima data dari PC kemudian data tersebut akan ditampilkan melalui LED di PORTC, kemudian data tersebut dikirimkan kembali ke PC. Sebagai contoh ketika PC mengirimkan karakter "X" ke mikrokontroler maka karakter tersebut akan ditampilkan dalam lampu led dan sekaligus dikirimkan kembali ke PC. Berikut programnya:
#include
unsigned char data_rx=0x00;
const long int osilator=8000000;
unsigned long int UBRR;
void inisialisasiUART(unsigned long int baud_rate);
unsigned char terima_byte(void);
void kirim_byte(unsigned char data);
void main(void)
{
DDRC=0xFF;
PORTC=0x00;
inisialisasiUART(9600);
while(1)
{
data_rx=terima_byte();
kirim_byte(data_rx);
PORTC=~data_rx;
}
}
void inisialisasiUART(unsigned long int baude_rate)
{
UBRR=(osilator/(16*baud_rate))-1;
UBRRL=UBRR;
UBRRH= UBRR>>8;
UCSRB=0x18;
UCSRC=0x86;
}
Berikut ini adalah contoh program komunikasi serial UART antara mikrokontroler AVR dengan PC dengan format data 1-bit start, 8-bit data, 1-bit stop, tidak menggunakan paritas dan baud rate (kecepatan transmisi) 9600 bps. Prinsip kerjanya adalah jika mikrokontroler menerima data dari PC kemudian data tersebut akan ditampilkan melalui LED di PORTC, kemudian data tersebut dikirimkan kembali ke PC. Sebagai contoh ketika PC mengirimkan karakter "X" ke mikrokontroler maka karakter tersebut akan ditampilkan dalam lampu led dan sekaligus dikirimkan kembali ke PC. Berikut programnya:
#include
unsigned char data_rx=0x00;
const long int osilator=8000000;
unsigned long int UBRR;
void inisialisasiUART(unsigned long int baud_rate);
unsigned char terima_byte(void);
void kirim_byte(unsigned char data);
void main(void)
{
DDRC=0xFF;
PORTC=0x00;
inisialisasiUART(9600);
while(1)
{
data_rx=terima_byte();
kirim_byte(data_rx);
PORTC=~data_rx;
}
}
void inisialisasiUART(unsigned long int baude_rate)
{
UBRR=(osilator/(16*baud_rate))-1;
UBRRL=UBRR;
UBRRH= UBRR>>8;
UCSRB=0x18;
UCSRC=0x86;
}
unsigned char terima_byte(void)
{
while (!(UCSRA & 0x80));
return UDR;
}
void kirim_byte(unsigned char data)
{
while(!UCSRA & 0x20));
UDR=data;
}
sumber:
agus bejo, dari mana-mana :)
agus bejo, dari mana-mana :)
0 Comments
Silahkan Tinggalkan Komentar Anda