UART adalah mode komunikasi serial secara asynchronous, dimana data (bit) dikirim berurutan secara satu persatu bergantian melalui kabel ganda ( twisted pair Tx & Rx)
UART memiliki kecepatan transfer data yg ditentukan oleh pihak pengirim & penerima yg dinamakan BAUDRATE
Pengirim akan mengirimkan data secara serial, dan penerima akan mengolah data BIT (umumnya 8bit) menjadi data 1byte yg digunakan sesuai keperluan
UART memiliki level TTL 5 volt, dan menggunakan 2 buah I/O port (Tx & Rx)
- Generator clock : biasanya kelipatan dari bit rate untuk memungkinkan pengambilan sampel di tengah periode bit.
- Register Input Output
- Kontrol kirim (TX) dan terima (RX)
- Kontrol logika read write
- Buffer I/O (opsional)
- Paralel Bus Buffer (opsional)
- Buffer First In First Out (FIFO) (opsional)
Apakah itu RS232 ?
RS 232 adalah standar signaling dari sebuah komunikasi serial. Pada umumnya PC keluaran sebelum 2010-an akan memiliki sebuah port serial/RS232. Komunikasi RS232 terbatas hanya untuk beberapa meter saja, dan jika membutuhkan jarak lebih maka membutuhkan protokol lain seperti RS485
Bagaimana Mengubah level UART ke RS232 ?
Untuk mengubahnya diperlukan level converter sejenis MAX-232. Prinsipnya adalah dengan menggunakan charge pump capasitor.
Alternatifnya adalah menggunakan rangkaian sederhana menggunakan transistor yang pernah dibahas juga di sini
Ayo kita berlanjut ke Praktek sebenarnya , karena metode belajar yang paling cepat adalah dengan terjun langsung ke permasalahan dilapangan.
PART LIST :
- ATTiny2313
- Max232
- Xtal7.3278 MHz (xtal lain bisa juga dengan catatan akan timbul error rate beberapa % sesuai datasheet)
- Led
- Push button
- Beberapa buah capasitor 10uF/16 volt dan resistor 10K
- DB-9 Female
- Kabel Serial (untuk PC jadul)
- USB to RS232 converter untuk Laptop masa kini
SOURCE CODE akan kita bahas satu persatu
#define F_CPU 7372800UL //frek xtal yang dipake
#include <avr/io.h>
#include <util/delay.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//rumus penentuan baudrate
#define USART_BAUDRATE 9600 // baudrate 9600 bps
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
//deklarasi menu & tulisan .
// digunakan memori flash(PROGMEM) karena attiny cukup kecil RAM nya
const char menu[] PROGMEM = "
\r* AVR ATTiny2312 - Rs232 COM by: ahocool@gmail.com *
\r Petunjuk:
\r ** TRANSMIT: Tekan Tombol Keyboard 1 & 2 untuk On/Off LED 1 & 2
\r ** RECEIVE: Tekan Tombol Switch untuk Menerima Data dari Micro
\r" ;
const char tombol[] PROGMEM ="
\r Tombol Ditekan
\r" ;
const char led1on[] PROGMEM ="
\r LED 1 ON
\r" ;
const char led1off[] PROGMEM ="
\r LED 1 OFF
\r" ;
const char led2on[] PROGMEM ="
\r LED 2 ON
\r" ;
const char led2off[] PROGMEM ="
\r LED 2 OFF
\r" ;
int led1, led2 ; //variabel untuk led
Inisialisasi USART dari attiny2313
void init_usart(void)
{
cli();
UCSRB |= (1 << RXEN) | (1 << TXEN); // kirim & terima
UCSRC |= (1 << UCSZ0) | (1 << UCSZ1);
UBRRL = BAUD_PRESCALE;
UBRRH = (BAUD_PRESCALE >> 8);
UCSRB |= (1 << RXCIE); //interupt serial usart
sei();
}
Routine pengiriman text lewat progmem/flash memory
//function untuk mengirim text single
void USART_Tx(unsigned char data)
{
while (!(UCSRA & (1<<UDRE)));{} // wait till transmit Data register is empty
UDR = data; // Send data to the computer
}
//function untuk kirim kalimat
void kirim_text(const char *data)
{
while (pgm_read_byte(data) != 0x00)
USART_Tx(pgm_read_byte(data++));
}
Interupt saat menerima input data serial dari PC
ISR(USART_RX_vect)
{
char databyte;
databyte = UDR;
switch (databyte) // pemilah data yg diterima dari PC
{
case 0xD : { // jika yg diterima ENTER (0xD)
kirim_text(menu) ;
break; }
case '1' : { //jika diterima karakter 1
if(led1 == 0) // jika kondisi awal 0
{
PORTB ^=(1<<0); //toogle dari kondisi sebelumnya
kirim_text(led1on) ;//kirim kalimat
led1=1;
}
else
{
PORTB ^=(1<<0); //toogle dari kondisi sebelumnya
kirim_text(led1off) ; //kirim kalimat
led1=0;
}
break; }
case '2' : {
if(led2 == 0) // jika kondisi awal 0
{
PORTB ^=(1<<1); //toogle dari kondisi sebelumnya
kirim_text(led2on) ; //kirim kalimat
led2=1;
}
else
{
PORTB ^=(1<<1); //toogle dari kondisi sebelumnya
kirim_text(led2off) ; //kirim kalimat
led2=0;
}
break; }
}
}
Interupt saat Tombol ditekan dan mengirim data ke PC
SIGNAL (SIG_INT0)
{
kirim_text(tombol); //kirim kalimat bahwa tombol ditekan
}
Program utama / main
int main(void)
{
DDRB=0b11; //B0,B1 = Output ke led
MCUCR |= (1<<ISC01) | (1<<ISC00) ; //inisialisai interupt 0 rise edge
GIMSK |= (1<<INT0) ; // tombol ada di INT 0
led1=0; //kondisi awal led1
led2=0; //kondisi awal led2
init_usart();
kirim_text(menu) ;
PORTB=0b00; // matikan LED
while(1) //muter tiada henti
{
}
return 0;
}
Jika sudah di compile & didownload ke AVR, maka hubungkan output MAX232 ke PORT Serial PC ato port USB-serial Converter. Gunakan Hyperterminal/putty/secureCrt untuk melakukan koneksi ke COM PORT dari serial port/Usb-serial converter dengan setting BAUDRATE 9600bps
Video berikut menampilkan contoh komunikasi serial UART dan RS232 ke PC untuk mengontrol nyala LED dan membaca penekanan tombol.