RSS

24 Oct

Sebenarnya pada mikrokontroler ATmega8/16/32/8535 hanya terdapat satu pasang TX dan RX untuk komunikasi USART. Seringkali untuk menggunakan beberapa USART di satu mikon digunakan ATmega128 atau ATmega2560. Hal yang sangat boros apabila menggunakan dua mikon terakhir tersebut jika hanya bertujuan untuk mengirim data ke serial PC atau device lain. Ya selain harganya mahal juga flash memory yang terlalu besar dimana seringkali kurang bisa kita maksimalkan. Dengan mengakalinya dengan I/O biasa pada mikrokontroler AVR (disini saya menggunakan ATmega32) maka dapat dibuat beberapa port selayaknya USART menjadi lebih dari satu, atau 8 buah, atau jika mau semua port dijadikan USART (ini terlalu iseng).

USART yang saya buat ini hanya untuk TX nya saja yaitu yang mengirim (transmit) data serial ke device lain. Intinya untuk melakukan pengiriman sinyal data perlu dirancang keluaran dari port sama persis seperti TX yang sebenarnya. Teknik ini dinamakan bit-banging. Di bawah ini adalah sinyal data dari USART yang saya kutip dari datasheet mikrokontroler AVR,

Intinya ada beberapa konfigurasi pada data USART yang perlu di atur. Parameter utama adalah nilai baudrate karena ini akan mewakili berapa timing sinyal dari data yang dikirimkan. Kemudian adalah jumlah data bit, parity bit dan stop bit. Misalkan jika menggunakan baudrate 9600 bps, jumlah data bit 8 dimana data yang dikirimkan adalah 0b01010110 = 0×56, tidak ada parity bit , dan stop bit 1 maka sinyal datanya adalah

Agar sinyal high dan low memiliki lebar pulsa yang sama maka perubahannya diatur dengan menggunakan timer. Lebar pulsa ini ditentukan dari baud rate UART yang digunakan, yaitu 9600 bps. Sehingga periodenya adalah 1/9600 = 0.104 ms. Dengan mengatur pembacaan register counter timer maka akan diperoleh sinyal data high dan low mirip dengan gambar di atas. Berikut adalah kutipan kode programnya

view plainprint?

  1. #define bit_tx PORTC.0  //port yang ingin di bit-banged, inisialisasi low di set sebagai output
  2. // clock mikon 11.059200 MHz, timer clock 230.400KHz
  3. // delay = 104 ms, counter = 230400/9600 = 24
  4. // setelah dicoba-coba melalui simulasi memenuhi di antara 21-23
  5. void delay_104us()
  6. {
  7. TCNT0 = 0;
  8. while(TCNT0<=22);
  9. }
  10. //fungsi mengirimkan data character UART
  11. void putchar_bitbanged(char c)
  12. {
  13. unsigned char i;
  14. bit_tx = 1;
  15. delay_104us();
  16. bit_tx = 0;
  17. delay_104us();
  18. for(i=0;i<8;i++)
  19. {
  20.     if(c&(1<<i))
  21.          bit_tx = 1;
  22.     else
  23.          bit_tx = 0;
  24.     delay_104us();
  25. }
  26. bit_tx = 1;
  27. }

Berikut adalah hasil simulasinya (download di sini)

Semoga bermanfaat.

 

http://rnt.uiroboticsteam.net/

 
Leave a comment

Posted by on October 24, 2012 in Robotics

 

Tags: , , , , , , , , , , , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: