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