Pemrograman RS232 / RS-485 dg Visual Basic 6

Komunikasi data AVR dan PC menggunakan RS-485

Pendahuluan

Project ini hanya sebagai salah satu contoh saja   (contoh2  yang sejenis ada pada artikel2 lainya) ,   bagaimana menghubungkan beberapa microcontroller (dlm contoh ini Atmega8535) dgn PC melalui port serial dengan menggunakan RS-485.

perbandingan rs232 dan rs485:

-rs232 hanya menghubungkan antara 2  host (pc ke pc atau pc ke microcontroller) dan jarak maximal kira2  15 meter saja

-Rs485 bisa menghubungkan  beberapa host  ( 1  master dan beberapa slave )  master bisa berupa PC atau Microcontroller dan slave bisa beberapa PC atau microcontroller.

Komponen yang dibutuhkan:

1.  Rs232 to rs485 Converter

2.  modul Atmega8535 + IC max485

3.  CodeVision versi trial  (download gratis)

4.  Kabel telpon  (tergantung jarak PC dgn modul Atmega8535)

Rangkaian :

Rs-485 network

Detail rangkaian slave (microcontroller Atmega8535)

Code program dalam Visaual Basic 6:

clientrs485

Private Declare Function GetTickCount Lib “kernel32″ () As Long

Dim Timeout As Boolean
Dim data_pantulan As String
Dim perintah As String
Dim messagetosend As Variant
Dim transferprogress As Boolean

‘============================

Private Sub Form_Load()

If MSComm1.PortOpen = True Then Exit Sub

MSComm1.Settings = “9600,N,8,1″

MSComm1.CommPort = 1
MSComm1.PortOpen = True

End Sub

Private Sub kirimdata_Click()
txtdata_dari_slave.Text = “”
MSComm1.RTSEnable = False
Sleep (300)
MSComm1.Output = txtdatatosend.Text
Sleep (300)
MSComm1.RTSEnable = True

Call getResponse
End Sub

Private Sub getResponse()
Static responseBuffer As String
Dim inbuff As Variant
Dim length As Integer
Dim pcount As Long
Dim ccount As Long
Dim duration As Long
duration = 1000

pcount = GetTickCount()
Do While True
inbuff = MSComm1.Input
If Len(inbuff) > 0 Then
responseBuffer = responseBuffer + inbuff
length = Len(responseBuffer)
If responseBuffer <> “” Then
txtdata_dari_slave.Text = responseBuffer   ‘ received a complete response string
responseBuffer = “”
Exit Sub
Else
End If
End If
ccount = GetTickCount()
If ccount >= pcount + duration Then Exit Do  ‘
Loop
txtdata_dari_slave.Text = “no response”
End Sub

===================================================

‘jika slave nya banyak ( contoh disini ada 8 slave)
Private Sub PollSlave()
Dim no_slave As Integer
Dim buffer As Variant
Dim alamat As Integer
Dim ack As Boolean
Dim reply As Boolean
Dim data_dari_slave As String
alamat = &H67
transferprogress = True
‘mengirim alamat node tunggu ack ,kirim perintah  dan menunggu reply data
‘kemudian simpan hasil

For no_slave = 1 To 8
‘txtno_slave.Text = no_slave
‘======hapus inbuffer dan outbuffer
MSComm1.OutBufferCount = 0
If MSComm1.InBufferCount > 0 Then
buffer = MSComm1.Input
End If
‘===================================
Call enabletransmitter ‘ –>

alamat = alamat + 1   ‘ alamat = 68h,69h,6Ah,6Bh,6Ch,6Dh,6Eh,6Fh
alamat_slave = Chr(alamat)
txtno_slave.Text = alamat_slave
buffer = Chr(alamat)
‘MsgBox buffer
‘kirim alamat ke i
MSComm1.Output = buffer
‘=======================================================================
Do ‘tunggu pantulan byte alamat yg dikirim
txtstatus.Text = “tunggu pantulan alamat = ” & buffer
tmrTimeout.Enabled = True
Timeout = False
‘===============sampe trima 1 byte alamat pantulan
Call disabletransmitter  ‘<–
Do
DoEvents
Loop Until (MSComm1.InBufferCount >= 1) Or (Timeout = True)
‘=================

If Timeout = False Then

tmrTimeout.Enabled = False
‘baca byte pantulan  dan bandingkan dgn yg dikirim
data_pantulan = MSComm1.Input
txtalamatslave.Text = txtalamatslave.Text & Asc(data_pantulan)
If StrComp(data_pantulan, alamat_slave, vbBinaryCompare) <> 0 Then
ack = True
txtstatus.Text = “alamat sama okehh”
Else
ack = False
txtstatus.Text = ” alamat  beda”
End If

Else
lbtimeout.Caption = “waiting adress timeout slave no ” & no_slave
ack = False
End If
Loop Until ack = True Or Timeout = True
tmrTimeout.Enabled = False
Timeout = False
‘=========================================================================
txtinbuffer.Text = ” count= ” & MSComm1.InBufferCount & “  size = ” & MSComm1.InBufferSize & “  isi = ” & MSComm1.Input

If ack = True Then
‘================================================================
Call enabletransmitter  ‘–>  Out
perintah = “b”  ‘kirim perintah baca data output
messagetosend = perintah
tmrTimeout.Interval = 1000
tmrTimeout.Enabled = True
ack = False
MSComm1.Output = messagetosend

Call disabletransmitter  ‘<– IN
Do

Timeout = False

Do
DoEvents
Loop Until (MSComm1.InBufferCount > 4) Or (Timeout = True)

lbtimeoutdata.Caption = “waiting reply data timeout slave no ” & no_slave

If Timeout = False Then
tmrTimeout.Enabled = False
data_dari_slave = MSComm1.Input

reply = True
If StrComp(Asc(Left(data_dari_slave, 1)), alamat, vbBinaryCompare) <> 0 Then
txtoutput_ok.Text = data_dari_slave
‘ txtoutput_ng.Text = Asc(Val(“&h” & Mid(data_dari_slave, 4, 2)))
‘simpanhasil(no_slave,output_ok,output_ng)
txtdata_dari_slave.Text = txtdata_dari_slave.Text & Asc(data_dari_slave)
txtstatus.Text = “alamat cocok”

Else
‘alamat data tdk cocok
txtstatus.Text = “alamat tdk cocok”
End If

Else
lbtimeoutdata.Caption = “waiting reply data timeout slave no ” & no_slave

End If

Loop Until reply = True Or Timeout = True
tmrTimeout.Enabled = False
‘====================================================
End If
txtoutbuffer.Text = ” count= ” & MSComm1.OutBufferCount & “  size = ” & MSComm1.OutBufferSize

Next no_slave

transferprogress = False
tmrTimeout.Enabled = False
txtstatus.Text = “selesai 1 loop”
End Sub

===================================================

Sofware untuk microcontroller Atmega8535 sebagai slave

=====================================================

contoh  Program Avr Atmega8535  (codevision)

#include <mega8535.h>
#asm
.equ __lcd_port=0×15
#endasm
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
#include <ctype.h>
//char lcd_buffer[33];         //-128 to 127

unsigned char  r_index, r_buffer[40], r_char; //0 to 255

void main(void)
{
lcd_init(16);
UCSRA=0×00;
UCSRB=0×98;
UCSRC=0×86;
UBRRH=0×00;
UBRRL=0×47;

delay_ms(500);
PORTD.7=0;
/*r_buffer[0]=’c’;
r_buffer[1]=’o’;
r_buffer[2]=’b’;
r_buffer[3]=’a’;
r_buffer[4]=”;
*/
delay_ms(500);
lcd_putsf(“test comm”);
#asm(“sei”)
while(1) {
r_index=0;
//  UCSRB.7=1;

lcd_puts(r_buffer);  //display data di ram, klo di flash pake lcd_putsf

}

}

interrupt [USART_RXC] void usart_rx_complete(void)
{

lcd_clear();
r_char= toascii(UDR);

if(r_char==’u’)
{
delay_ms(100);
PORTD.7=1;
delay_ms(300);
lcd_putsf(“85->replied”); //85     79=”, 80=p 81=q 82=r  83=s 84=t
delay_ms(200);
putchar(‘u’) ;

}

else if(r_char==’y’)
{
delay_ms(100);
PORTD.7=1;
delay_ms(300);
lcd_putsf(“89->replied”); //89     79=”, 80=p 81=q 82=r  83=s 84=t
delay_ms(200);
putchar(‘y’) ;
}
else
{

if (r_char != ‘x’)   //88
{
r_buffer[r_index++]=r_char;
}
else
{

r_buffer[r_index]=0×00;     //
//UCSRB.7=0;
}

delay_ms(100);
PORTD.7=0;
delay_ms(100);

}
}

================================================

References :

– Serial Port Complete Programming & Circuits Rs-232 & Rs485,  Jan Axelson

– Codevision AVR  , help file

http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/

About pccontrol

Berisi Tutorial Menggunakan PC untuk mengontrol Peralatan dengan cara mudah & praktis untuk pemula.

Posted on 19/04/2011, in Contoh-contoh Aplikasi. Bookmark the permalink. 44 Comments.

  1. kok procedure getTickCount tidak ada di program ya mas? boleh minta

  2. mas salam kenal ni. saya mau nanya ni. gimana caranya mau kirim data untuk mengendalikan indikator timbangan ya? yang memiliki Master Transmission sebagai berikut:
    STX ADD K 0 xx BCS2 BCS1 ETX mohon bantuannya ya mas.

  3. jika temperature controllernya menyediakan port RS485 seharusnya bisa. Kalau boleh tau temperatur controllernya merk dan typenya apa?

  4. mas,artikel nya sangat membantu..

    ada yang mau saya tanyakan, kalau rangkaian slave nya bukan mikrokontroler, tetapi diganti temperature controller yg komunikasi dengan PC menggunakan rs232 to rs485 converter, apakah bisa?soalnya saya coba baca dengan program simple pake vb 6.0 seperti ini :

    Private Sub Command1_Click()
    MSComm1.PortOpen=True
    End Sub

    Private Sub MSComm1_OnComm()
    Text1.Text=MSComm1.Input
    End Sub

    tidak terjadi apa-apa.. apakah masih butuh ADC sblm koneksi ke rs232 to rs485 converter?

    mohon pencerahannya

  5. gan klo konsep RFID itu sama g?. saya cuma mau nampilin data kartu ke program VB 6.0 gan. Tapi saya ud coba pake koding agan yg diatas :

    If MSComm1.PortOpen = True Then Exit Sub

    MSComm1.Settings = “9600,N,8,1″

    MSComm1.CommPort = 1
    MSComm1.PortOpen = True

    bz itu gmn lagi y gan, niat nya ane mau buat bahan skripsi juga nti tuh data kartu di simpen ke mysql, asal data bisa muncul di kolom textbox girang dah ane gan..

    ane ud coba pake codingan dari mbah google g nemu – nemu gan. Maklum gan di ajarin nya kebanyakan bkin sistem doank, ane tertarik sama nyambungin alat gtu pas liat orang seminar pake VB. tolong ane gan. plz..

  6. dari segi pemrograman sama dengan memprogram rs232

  7. mas klo caranya pengiriman data pake arduino sma Rs 485 tuh gmna mas??

  8. ya, jika ingin membentuk jaringan rs485 master dan setiap client harus menggunakan max485.

  9. resisitor 1k sbg pull up bagian dari rangkaian switch. dihubungkan ke vcc.

  10. fadli maulana

    apa setiap koneksi dari atmega dengan Rs232 harus menggunakan Max485?

  11. Thank you mas atas blog nya, membantu sekali.. Saya mahasiswa yg sedang mengerjakan tugas akhir padafakultas teknik jurusan teknik elektro.. Saya ingin bertanya, pada gambar ke 2, ada 5 buah resistor 1k ohm.. Itu masing2 1k ohm kan?? Dan pemasangan nya k mana kah resistro tersebut, saya kurang mengerti karena harnya diakhiri dot, dan tidak dijelaskan disambung k mana?? Apakah di seri atau di paralel k mana??
    atas penjelasan nya, saya capkan terima kasih..

  12. Alat tsb(PM710) bisa dihubungkan ke PC menggunakan komunikasi modbus RTU melalui PORT RS495. silahkan pelajari protokol modbus , diblog ini sudah dibahas. kalau mau kursus modbus juga bisa dgn kelas-mikrokontrol.com waktu sabtu minggu.

  13. Mas, mau nanya. .saya masih awam di bidang ini, tapi sy mohon petunjuk dan bimbingannya. . Jadi gini. . di kntor saya ada monitor KWH Meter Pembangkit digital 3 phasa merek Schneider type PM710, sy perhatikan di PM710 itu ada port RS 485 >> http://www.habetec.com/product/102/281/
    Nah.. pertnyaan saya apakah bisa sy hubungkan monitor KWH meter dari PM 710 ini ke PC? Klo bsa caranya gimana mas?

  14. pin portD.7 untuk memilih mode terima atau kirim. portD.7=1 untuk mengirim, portD.7=0 berarti micon siap menerima data.

  15. mas mau tanya untuk rangkaian rs 485 ke atmega8535 kan itu dhubungkan ke pin 21(pd7), tu hanya untuk nentuin 1/0 nya ya,,,sya dah coba, hasilnya data berhasil diterima mikro, cmn pas ngirim data ke pc tidak berhasil,,,klo langsung rs232 gda mslh tx/rx nya berhasil tnpa hambatan,,, mohon pencerahannya mas,,,terima kasih

  16. sama2.. tetap semangat

  17. Alhamdulillah sudah bisa pak

    nuwun :)

  18. coba2 dulu ya, sptnya mudah :-)

  19. maaf tanya lagi mas… heheehe

    kalau kita mau trima data karakter dari VB terus buat nyalain 1 buah led seperti itu kodingnya bagaimana ya.. agak bingung..

    maaf merepotkan…

  20. baris code program:

    interrupt [USART_RXC] void usart_rx_complete(void)

    ini adalah dibuatkan oleh IDE codevision ketika kita menset up konfigurasi interrupt mcu AVR menggunakan codewizard.

  21. mas saya dhanang,
    mau tanya…

    potongan code di ATMega8535
    interrupt [USART_RXC] void usart_rx_complete(void)

    -itu sudah ada pada waktu buat projec awal apa nulis sendiri lagi??
    -itu buat terima data dari vb bukan?? atau hanya pakai “toascii(UDR)”

    mohon pencerahannya..
    matur nuwun

  22. mau tanya, baca data ADC utuk ditampilkan ke PC dengan VB.6 coding sederhananya gmn ya?
    terima kasih

  23. mas.ini kan ada VB nya?
    bagaimana tampilan VB nya.
    saya minta data2nya dong mas.saya lg mulai mempelajari VB dan mikro.
    kirim ke email saya ya.
    martak_ahmad@yahoo.com
    thanks b4.

  24. Mas.. dibagian program ATMega8535 nya, routine untuk ngirim data ke komputer gimana ya..?

    Terimakasih banyak mas.

  25. ya anda betul alamat harus sama, silahkan disamakan :-)

  26. Mas, maaf tanya… Gimana hubungan antara alamat yang telah dideklarasi di program Visaual Basic (h68, h69, …) dengan yg ada di mikronya. Koq kalau saya lihat gak sama ya.. yang ada dimikro character “u” yg punya hexa 75, atau character “y” yg hexanya 79. Trims banyak ya mas..

  27. eko waryanto

    Pak tolong share source code vb6 dan assembler AT 89S51 nya dong untuk pengontrol on/off 16 bh lampu dan report status dari masing-masing lampu tersebut. terima-kasih ya pak.

  28. pada RS485 kaki 2 diset 0 untuk untuk receive enable, kaki 3 diset 1 untuk transmit enable. pin tsb bisa dihubungkan ke pin Port mana saja , tdk ada hubunganya dgn timer.

  29. mas,klo sya tidak memakai timer,apakah kaki 2dan3 RS485 di slave harus dihubungkan dengan kaki 18 di AT-MEGA 8535?Klo harus dihububgkan,apa fungsiny?

  30. -Pengiriman perintah ke slave bisa secara manual oleh klik user atau menggunakan timer.
    -pemberian alamat pada slave dilakukan didalam program.
    -master bersifat komando tunggal , jadi semua terserah master mau nunggu respon slave atau tdk. slave hanya bersifat pasif.
    – untuk lebih jelasnya anda bisa baca artikel lainya ttg hal tsb di blog ini, tdk cukup membaca contoh aplikasinya saja okeh :-).

  31. Mas tanya lagi, tlg jelasin secara rinci mekanisme pengiriman perintah dari master ke slave dan pengalamatan utk micronya (maksud sy gimana ngasih alamat dimasing2 micro yg jadi slavenya), apa master saat mengirim perintah sllu menunggu respon dari slave yg merespon bahwa alamt td bener ditujukan ke slave yg dimaksud, tlg dijelasin dg rinci yaa mas, sm listing programnya yg mana??
    TQ bgt yaa mas, butuh banget penjelasnya nih

  32. iya , tetep semangat.

  33. Ok2 Tq Mas, tak cobae lagi ini, pantang menyerah ini he3 :-)
    jgn bosen2 dengan pertanyaanku yaa mas, soalnya lagi bth bimbingan nih dari semua pihak, demi selesainya skripsi saya wkwkwkwk.
    TQ

  34. ya, betul sekali :-)

  35. iya sdh mas, cm blm paham aja, brarti itu deklarasi tambahan yg gak perlu dimasukan ke objectnya yaa??

  36. Mas Mau tanya lagi, statement ini “Private Sub PollSlave()” objectnya berupa apa yaa, commandbox, textboxt ato ada tambahan lain??
    TQ

  37. iya itu contoh buat gambaran bagi pemula yg sedang mempelajari terorinya. sebaiknya anda pelajari dulu teorinya sampai faham. sebenernya ga susah asal bertahap. okeh.

  38. contoh code program RS-485 Tester


    Mas utk artikel ini listing program sdh saya coba tp saya bingung sendiri, tinggal sy copy paste aja tp gak bs, maklum msh blm bs vb, kalo berkenan boleh minta file project vb nya lengkap sm file yg didownloadkan ke mikronya.
    Terima Kasih bny sebelumnya mas.

  39. perintah ini : Call enabletransmitter ganti dgn MSComm1.RTSEnable = False
    perintah ini : Call disabletransmitter ganti dgn MSComm1.RTSEnable = True

  40. maaf nih mau jawab:
    1. kalau jarak master -slave deket (semeter 2 meter) resistor tsb ga apa2 dihilangkan.
    2. contoh yg ini juga mirip : https://pccontrol.wordpress.com/2011/06/08/contoh-code-program-rs-485-tester/
    3. maaf sy ga faham dgn pertanyaanya.
    4. ada dicontoh : https://pccontrol.wordpress.com/2011/06/05/contoh-adc-atmega8535-dgn-resolusi-10-bit/
    TQ juga atas pertanyaanya.

  41. Mas maaf nih mau tanya, ada beberapa pertanyaan yaa, butuh bantuan banget buat skripsi mas,
    1. kalo semisal resistor yg utk keluaran RS 485 (470 dan 120 Ohm) dihilangkan ada efeknya gak??
    2. Boleh minta pic untk tampilan program vb nya gak?
    3. itukan keluaranya utk lcd, kalo diport A,B,C ato D, yg mana yg perlu diganti??
    4. kalo misal mau ditambahi feedback dari ADC, listing nya ditambahi gmn yaa mas??
    TQ before

  42. maksimum 1200 meter dan maksimum ada 32 microcontroller,
    tapi bisa di expand dengan IC repeater circuit bisa lebih panjaaanng dan lebih banyaaak node/slave (micon).

  43. untuk jarak maksimal dari koneksi RS485 brapa mas??thx atas source-code nya…

Leave a reply to dontchange