PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Duplex Datenübertragung über 20 Meter



elkokiller
16.06.2006, 21:33
Hallo,

ich möchte auf einer Strecke von ca. 20 bis 25 Meter Messdaten und Steuersignale übertragen.
Ich dachte an eine Verarbeitung der Daten mit je einem Mega8 und einem kleinen Programm in Bascom.

Nun meine Frage:
Welche Schnittstelle soll ich wählen?
Wäre eine RS232 oder RS485 besser?
Die Daten sollen duplex übertragen werden.

Wer kann mir ein paar Tips geben?

Tobias

linux_80
16.06.2006, 22:30
Hallo,
Voll- oder Halbduplex :-)

normalerweise sollte auch RS232 reichen, wenn man ein gescheites Kabel nimmt, wenn die Leitung aber an Stromleitungen usw. vorbeigeht, und auch eine höhere Geschwindigkeit gefordert ist, ist wohl RS485 bzw. RS422 besser, das lässt sich nicht so leicht stören.
RS485 kann man auch für Vollduplex auslegen, i.d.Regel hat man da aber nur Halbduplex, weils dann weniger zum stören gibt.
Und es lässt sich auch gleich ausbauen, wenn man schon RS485 angefangen hat, angeschlossen wirds auch an den UART des AVR, deshalb erstmal nicht komplizierter beim Programmieren wenn man nur 2 Teilnehmer hat.

schon im Wiki geschaut -> RS485 ?

veit
16.06.2006, 23:14
habs mit rs485 gemacht, geht prima. wenn fragen dann fragen.

elkokiller
18.06.2006, 08:46
Hallo veit,

hast du vielleicht ein kleines Beispiel?
Habe mich mittlerweile über das Protokoll informiert. Das hört sich ziemlich kompliziert an!

Tobias

veit
18.06.2006, 10:42
was für ein protokoll meinst du?

es gibt doch gar kein vorgeschriebenes protokoll, du kannst alles so machen wie du willst ...

beschreib mal mehr was du übertragen willst, vom atmel zum pc und zurück oder von atmel zu atmel oder wie?


bei mir ists so: ich tausche daten zwischen pc und atmel, der pc schickt ne anfrage los und der atmel antwortet.

elkokiller
18.06.2006, 12:47
die Theorie kenn ich von folgender Seite:
http://www.elektronik-projekt.de/include.php?path=content/articles.php&contentid=16

Um mich ein bisschen ein zu arbeiten hatte ich vor, 3 Atmega 8 über einen Max 485 zu vernetzten.
Einer ist der Master und fragt jeweils den Zustand eines Eingangs an den beiden Slave ab.

Wenn ich dazu ein kleines Beispiel hätte würde mir der Einstig sicher leidter dallen!

Hast du so was in dieser Art?

veit
18.06.2006, 20:52
jo also, ich habs so gemacht (richtet sich nach dem eslip-protokoll):

den slaves gibst du id´s, z.b. 1 +2.
dann sendet der master ein startcommando (bei eslip: 200).
dann die id.
dann z.b. einen befehl den du dir ausdenkst.
dann am besten noch eine checksumme.
zum schluss das endcommand 201.

hat der slave das empfangen antwortet der angesprochene dann ähnlich
also 200 - id - befehl bzw daten - checksumme - 201

der andere slave darf natürlich nicht gleichzeitig antworten. das würde dann kollisionen geben.

hier mal ein codeschnippsel von mir:

Check = Waitkey()

If Check = 200 Then ; solange warten bis startcommando kommt
For I = 1 To 4
Check = Waitkey()
Ar(i) = Check ; die nächsten 4 bytes speichern
Next
End If

in dem fall hier wird gerade die id nicht ausgewertet sondern nur das startcommando.
naja und dann liest du halt aus was für ein befehlt gekommen ist, z.b. befehl 1: was liegt an eingang sowieso an, und schickst die antwort.
bzw. vorher überprüfen ob die checksumme stimmt, ansonsten gar nichts tun, oder eine fehlermeldung zurückschicken oder was auch immer.

hier noch eine subroutine mit der ich den befehl 101 an die id 255 sende:


Sub Transmit_101
Startcom = 200
Command = 101
id = 255
Csum = 154
Endcom = 201


Set Portc.0 '485 auf senden
Printbin Startcom;
Printbin id;
Printbin Command;
Printbin Csum;
Printbin Endcom;

Do ' Warten bis das TXC Bit gesetzt ist.
Loop Until Usr.txc = 1

Set Usr.txc ' zum zurücksetzen von TXC muss 1 geschrieben werden
' gemäß Datenblatt
Portc.0 = 0 ' 485 auf empfang

End Sub



die id 255 ist bei mir so eine universal id auf die die geräte nicht antworten, d.h. es gibt keine rückmeldung ob der befehl angekommen ist, nur so nebenbei ...


hoffe hab schonmal nen einstieg gegeben (hab übrigens selbst kaum ahnung, hab mir das zeug hier alles zusammengesammelt), kannst gerne weiter fragen stellen.

elkokiller
18.06.2006, 21:35
super! ich denke das müsste für den Anfang genügen.

Danke
Tobias

elkokiller
24.06.2006, 22:35
Hallo veit,

habe jetzt mal versucht dein Beispiel nach zu vollziehen.
Vom Programm ist es ja eigentlich ganz simel. Ich bekomme es aber nicht in die Praxis umgesetzt.

Die Schaltung in der Anlage habe ich mit 2 Atmega 8 nachgebaut.
Jetzt möchte ich am anderen Ende einfach nur eine LED einschalten.

Wie müsste ich den Transfer in meinem Programm einleiten?


$regfile = "m8def.dat"

Const Keys = 2

Config Pinc.0 = Input


Dim I As Byte
Dim Key As Byte


For I = 1 To Keys
Key = I
Select Case Key
Case 1 : Debounce Pinc.0 , 0 , Key_o1 , Sub
Case 1 : Debounce Pinc.1 , 0 , Key_o2 , Sub

End Select

Next

Loop

Key_o1:

'..........


Return

Key_o2:

'..........


Return

veit
26.06.2006, 15:14
ääääähm sieht irgendwie ganz und gar nicht aus wie meine code-beispiele oder?

sehe nix von startcommando, gerade mal empfangen von ner 1 sonst nix.
den rs485 musst auch noch auf senden bzw. empfangen schalten
diese txc bit geschichte muss auch rein