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 = 0x56, 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

#define bit_tx PORTC.0  //port yang ingin di bit-banged, inisialisasi low di set sebagai output

// clock mikon 11.059200 MHz, timer clock 230.400KHz
// delay = 104 ms, counter = 230400/9600 = 24
// setelah dicoba-coba melalui simulasi memenuhi di antara 21-23
void delay_104us()
{
TCNT0 = 0;
while(TCNT0<=22);
}

//fungsi mengirimkan data character UART
void putchar_bitbanged(char c)
{
unsigned char i;
bit_tx = 1;
delay_104us();
bit_tx = 0;
delay_104us();
for(i=0;i<8;i++)
{
    if(c&(1<<i))
         bit_tx = 1;
    else
         bit_tx = 0;
   
    delay_104us();
}
bit_tx = 1;

}

Berikut adalah hasil simulasinya (download di sini)

Semoga bermanfaat.