Komunikasl Data Serial
Komunikasi
serial adalah salah satu metode komunikasi data di mana hanya satu bit data
yang dikirimkan melalui sebuah kabel pada waktu tertentu
Ada
dua cara komunikasi data secara serial, yaitu komunikasi data serial
secara sinkron dan komunikasi data serial secara asinkron.· Pada
komunikasi data serial "sinkron, clock dikirimkan bersama-sama
dengan data serial, sedangkan komunikasi data serial asinkron,merupakan
kebalikannya karena clock tidak dikirimkan bersama data Serial,
tetapi dibangkitkan secara sendiri-sendiri baik pada sisi pengirim(transmitter) maupun
pada sisi penerima (receiver).Komunikasi data serial
ini dilakukan oleh UART (Universal Asynchronous Receiver/Transmitter) dan
USART (Universal Synchronous Asynchronous Reciever Transmiter). IC UART
dan USART berfungsi untuk mengubah data paralel menjadi data serial dan
menerima data serial yang kemudian diubah kembali menjadi data
paralel. Pada UART,kecepatan pengiriman data (baud rate) dan fase clock
pada sisi transmitter dan pada
sisi receiver harus sinkron. Agar sinkron maka
perlu sinkronisasi antara transmitter
dan receiver. Hal ini dilakukan oleh bit ' Start' dan bit
' Stop ' .Ketika saluran
transmisi dalam keadaan on, output UART adalah dalam
keadaan logika '1 ' . Ketika transmitter ingin mengirimkan
data, output UART akan diset lebih dulu ke logika '0' untuk waktu satu
bit. Sinyal ini pada receiver akan dikenali sebagai sinyal 'Start'
yang digunakan untuk mensinkronkan fase clocknya sehingga sinkron dengan fase
clock transmitter. Selanjutnya, data akan dikirimkan secara serial dari bit
paling rendah (bit 0) sampai bit tertinggi. Selanjutnya, akan dikirim sinyal
'Stop' sebagai akhir dari pengiriman data serial. Cara pemberian kode data yang
disalurkan tidak ditetapkan secara pasti.
Karakteristik Sinyal Port Serial
Standar
sinyal serial RS232 memiliki ketentuan level tegangan
sebagai berikut:
1. Logika
'I ' disebut 'mark' terletak antara -3 Volt hingga 25 Volt.
2. Logika ' 0'
disebut ' space' terletak antara +3 Volt hingga +25 Volt.
3. Daerah "tegangan
antara - 3 Volt hingga +3 Volt adalah invalid level, yaitu
daerah tegangan yang tidak. Memiliki level logika pasti sehingga harus
dihindari.Demikian juga. level tegangan lebih negatif dari - 75
Volt atau lebih positif dari +25 VoIt juga harus
dihindari karena tegangan tersebut dapat merusak line driver pada
saluran RS232.
Port Serial DB 9
Gambar
dibawah ini adalah gambar konektor port serial DB-9
Keterangan
·
Pin 1 = Data Carrier Detect (DCD)
·
Pin 2 = Received Data (RxD)
·
Pin 3 = Transmitted Data (TxD)
·
Pin 4 = Data Terminal Ready (DTR)
·
Pin 5 = Signal Ground (common)
·
Pin 6 = Data Set Ready (DSR)
·
Pin 7 = Request To Send (RTS)
·
Pin 8 = Clear To Send (CTS)
·
Pin 9 = Ring Indicator (RI)
Keterangan mengenai fungsi saluran
RS232 pada konektor DB9 adalah sebagai berikut:.
Data
Terminal Ready, pada saluran ini memberitahukan kesiapan terminalnya. Jika
terjadi masalah dengan port COM, maka sinyal ini tidak diaktifkan
Data
set ready DSR Ini adalah sinyal dari modem ke PC, dan berjenis aktif low.
Sinyal ini tidak akan dikeluarkan modem, jika modem dalam masalah atau rusak.
Signal
Ground, saluran ground.
Clear
To Send ,CTS sinyal pemberitahuan bahwa komputer sudah bisa mengirmkan data
Reques
To Send, RTS sinyal peringatan bahwa akan ada pengiriman data dari komputer.
Data
Carrier Detect (DCD), sinyal yang menginformasikan bahwa ada perangkat yang
solid yang bisa menerima data
Ring indicator
(RI), adalah sinyal untuk menginfomasikan bahwa saluran telah dihubungi
Received
data (RxD) adalah sinyal yang diterima dari perangkat lain, pada perangkat lain
tersebut sinyal didapat dari sinyal TxD ( Transmitted data)
Transmitted
Data (TxD) adalah sinyal actual yang dikirimkan dari satu perangkat ke
perangkat lain,
Port
serial sering digunakan untuk interfacing komputer dan mikrokontroler, karena
kemampuan jarak pengiriman data dibandingkan port paralel. Untuk komunikasi
serial antara 2 PC anda cukup menghubungkan :
1. Pin
TxD ke pin RxD computer lain
2. Pin
RXD dihubungkan ke pin TxD komputer lain
3. RTS
dan CTS dihubung singkat
4. DSR
dan DTR dihubung singkat
5. GND
dihubungkan ke GND komputer lain
Bila
anda bandingkan cara komunikasi yang dilakukan secara paralel dengan cara
komunikasi yang dilakukan secara serial, maka masing-masing akan memiliki
keuntungan dan kelebihan yang tersendiri. Komunikasi yang dilakukan secara
serial mempunyai keuntungan dari sisi pengkabelan, karena hanya memerlukan tiga
buah kabel, TX, RX dan Ground.
Keuntungan
menggunakan Port Serial
Selain
keuntungan – keuntungan yang telah disebutkan di atas masih ada lagi keuntungan
lainnya jika menggunakan port serial.
Berikut ini keuntungan-keuntungan penggunaan port serial dibandingkan
penggunaan port paralel:
a) Pada
kornunikasi dengan kabel yang panjang, masalah kable loss tidak akan menjadi
masalah besar daripada menggunakan kabel paralel. Port serial mentransmisikan
level tegangan -3 Volt sampai -25 Volt dan '0' pada level tegangan +3 Volt
sampai +25 Volt, sedangkan port paralel mentransmisikan '0' pada level
tegangan 0 Volt dan ‘1’ pada level tegangan 5 Volt.
b) Dibutuhkan
jumlah kabel yang lebih sedikit, bisa hanya menggunakan tiga kabel, yaitu
saluran Transmit Data, saluran Receive Data, dan saluran Gound (konfigurasi
Null Modern).
c) Saat
ini penggunaan mikrokontroler semakin populer. Kebanyakan mikrokontroler
sudah dilengkapi dengan SCI (Serial Communication Interface)yang
dapat digunakan untuk komunikasi dengan port serial komputer.
register control dan flag ADCSRA
SFIOR register
Sample
Circuit
Kode
Sample
#include <mega32.h>
#include <stdlib.h>
#include <lcd.h>
#include <delay.h>
#include <stdlib.h>
#include <lcd.h>
#include <delay.h>
unsigned int data_adc, data_adc1;
char temp[16],temp1[16];
char temp[16],temp1[16];
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0X15;
#endasm
#asm
.equ __lcd_port=0X15;
#endasm
#define mode_adc 0×00 ;
#define ADC_VREF_TYPE 0×00
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=( (adc_input | ADC_VREF_TYPE) & 0xff);
//ADMUX=ADC_VREF_TYPE | adc_input;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0×40;
// Wait for the AD conversion to complete
while(ADCSRA & 0X10==0); //
ADCSRA |= 0X10;
return ADCW;
}
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=( (adc_input | ADC_VREF_TYPE) & 0xff);
//ADMUX=ADC_VREF_TYPE | adc_input;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0×40;
// Wait for the AD conversion to complete
while(ADCSRA & 0X10==0); //
ADCSRA |= 0X10;
return ADCW;
}
void main(void)
{
PORTD=0xff;
DDRD=0X07;
// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
//ADMUX = ADC_VREF_TYPE & 0xff;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0xA3;
SFIOR&=0x1F;
{
PORTD=0xff;
DDRD=0X07;
// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
//ADMUX = ADC_VREF_TYPE & 0xff;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0xA3;
SFIOR&=0x1F;
// LCD module initialization
lcd_init(16);
lcd_init(16);
while (1)
{
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf(“kelas-mikrokontrl”);
lcd_gotoxy(0,1);
lcd_putsf(“nilai ADC”);
//=========================================
data_adc=read_adc(0); //baca ADC channel(x)
itoa(data_adc,temp); // converts integer data_adc characters in string temp.
lcd_gotoxy(10,1) ;
lcd_puts(temp);
delay_ms(700);
//=========================================
data_adc1=read_adc(1); //baca ADC channel(x)
itoa(data_adc1,temp); // converts integer data_adc characters in string temp.
lcd_gotoxy(14,1);
lcd_puts(temp);
delay_ms(700);
{
lcd_clear( );
lcd_gotoxy(0,0);
lcd_putsf(“kelas-mikrokontrl”);
lcd_gotoxy(0,1);
lcd_putsf(“nilai ADC”);
//=========================================
data_adc=read_adc(0); //baca ADC channel(x)
itoa(data_adc,temp); // converts integer data_adc characters in string temp.
lcd_gotoxy(10,1) ;
lcd_puts(temp);
delay_ms(700);
//=========================================
data_adc1=read_adc(1); //baca ADC channel(x)
itoa(data_adc1,temp); // converts integer data_adc characters in string temp.
lcd_gotoxy(14,1);
lcd_puts(temp);
delay_ms(700);
};
}
}
Rate
this:
Rate
This
Posted
by pccontrol
AVR USART (Universal Synchronous
Asynchronous Receiver Transmitter) adalah komunikasi serial dua arah yang
terdapat di AVR yang melibatkan register register sbb:
1.
Register Data (UDR), menyimpan data yg dikirim dan diterima.
2.
Register Control (UCSRA,UCSRB danUCSRC)
• Bit 7 – RXC: USART Receive
Complete
RXC otomatis akan bernilai
1, jika ada data baru di bufer penerima. RXC otomatis akan
bernilai 0, jika data sudah dibaca atau bufer penerima kosong.
• Bit 6 – TXC: USART Transmit
Complete
TXC otomatis akan bernilai 1,
jika data di buffer selesai dikirim.
• Bit 5 – UDRE: USART Data Register
Empty
UDRE otomatis akan bernilai 1
, jika register UDR kosong . receiver siap menerima data. UDRE=0,
UDR ada isinya .
• Bit 4 – FE: Frame Error
FE otomatis akan bernilai
1, jika ada frame eror.
• Bit 3 – DOR: Data OverRun
DOR otomatis akan bernilai 1,
jika data datang ketika bufer penuh(terjadi antrian).
• Bit 2 – PE: Parity Error
PE otomatis akan bernilai 1,
jika terjadi parity eror.
• Bit 1 – U2X: Double the USART
Transmission Speed
kita set U2X=0, kecepatan normal.
U2X=1 kecepatan 2xbaudrate.
• Bit 0 – MPCM: Multi-processor
Communication Mode
kita
set MCM=1 byte pertama yg diterima harus 9 bit , jika tdk data byte
akan diabaikan.bit ini terjadi hanya untuk penerimaan saja pd
komunikasi banyak microcontroller.
• Bit 7 – RXCIE: RX Complete
Interrupt Enable
kita set RXCIE=1 , interupsi receive
complete aktif.
• Bit 6 – TXCIE: TX Complete
Interrupt Enable
kita set TXCIE=1, interupsi transmit
complete aktif.
• Bit 5 – UDRIE: USART Data Register
Empty Interrupt Enable
kita set UDRIE=1, interupsi
UDRE aktip.
• Bit 4 – RXEN: Receiver Enable
kita set RXEN=1, USART receiver
aktif. micon bisa mnerima data.
• Bit 3 – TXEN: Transmitter Enable
kita set TXEN=1, Usart Transmiter
aktif. micon bisa mengirim data.
• Bit 2 – UCSZ2: Character Size
kita set UCSZ2:UCSZ1:UCSZ0 = 011 ,
panjang data 8 BIT. (bit UCSZ1 dan UCSZ0 ada di register
UCSRC)
• Bit 1 – RXB8: Receive Data Bit 8
RXB8 menjadi bit ke-9 jika panjang
data yg diterima 9 bit .
• Bit 0 – TXB8: Transmit Data Bit 8
TXB8 menjadi bit ke-9 jika panjang
data yg dikirim 9 bit.
• Bit 7 – URSEL: Register Select .
memilih UCSRC atau UBRRH
kita set URSEL=1 , UCSRC aktif
,UBRRH tdk aktif,
kita set URSEL=0 , UBRRH aktif ,
UCRSC tdk aktif.
• Bit 6 – UMSEL: USART Mode Select
kita set UMSEL=1 , mode synceonous.
UMSEL=0 mode asyncronous
• Bit 5:4 – UPM1:UMP0:
Parity Mode
kita set :
• Bit 3 – USBS: Stop Bit Select
kita set USBS=0, stop bit =1 bit ,
USBS=1 panjang stop bit = 2 bit.
• Bit 2:1 – UCSZ1:0: Character Size
kita set UCSZ2:UCSZ1:UCSZ0 = 011 ,
panjang data 8 BIT. (bit UCSZ2 ada di register UCSRB)
• Bit 0 – UCPOL: Clock Polarity
bit ini digunakan untuk mode syncoronous saja.
kita set UCPOL=0 trnasmisi clock
naik, UCPOL=1 transmisi clock turun. (khusus yg ini don’t care krn kita
menggunakan mode asyncronous)
Detail
penjelasan tiap bit pd register register di atas ada disini
3.
Register 8 bit UBRRH dan 8 bit UBRRL , menyimpan parameter baudrate 16 bit UBRR
register. Rumus untuk menghitung nilai UBRR adalah sbb:
Contoh menghitung nilai UBRR :
diketahui baudrate = 9600 dan frekwensi cristal yg digunakan
11.059.200 hz , berapa nilai UBBRH dan UBRL nya?
UBRR = ( (11.59200)/(16*9600)
) – 1 = 71.
maka nilai UBRR adalah 71 atau
0047H. (dlm bentuk 16 bit hexa). penulisan nilai UBRR di program
(ke dlm register UBRRH dan UBRRL) menjadi:
UBRRH=0×00;
UBRRL=0×47;
UBRRL=0×47;
Tips Pemilihan nilai frekwensi Xtal
nilai UBRR adalah integer ,
maka pilih lah nilai frekwensi xtal yg menghasilkan perhitungan
integer . misal contoh diatas saya ganti nilai Xtalnya jadi 8 Mhz
,baudrate 9600. maka nilai UBRR nya jadi 51,0833 yg dimasukan ke
UBRR adalah 51. nilai ini akan menghasilkan kemungkinan komunikasi
eror sebesar0,2%. sedangkan jika menggunakan Xtal 11.059200 erornya
0%.
Cara lain untuk meseting nilai UBRR
adalah dgn menuliskan rumus perhitungan UBRR ke code program biarkan
compiler yg menghitung nilai UBRR,, seperti contoh berikut ini:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#define Frekwensi_Xtal 11059200//
Clock Speed
#define BAUDRATE 9600
#define MYUBRR
(Frekwensi_Xtal/(16*BAUDRATE))-1
void main( void )
{
...
USART_Init ( MYUBRR );
...
}
void USART_Init( unsigned
int ubrr)
{
/* Set baud rate ubrr=
0047 */
UBRRH = (unsigned
char)(ubrr>>8); //UBRH=00
UBRRL = (unsigned char)ubrr;
//UBRRL=47
}
|
USART
harus diinisialisasi sebelum komunikasi dilakukan. Proses inisialisasi
biasanya terdiri dari pengaturan
baud rate, pengaturan format frame dan mengaktifkan(enable) Transmitter atau
Receiver/Penerima tergantung pada penggunaan. Untuk operasi USART dgn
interupsi, Global Interrupt Flag harus diclearkan (dan interupsi
dinonaktifkan secara global) ketika melakukan inisialisasi.
Bit Flag TXC dapat digunakan untuk memeriksa bahwa Transmitter telah menyelesaikan semua transfer, dan bit flag RXC dapat digunakan untuk memeriksa bahwa tidak ada data yang belum dibaca dalam buffer penerima. Perhatikan bahwa Flag TXC harus diclearkan sebelum pengiriman (sebelum UDR ditulis) jika digunakan untuk pengiriman.
Bit Flag TXC dapat digunakan untuk memeriksa bahwa Transmitter telah menyelesaikan semua transfer, dan bit flag RXC dapat digunakan untuk memeriksa bahwa tidak ada data yang belum dibaca dalam buffer penerima. Perhatikan bahwa Flag TXC harus diclearkan sebelum pengiriman (sebelum UDR ditulis) jika digunakan untuk pengiriman.
Berikut ini contoh inisialisasi dan
program penerimaan dan pengiriman dgn AVR USART.
Pemrograman
AVR USART dgn AVR Studio
Pemrograman
USART dgn codevision
Pada pemrograman dgn codevision anda
tdk perlu pusing menghitung nilai register control UCSR dan register
UBRR , cukup gunakan tool codewizard.
klik Tools ->Codewizard ,
pilih tab USART sbb:
Setelah USART anda
setting sesuai kebutuhan pd tab USART , code template dan nilai seting
register register USART otomatis akan dibuatkan oleh codevision setelah anda
mengklik menu generate,save and exit , hasilnya seperti dibawah ini
:
#include <mega32.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART
Receiver buffer overflow
bit rx_buffer_overflow;
bit rx_buffer_overflow;
// USART Receiver interrupt service
routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index ==
RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{rx_counter=0;
{rx_counter=0;
rx_buffer_overflow=1; };
//Ketik data anda disini
};
}
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On (RXEN=1)
// USART Transmitter: On (TXEN =1)
// Receive interupt aktif (RXCIE=1)
// USART Mode: Asynchronous (UMSEL=O)
// USART Baud rate: 9600
UCSRA=0×00;
UCSRB=0×98; //10011000
UCSRC=0×86; //10000110
UBRRH=0×00;
UBRRL=0×47;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On (RXEN=1)
// USART Transmitter: On (TXEN =1)
// Receive interupt aktif (RXCIE=1)
// USART Mode: Asynchronous (UMSEL=O)
// USART Baud rate: 9600
UCSRA=0×00;
UCSRB=0×98; //10011000
UCSRC=0×86; //10000110
UBRRH=0×00;
UBRRL=0×47;
// Global enable interrupts
“sei” , sebaliknya “cli” clear interupt.
#asm(“sei”)
while (1)
{
// Place your code here
{
// Place your code here
};
}
}