Hot Posts

6/recent/ticker-posts

Komunikasi serial (RS232) Mikrokontroler AVR dengan PC

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;

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;

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 :)

Post a Comment

0 Comments