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






Zitieren


Lesezeichen