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.
16 comments:
Sip .. bisa diaplikasiin untuk slave2 yg tugasnya sekedar memberikan informasi biner ..
tapi kira-kira diaplikasiin dimana yah? hemm ..
biasanya dipake buat debugging, misalnya pake ATmega8 buat interface ke device dengan protokol UART, nah kan udah dipake tu TX RX nya, jadi buat debugging proses bisa menggunakan bit banged USART di port yang kita inginkan. Kalo pake LCD kan mahal dan banyak pake port.
kalo yang sampe 8 port dipake ga tau deh aplikasinya dimana, itu cuma untuk menarik aja judulnya :D hehe...
Ngomongin debugging paling enak pake alat ini: http://www.facebook.com/media/set/?set=a.3464225493155.165847.1496525835&type=1
Selain dapat digunakan untuk download AVR dan MCS (semua AVR&MCS dengan ISP), juga memiliki 2serial. bisa untuk nguping TX/RX alat. boutrate juga dapat diatur dari 2400 s/d 130.4K bps. untuk menghubungkannya cuma cukup satu USB. Dijamin proses programming dan debugging ngak perlu tusuk sambung kabel dan hanya memerlukan satu port USB yg terhubung dgn PC
wah berhasil nih,makasih ya mas..
omong2 klo RXnya gmna ya?
Pak... ini program yg buat nulis programnya sama buat simulasinya pakai apa ya?
@Anonymous
wah saya belum coba nih yang RX nya, nanti mudah2n bisa sempat coba, soalnya udah kebayang prinsipnya, kalo udah bisa insyaAllah saya share :D
@tahan_prahara
Programnya pakai CodevisionAVR, simulasi menggunakan ISIS Proteus
makasih mas ditunggu RXnya pusing udah dicoba ga bisa2,hehehe
nah 1 lagi mas klo baud ratenya beda tiap pinnya bisa ga?
sepertinya saya udah nemu RXnya mas :D
makasih bgt,,,
hatur nuhun.. :D
tapi pertanyaan saya 1 lagi mas klo baud ratenya itu beda gmna ya?
@ridla fadilah
wah udah nemu mas, dapet dari mana?, tolong di share dong :D
hmm.. kao baud ratenya dibedain tiap pin berarti nilai 22 di script while(TCNT0<=22); itu harus diganti mas menyesuaikan baudrate, pilih juga prescaler timer yang lebih kecil kalo udah ga muat
eh ga tau sih mas sepertinya ada yg error,maaf kesalahan manusia,hehehee (alesan)
tapi saya liat di forum ini juga rada bingung
http://id.edaboard.com/topic-1511233.0.html.
nah itu mas kan saya pake mikon atmega16 clocknya 11,0592 tuh ga bisa pake 22 pake yg 20 kyaknya mas pake yg 14,745600 y xtalnya?
saya coba langsung sih ga pake proteus.
@ridla
thanks mas, coba dibaca dulu :D
hmm.. sebenarnya saya sendiri jujur belum coba di hardware secara realnya.. mungkin perlu pengaturan/tuning lagi supaya delaynya tepat
tapi saya pake 11.059200MHz kok
salam kenal mas..mau tanya,,,
itu secara teoritis perhitungan nilai TCNT0 itu gimana ya??hehe...pemula nih..
-tyo-
Keren nih...
Kira2 bisa diaplikasikan untuk serial antar mikrokontroller ga mas? Receivernya pake RX default mikro bisa ga?Apa harus pake receiver bit_banged juga?
wah pudin masih eksis neh ya didunia maya... ku kira terakir itu habis lulus SMA hhhaaa... pakabar sobat... kapan maen ke surabaya?? tebak sapa w>?
Mas mau nanya lagi nih buat RXnya. saya dapet koding dari http://wangready.wordpress.com/2011/07/17/membuat-pin-tx-uart-8n1-dari-port-biasa-mikrokontroler-avr-codevision-avr/#comment-248
#include delay.h
#define my_RXport PINC.0 //set pin rx
#define my_RXport_dir DDRC.0 //direksi port
void my_delay_us(int n)
{
while(–n)
delay_us(1);
}
int perioda_baudrate;
void rx_init()
{
int baudrate = 9600; //set baudrate
int konstanta_error = 0; //ditunning sampai mendapat hasil optimal
my_RXport_dir = 0; //set sebagai input
perioda_baudrate = (1000000/baudrate) + konstanta_error; //dalam mikro second
}
unsigned char my_getchar()
{
unsigned char urut_data
,data=0;
while(my_RXport){}; //tunggu kepada data logic LOW
my_delay_us(perioda_baudrate);
for(urut_data=0;urut_data<8;urut_data++)
{
data = data << 1;
if(my_RXport)
data += 1;
else
data += 0;
my_delay_us(perioda_baudrate);
}
return(data);
}
kira2 ini bisa dipake ga?
klo untuk virtual Rx gmn ya ?
Post a Comment