Ich habe das hier mit zwei ATMega128 aufgebaut:
Sender:
Code:
$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 20
$framesize = 40
$baud = 9600
Config Pinc.6 = Output
Config Pine.2 = Output
Config Graphlcd = 240 * 64 , Dataport = Portd , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6
Dim A(8) As Byte
Dim B As Byte
Bl Alias Portc.6
Rs485 Alias Porte.2
Bl = 1
Rs485 = 1
Cursor Off
Cls
Locate 1 , 1
Lcd "RS485 Sender"
A(1) = 128 'ID
A(2) = 254 'ID
A(3) = 1 'Absender
A(4) = 2 'Empfaenger
Do
For B = 0 To 255
A(5) = B
A(6) = Crc8(a(1) , 5) 'Checksumme
Locate 7 , 1
Lcd A(6) ; " "
Gosub Send_data
Waitms 250
Next B
Loop
End
Send_data:
Printbin A(1) ; 6
Return
Empfaenger:
Code:
$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 20
$framesize = 40
$baud = 9600
Config Pinc.6 = Output
Config Pine.2 = Output
Config Graphlcd = 240 * 64 , Dataport = Portd , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6
Rs485 Alias Porte.2
Enable Interrupts
Enable Urxc
On Urxc Isrlabel
Dim A As Bit
Dim B As Byte
Dim Zeiger As Byte
Dim Db1(6) As Byte
Dim Db2(6) As Byte
Bl Alias Portc.6
Bl = 1
A = 0
Zeiger = 1
Rs485 = 0
Cursor Off
Cls
Locate 1 , 1
Lcd "RS485 Empfaenger"
Do
If A = 1 Then
Locate 3 , 1
Lcd "Absender : " ; Db2(3) ; " "
Locate 4 , 1
Lcd "Empfaenger: " ; Db2(4) ; " "
Locate 5 , 1
Lcd "Datensatz : " ; Db2(5) ; " "
Locate 7 , 1
Lcd "Checksumme: " ; Db2(6) ; " "
A = 0
End If
Loop
End
Isrlabel:
Db1(zeiger) = Udr
If Zeiger = 6 Then
For B = 1 To 6
Db2(b) = Db1(b)
Db1(b) = 0
Next B
Zeiger = 1
A = 1
End If
If Db1(1) = 128 Then
Db2(1) = Db1(1)
Db1(1) = 0
Incr Zeiger
End If
If Db2(1) = 128 And Db1(2) = 254 Then Incr Zeiger
Return
Ich uebertrage in diesem Falle ersteinmal sechs Bytes. Das soll dann spaeter eine Art Protokoll werden. Das ganze laeuft wunderbar stabil. Allerdings habe ich da auch einige Zeit experimentiert bis es einwandfrei lief.
Der Empfaenger sucht zunaechst nach den zwei ID-Bytes. Wenn diese korrekt angekommen sind, dann werden die 4 nachfolgenden Bytes verarbeitet. Sobald die Uebertragung vollstaendig ist, werden die Daten auf dem LC-Display angezeigt.
Gerade heute habe ich noch ein paar MAX485 bekommen. Sobald ich den naechsten Bastelflash bekomme, werde ich einen dritten AVR mit Display in den Bus haengen und die Software so umschreiben, dass jeder Senden und Empfangen kann.
Dafuer hatte ich auch das Empfaenger- und Senderbyte vorgesehen.
Ein Foto von dem Drahtigel:
http://www.elektronik-web.de/fotos/rs485.jpg
Mit freundlichen Gruessen
Digitali
Lesezeichen