Friday, March 30, 2012

Penjelasan Bit Banging/Software Port Serial

oleh : Sean

Halo lagi sobat MJL, beberapa pekan yang lalu MJL kan pernah berencana ngirim 100 surat ke seluruh universitas di Indonesia. Seabrek surat itu kita kirim lewat jasa pos supaya mereka yang ngurus, jadi kita tetep bisa nyari sebongkah ide buat kelangsungan hidup MJL tanpa perlu repot diganggu urusan ngirim-mengirim surat. Nah, kali ini kita mau cerita apa yang terjadi kalo kita ngirim semua surat itu sendiri. Nah lho, kok ngiklan??

Eits, tunggu dulu tapi, yang kita ceritain bukan pengiriman surat, tapi pengiriman data serial dari device ke device lain. Otre?

Kalo di dunia ‘mereka’, jasa pengiriman data jelas bukan lewat pos, tapi bisa bermacam-macam juga melalui dedicated pin di device itu, seperti lazimnya mikrokontroller menggunakan UART, dan seperti halnya mengirim surat, kita tinggal nulis beberapa kriteria beserta isi datanya dengan benar, lalu mereka akan mengurus pengiriman data tersebut ke tempat tujuan.

Tapi kita bisa aja mengirim data tersebut tanpa mesti mengirimnya lewat pin khusus tadi. Perlu sedikit trik untuk membuat pin I/O biasa menjadi pin untuk komunikasi, yaitu menggunakan software atau program yang mirip dengan kinerja hardware aslinya. Cara ini disebut Bit-Banging! Cara ini aslinya punya banyak kelemahan dibanding menggunakan langsung fungsi hardware seperti UART tadi. Tapi bukan tidak mungkin kita akan menemukan bahwa ilmu ini bakalan terpakai nanti, entah karena kebutuhan atau kesesatan penggunanya. So buat mikrokontroler macem ATmega yang biasanya cuma punya 1 pasang serial, kita bisa hack jadi banyak !

Bayangkan kekurangannya, seperti halnya jika MJL mengirim ke 100 surat itu sendiri. Yang jelas pasti memakan waktu lama, selain itu kita juga gak sempet mikirin nasib MJL. Entah berapa lama harus vakum sampai selesai mengirimkannya, ditambah lagi, kita juga kecapekan. Begitu pula efek samping yang dirasakan mikrokontroler/prosesor kita jika kita menggunakan metode pengiriman sesat ini, di antaranya:

- Kecepatan transfer datanya lebih lambat dari standar fitur hardware aslinya.
- Tidak bisa mengerjakan proses lain ketika pengiriman data dilakukan.
- Kontroler/prosesor mendapat beban kerja lebih berat, mungkin jadi lebih mudah panas.


Namun dibandingkan dengan hardware aslinya, dimana pin dengan fitur ini biasanya terbatas, dan ketika digunakan tidak bisa dipakai untuk keperluan lain, maka kita bisa menggunakan bit banging ini yang bisa digunakan pada pin mana saja, misal ketika kita kekurangan jumlah fitur yang disediakan oleh kontroler/prosesor tersebut atau ketika kita tiba-tiba iseng ingin menggunakan pin biasa untuk mengirim data serial untuk proyek yang ringan, bisa saja bukan?

Garis besarnya, cara pengiriman data melalui UART itu dimulai dengan bit ‘start’ dan diakhiri dengan bit ‘stop’, Setelah bit start, maka selanjutnya data sebanyak 8 bit dikirimkan dan dilanjutkan dengan bit stop. Begitu juga penerimaan datanya, receiver akan menerima bit start, dan mengambil 8 bit data berikut sebagai data, dan berhenti setelah bit stop, dan alur seperti inilah kira-kira yang akan direalisasikan melalui program kita. Masalahnya sebagai receiver jadi-jadian (hasil bit banging) ia belum otomatis aktif hanya ketika start bit sudah terbaca. Karena ini pin normal, maka ia harus selalu membaca kondisi pin receiver ini terus menerus, sehingga bisa membuat beban bertambah. Jadi ada baiknya dipakai trik seperti menghubungkan pin tersebut ke interrupt handler, yang akan langsung menghentikan proses lain ketika pin tersebut menerima sinyal start dari transmitter.



Dan berikut adalah contoh sederhana dari program bahasa C yang bisa sobat liat di Wikipedia.


//transmit byte serially, MSB first
voidsend_8bit_serial_data(unsigned char data)
{
int i;
// select device
output_high(SD_CS);
// send bits 7..0
for (i = 0; i < 8; i++)
{
// consider leftmost bit
// set line high if bit is 1, low if bitis 0
if (data & 0x80)
output_high(SD_DI);
else
output_low(SD_DI);
// pulse clock to indicate that bitvalue should be read
output_low(SD_CLK);
output_high(SD_CLK);
// shift byte left so next bit will beleftmost
data <<= 1;
}
// deselect device
output_low(SD_CS);
}

Nah, mungkin program di atas masih amat sederhana. Gini penjelasannya : program itu mengirimkan 8 bit data, 1 bit data pada satu waktu. Mulai dari MSBnya, atau bit yang paling kiri. Jika MSBnya itu 1, maka ia buat sinyal high, atau jika MSB 0 dibuatlah sinyal low. Setelah itu sinyalnya di-clock sebagai isyarat untuk dibaca. Setelah 1 alur ini, data tersebut digeser ke kiri 1 kali (shift bit left), untuk dilihat lagi apakah nilai MSB yang sekarang ini 1 atau 0. Langkah itu diulang sampai ke-8 bit tersebut selesai dikirim dan dibaca. Sedikit berbeda memang dari yang diutarakan sebelumnya, bukan menggunakan bit start/stop, ia cuma menggunakan enable saja (Select device) untuk mengaktifkan/mematikan fitur ini.

Mungkin di situ juga letak asiknya. Namanya juga ngotak-ngatik, terserah kita mau bikin programnya seperti apa, yang penting jalan kan? Jabaran di atas cuma generalisasi aja kok. Silakan keluarkan ilmu sesat kalian masing-masing jika ingin bereksperimen.

1 comment:

  1. paling suka kalau udah berhubungan sama softwarenya, apalagi kalau pake bahasa C

    ReplyDelete