Microcontroller memiliki metode untuk berkomunikasi dengan perangkat diluarnya. Salah satu metode komunikasi yang standarnya masih banyak dipakai dan umum digunakan adalah komunikasi asynchronous / UART. 
Terminal Serial Tahun 70-an
Apakah itu UART?
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)
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)
Sebuah UART biasanya berisi komponen-komponen berikut:
- 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
Tegangan dari RS232 tidak mengikuti level TTL/5V tetapi seperti gambar
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
klik untuk memperjelas
Ayo kita berlanjut ke Praktek sebenarnya , karena metode belajar yang paling cepat adalah dengan terjun langsung ke permasalahan dilapangan.
(klik buat memperjelas)
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
inisialisasi awal
Inisialisasi USART dari attiny2313
Routine pengiriman text lewat progmem/flash memory
Interupt saat menerima input data serial dari PC
Interupt saat Tombol ditekan dan mengirim data ke PC
Program utama / main
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.
#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.
 




 
 
 
 
 
 
 
0 komentar:
Posting Komentar