PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS485 (MAX485) & Widerstände



Spritey
17.02.2005, 15:30
Hallo zusammen,

ich habe ein 'kleines' Problem.
Ich habe 3 PIC's mit MAX485 Treibern vernetzt.
So wie in der Zeichnung:
http://www.elektronik-projekt.de/content/images/rs485_bus.gif

Ich habe als letztes Byte was übertragen wird immer eine XOR-Checksum. Jetzt ist es dummerweise so das diese nicht stimmt. Ich habe mir die gesendeten Daten mal anzeigen lassen und festgestellt, dass nie das ankommt was ankommen soll. Ich hab keine Ahnung woran das liegen könnte.
Das einzige was mir komisch vorkommt sind die Abschluss-Widerstände in der Zeichnung.
Im Datasheet vom MAX485 sind nur zwei 150Ohm Widerstände als Abschluss eingezeichnet.

Kann mir jemand die Widerstände genauer erklären und mit vllt bei meinem Problem helfen?

Vielen Dank

Fränki
17.02.2005, 16:22
Tach,
würde mal vermuten das du dir dein Programm nochmal anschaust, die RS485 Schnittstelle ist recht robust, da kommt ( eigentlich ) immer an was gesendet wurde.
Die widerstände haben etwa folgende Funktion:
R1+R4 PullUp zusammen mit R3+ R6 PullDown bilden ein 'stabiles' Verhältniss für einen inactiven Bus ( alle Clients im RX Mode )
Die Widerstände R2+ R5 sind 'echte' Leitungs-Abschluss Widerstände die Reflektionen etc. verhindern.

Was machst du den damit? Hast du dir schon ein Protokoll ausgedacht?
Hast du ein RS232 -> RS485 Converter?
( interessiert mich, für ein baldiges Projekt )

17.02.2005, 22:02
Ich würd mir mal die Differenzpegel direkt auf einem Oszii angucken, und wenn die dann wirklich "different", also mit scharfen Ecken sind, dann hast du 'nen Programmierfehler.
Ansonsten glaub ich das du die Busleitungen nicht richtig terminiert hast. Und zwar kenn ich das nur so: Zwischen A und B müssen wiederstände zur anpassung sitzen. Diese bestimmen dann wie das differenzsignal aussieht.
Also guck dir das mal an.

Spritey
18.02.2005, 11:54
Guten Morgen,

@Fränki / all:
Also ich hab mir auch schon gedacht das es am Protokoll oder an der Geschwindigkeit liegen könnte. Als Protokoll hab ich es einfach wie bei RS232 gemacht. (Startbit - 8Bit Daten - Stopbit (kein 9tes bit)) Ich sende zuerst die Adresse dann einen Befehl, Daten und zum Schluss meine XOR die addr^cmd überprüft.
Das Start- und Stopbit sind jeweils eine Bitlänge lang (bei 9600 Baud). Die eigentlichen Daten werden im normalen PIC Takt übermittelt. (4 bzw. 1MHZ)

Ich habe vor, mehrere Sensoren bzw. aktive Elemente über einen PC zu steuern. Dazu habe ich ein Interface was mit der Seriellen Schnittstelle mit dem PC verbunden ist. (ohne MAX232, nur mit einem 22kOhm). Die Daten gehen in einen PIC und der verarbeitet die Daten und schickt sie event. über einen MAX485 an die Elemente.

@Gast / all:
Wo genau müssen die Widerstände sitzen? Am Ende der Leitung oder vor dem jeweils letztem MAX485? Und, kann man die Widerstände berechnen bzw. messen?

Vielen Dank

Fränki
19.02.2005, 13:56
Tach,

zu den Widerständen: ja, die sollen am Anfang und am Ende des Datenkabels (R2,R5) sitzen, die PullUp/Down's irgendwo...
Ich halte die aber wirklich nicht für so entscheidend wenn die Kabellänge unter ~10- 20 Metern liegt
Schau mal hier: http://www.pci-card.com/rs422_rs485.html
und: http://www.bb-europe.com/tech_articles/rs422_485_app_note/table_of_contents.asp

Zum Protokoll:
verstehe ich das richtig: du sendest (ohne UART ) direkt hausgemachte Bit's durch den 485 Bus? ... schicke Sache das...
Dann ist dein Startbit zur Syncronisation um alle PIC's in eine Data-Receive Routine zu bringen?
Nachdem die PIC's alle die Adresse gelesen haben klinken sich alle nicht- Adressierten aus dem Datenpaket aus und warten wieder auf ein Start-Bit ( besonders lang ) ?
Übermittelst du eine Länge der Datenpakete?

hoffe du hast Zeit und lust dazu noch ein wenig zu schreiben

Gruss Frank

Fränki
19.02.2005, 15:21
noch etwas:
Klar ist noch (hoffentlich) alle PIC Module verwenden die gleiche Masse ja?
D.h. alle Massespannungen sind verbunden...
( event.: entschuldige den Hinweis )
Gruss

Spritey
19.02.2005, 15:40
Hallo,

ja, du hast das schon richtig verstanden.
Ich sende direkt die Bits vom PIC in den BUS. Das ganze ohne UART weil mein PIC keine UART SChnittsetelle hat. Das Startbit dient zu Syncronisation, wobei ich (noch) keinen ChangeState-Interrupt verwende. Alle Slaves deren Adresse nicht stimmt klinken sich für eine feste Zeit aus dem Geschehen aus. Für mein Projekt ist es eigentlich nicht wichtig das die übermittelten Daten verschieden groß sein könnten, deswegen werden immer 4 Byte gesendet. Die Slaves warten ab dem Startbit einfach die Zeit ab und hören dann wieder genau hin.

Und, ja die PIC's verwenden die selbe Masse. Trotzdem für danke für den Hinweis.

Aber nochmal zu meinem Problem:
Ich hab eine Interface. Das bekommt jetzt 8 Bit über Rs232 übergeben. Das Interface sendet diese über dem BUS zu einem zweiten PIC. Der empfängt das Byte und sendet es unverändert zum Interface zurück. Und das Interface sendet die empfangenen Daten dann unverändert über RS232 wieder zum PC zurück.
Ich kann RS232 als Fehlerquelle ausschließen. (Hoffentlich)

Angenommen ich sende D'255' vom PC los... dann bekomme ich immer als Rückmeldung D'127'.
Wenn ich einen anderen Wert unter D'250' nehme kommen verschiedene Werte zurück. Ich sende jetzt übrigens auch über den BUS mit 9600Baud.

Ich kann mir das einfach nicht erklären ...

Thx

PS: Ich verwende jetzt als Pull-Up bzw. Down 100kOhm und als Endwiderstand 120Ohm.

Fränki
20.02.2005, 13:46
Tach,
ich würde dir folgendes empfehlen:
Zerlege deine Aufgabe in ganz viele kleine Step's die du erst ausgiebig testest: Du bist dir nicht sicher ob schon die Empfangs-Routine vom PC zum Bus-Master funktioniert? Als teste es:
Schreib dein Prog. so um, das es einfach jedes empfangene Byte an einen Port ausgibt und prüfe mit Voltmeter ob das ankommt was du erwartest. Dann prüfst du deine Pic- RS232 Senderoutine usw...
gruss
Frank

tehat
10.03.2005, 12:00
Also für mich sieht dass ziehmlich nach einem kleinen Fehler vom PIC-Programm aus 255 / 2 = 127 --> Erstes Bit fehlt - nachdem du die Daten nich mit einem UART-Interface herausschreibst sondern wirklich bitweise ( soweit ich das mitbekommen habe) ist das glaub ich auch höchst wahrscheinlich.

Mfg
Has