Rabu, 26 Agustus 2009

USART : Kirim dan Terima Data

.
Setelah membahas mengenai Inisialisasi USART untuk komunikasi Serial Asinkron, selanjutnya mengenai kirim dan terima komunikasi data secara USART.
Kirim dan terima data untuk komunikasi secara USART, anda bisa membuat fungsi sendiri tetapi pada CoViAVR, telah ada library yang bisa digunakan untuk input dan output data yaitu library stdio.h. Akan saya bahas keduanya.

Library stdio.h
Coba anda buka Help CoViAVR (versi 2.03.9 dengan windows XP) dengan kata kunci stdio, maka akan ditampilkan daftar fungsi-fungsi yang terdapat pada stdio.h yang dapat anda gunakan.
  • dataRX = getchar() : menunggu karakter yang diterima dari port serial, menggunakan polling. Masalah penggunaan fungsi ini adalah jika tidak ada data serial yang diterima maka selalu looping dalam fungsi ini hingga mendapatkan data serial.
  • putchar(dataTX) : mengirimkan data serial berupa karakter C (data 8 bit), menggunakan polling.
  • puts(buffer_char) : mengirim data berupa kata atau kalimat yang tersimpan dalam buffer (disimpan dalam memori SRAM) hingga bernilai null (karakter dengan nilai 0x00).
  • putsf("kata") : mengirim data berupa kata atau kalimat yang ditulis diantara tanda " petik dua (disimpan dalam Memori FLASH).

Fungsi Read Write
Umumnya ada 2 fungsi yaitu mengirim dan menerima data, gambar berikut menunjukkan cara pengiriman dan penerimaan data secara umum :
Program Read dan Write menggunakan type data unsigned char (char tidak bertanda 0-255) karena data karakter yang digunakan tidak mungkin benilai negatif.
char pada CoViAVR, default-nya secara otomatis akan diubah menjadi unsigned char tetapi untuk membiasakan diri maka gunakan data sesuai dengan range-nya karena suatu saat anda akan menggunakan data bernilai negatif.

Coding pada gambar, untuk program pengiriman data (USART_WRITE) tidak masalah tetapi untuk fungsi menerima data (USART_READ) akan mengalami kasus yang sama dengan fungsi getchar() yaitu program akan menunggu atau looping dalam perintah while(!(UCSRA & ..... hingga 1 byte data serial diterima.
Hal ini akan sangat mengganggu apabila fungsi USART_READ digunakan hanya untuk mengecek "apakah ada data serial yang diterima ?". Yaitu jika ada data, ambil lalu proses dan jika tidak ada data, lanjut ke perintah selanjutnya dan bukannya menunggu terus-menerus.

Gambar disamping ada adalah solusi untuk masalah tersebut, yaitu mengecek flag RXC dengan menggunakan counting. Jika setelah i hitungan (100 hitungan) tidak ada data yang diterima maka lanjut ke baris program selanjutnya.

Hal inilah yang membuat saya pribadi lebih suka menggunakan sistem polling dan tidak menggunakan interupsi serial, karena programmer bisa mengetahui kapan USART akan dicek dan digunakan selain itu bisa merancang RTOS dengan sistem penjadwalan waktu (timer scheduling).


Yang perlu menjadi catatan penting adalah kapan anda memilih, apakah menggunakan fungsi yang tersedia pada stdio.h atau anda menggunakan fungsi sendiri, karena kedua penggunaan ini penting untuk kasus-kasus tertentu.

Topik yang Populer