RS485 atau TIA/EIA-485 dapat digunakan untuk komunikasi serial dengan jarak yang sangat jauh dan memiliki banyak titik (multipoint). Multiple receiver (penerima) terhubung dalam jaringan yang paralel, dengan kecepatan transmisi data 35 Mbit/s untuk jarak 10 meter dan 100 kbit/s untuk jarak sekitar 1200 meter.
Pada tutorial ini saya menggunakan IC MAX485/487 untuk komunikasi RS485, datasheetnya dapat didownload disini.
Komunikasi RS485 dapat digunakan dengan Half-Duplex dan Full-Duplex. Half duplex adalah komunikasi dua arah, tapi hanya satu arah pada satu waktu alias tidak mengirim dan menerima secara bersamaan tapi bergantian, sedangkan Full duplex dapat dilakukan secara simultan atau bersamaan ketika mengirim dan menerima.
Contoh berikut yang akan saya berikan adalah RS485 antar mikrokontroler, dengan 1 master dan 1 slave alias contoh dasar dan sederhana. Jika slave yang digunakan ada banyak, pada program akan lebih efektif jika menggunakan perintah modbus, tapi untuk contoh kali ini tidak pakai modbus.
Gambaran sederhana untuk perbedaan RS485 dengan Half-duplex dan Full-duplex sbb:
(Gambar (a) Hal-Duplex dan Gambar (b) Full-Duplex)
Program untuk master:
'==============================================
'Program RS485 Sederhana
'Programmer : Wahyu Rahmaniar
'Company : Technologination
'==============================================
$regfile = "m8535.dat"
$crystal = 8000000
$baud = 9600
Config Portd.2 = Output
Ddrd.2 = 1
Portd.2 = 0
Do
Portd.2 = 1
Print "-Test RS485" ; Chr(13)
Wait 1
Loop
'Program RS485 Sederhana
'Programmer : Wahyu Rahmaniar
'Company : Technologination
'==============================================
$regfile = "m8535.dat"
$crystal = 8000000
$baud = 9600
Config Portd.2 = Output
Ddrd.2 = 1
Portd.2 = 0
Do
Portd.2 = 1
Print "-Test RS485" ; Chr(13)
Wait 1
Loop
Master mengirimkan tulisan "Test RS485" dan enter atau chr(13), ketika mengirimkan tulisan master akan memberikan logika satu pada PORTD.2, sehingga pin RE dan DE yang juga menerima logika 1 akan mengirimkan data.
Program untuk slave:
'==============================================
'Program RS485 Sederhana
'Programmer : Wahyu Rahmaniar
'Company : Technologination
'==============================================
$regfile = "m8535.dat"
$crystal = 8000000
$baud = 9600
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Lcd = 16 * 2
Config Portd.3 = Output
Ddrd.3 = 1
Portd.3 = 0
Config Portd.2 = Input
Ddrd.2 = 0
Portd.2 = 1
Terima Alias Pind.2
Led Alias Portd.3
Dim X As Byte , Datas As String * 15
Datas = ""
Do
If Terima = 0 Then
Led = 1
If Ischarwaiting() <> 0 Then
X = Waitkey()
If X = "-" Then
Do
If Ischarwaiting() <> 0 Then
X = Waitkey()
If X > 0 Then
Datas = Datas + Chr(x)
End If
End If
Loop Until X = 13
Led = 0
Print Datas
Cls
Cursor Off
Locate 1 , 1
Lcd Datas
Wait 1
Datas = ""
End If
End If
End If
Loop
'Program RS485 Sederhana
'Programmer : Wahyu Rahmaniar
'Company : Technologination
'==============================================
$regfile = "m8535.dat"
$crystal = 8000000
$baud = 9600
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Lcd = 16 * 2
Config Portd.3 = Output
Ddrd.3 = 1
Portd.3 = 0
Config Portd.2 = Input
Ddrd.2 = 0
Portd.2 = 1
Terima Alias Pind.2
Led Alias Portd.3
Dim X As Byte , Datas As String * 15
Datas = ""
Do
If Terima = 0 Then
Led = 1
If Ischarwaiting() <> 0 Then
X = Waitkey()
If X = "-" Then
Do
If Ischarwaiting() <> 0 Then
X = Waitkey()
If X > 0 Then
Datas = Datas + Chr(x)
End If
End If
Loop Until X = 13
Led = 0
Print Datas
Cls
Cursor Off
Locate 1 , 1
Lcd Datas
Wait 1
Datas = ""
End If
End If
End If
Loop
PORTD.2 akan menerima data dari master jika mendapat logika 0 (hasil not dari PORTD.2 master), sehingga pin RE dan DE pada slave juga menerima logika 0 akan bertindak sebagai penerima data.
Sehingga sistem RS485 pada contoh diatas bersifat Half-duplex.
Jika ada data masuk led akan menyala. Data yang masuk diterima perkarakter dan berupa nilai byte untuk ascii kemudian diubah menjadi karakter dengan perintah Chr. Jika diterima karakter "-" maka data dibaca sampai diterima ENTER atau ascii 13. Jika data telah selesai diterima led akan mati.
Kemudian data ditampilkan pada LCD dan Hyperterminal.
Pemberian tanda awal "-" dan tanda akhir ENTER adalah untuk menghindari diterimanya noise atau pemisahan data yang tidak tepat.
Simulasi dengan proteus dan source code bisa didownload disini.
-ayuchan-