Hallo zusammen,
ich versuche mich gerade durch RS485 zu boxen, habe allerdings zu wenig
Elektronikgrundwissen, um das mit der differenziellen Datenübertragung
richtig zu verstehen. Folgendes weiss ich bereits:
- Der Sinn ist, dass Störungen sich gegenseitig aufheben. Damit kann man
lange Strecken überbrücken.
- A wird mit B verglichen und wenn die Differenz >200mV ist, ist es eine
logische 1.
- Anscheinend verwenden alle Pläne zu RS485, die ich bisher gesehen
habe, einen externen Treiber-IC. Ich gehe deshalb davon aus, dass es nur
mit einem AVR absolut unmöglich ist, RS485 zu sprechen. Nichtmal bei
kleinsten Strecken.
Ich verstehe aber nicht, wieso. Wenn ich 485- mit GND verbinde und 485+
auf HIGH setze, habe ich 3V Differenz, also eine 1. Wenn ich + auf LOW
setze, habe ich 0V Differenz, also eine 0. GND ist angeschlossen, also
hat er auch eine richtige Referenzpannung zum vergleichen. Potential
liegt in Ruhe nicht an, also alles im Gleichgewicht. Allerdings sagt mir
mein Gefühl, dass es eine idiotische Idee ist, 485- mit GND zu
verbinden. Leider fehlt mir hier das Grundwissen, wieso. Kann mir
hierbei jemand eine Erklärung liefern? Danke.
Bei logisch 0 lieg an data- 3.3 V an. Eine Möglichkeit ist an data- 1.7
V anzulegen. Die 120 Ohm solltest du ach nicht vergessen. Sonst drückt
vielleicht ein anderer Teilnehmer 5V in deinen Eingang.
Ja, das geht natürlich. Dann legst Du halt Deine µC-Pins direkt an den
Bus, für kleine Strecken ist das kein Problem. Du kannst bei kleinen
Stecken sogar auf die differenzielle Übertragung verzichten und mit
Diodenlogik arbeiten:
Bus----+------+-----------------RRRRR---Gnd
| _|_
| /_\
| |
Rx Tx
Für kleine Strecken geht das und es ist weitgehend kompatibel mit RS-485
bezüglich der Software. Aber bitte nicht außerhalb eines Gehäuses
verwenden.
Dragony schrieb:> Ich gehe deshalb davon aus, dass es nur mit einem AVR absolut unmöglich> ist, RS485 zu sprechen. Nichtmal bei kleinsten Strecken.
Warum willst du auf kleinesten Strecken überhaupt RS485 verwenden.
> Ich verstehe aber nicht, wieso. Wenn ich 485- mit GND verbinde und 485+> auf HIGH setze, habe ich 3V Differenz, also eine 1.
Das ist aber nicht wirklich differentialfrei und die von dir
angenommenen 3V stimmen übrigens auch nicht: eine Differenzspannung von
+-200mV auf dem Bus reicht schon für einen gültigen Pegel aus...
> Wenn ich + auf LOW setze, habe ich 0V Differenz, also eine 0.
Du musst aber weil es eine symmetrische Übertragung ist, gleichzeitig
auch RS485- auf HIGH setzen. Und dann hast du -3V am Eingang...
> habe ich 0V Differenz, also eine 0.
0V Differenz ist eigentlich "nichts Definiertes": von -0,2V bis 0,2V
Differenz ist der übertragene Pegel undefiniert.
> Allerdings sagt mir mein Gefühl, dass es eine idiotische Idee ist, 485-> mit GND zu verbinden. Leider fehlt mir hier das Grundwissen, wieso. Kann> mir hierbei jemand eine Erklärung liefern? Danke.
Wenn du das machst, dann hast du eben keine symmetrische Übertragung
mehr...
Und vor Allem: RS485 kann viele Teilnehmer pro Bus haben. Was wäre, wenn
jeder solche Tricks (Masse an 485-) machen würde?
Dragony schrieb:> Ich verstehe aber nicht, wieso. Wenn ich 485- mit GND verbinde und 485+> auf HIGH setze, habe ich 3V Differenz, also eine 1. Wenn ich + auf LOW> setze, habe ich 0V Differenz, also eine 0. GND ist angeschlossen, also> hat er auch eine richtige Referenzpannung zum vergleichen. Potential> liegt in Ruhe nicht an, also alles im Gleichgewicht. Allerdings sagt mir> mein Gefühl, dass es eine idiotische Idee ist, 485- mit GND zu> verbinden. Leider fehlt mir hier das Grundwissen, wieso. Kann mir> hierbei jemand eine Erklärung liefern? Danke.
Es ist so:
Der Receiver ist empfindlich auf die Differenz zwischen D+ und D-. Er
vergleicht quasi D+ und D-.
Ist D+ HIGH und D- LOW hatst du z.B. 5V - das wäre bei 5V
Versorgungsspannung der Fall.
Beim Umgekehrten Fall -5V.
Der Sender muss mindestens +-2V heraustreiben.
Der Empfänger muss +-0,2V erkennen, d.h. >-0,2V = LOW, <+0,2V = High.
Darum ist es eine schlechte Idee, D- mit GND zu verbinden. Damit ist der
Bus eigentlich tot - keine negative Differenzspannung mehr. Manchmal
geht es dan trotzdem noch, weil die Treiber empfindlicher sind als die
+-200mV.
Wenn du deinen µC da dranhängen musst, nimm einen RS485-Treiber, z.B.
einen ADM485.
Sonst, nimm halt nur D+ und führ das auf einen Port (Spannungsteiler
kann eventuell sinnvoll sein, um den Pegel abzusenken) und lass D-
offen.
Allerdings erfüllt dein Port am µC die +-200mV - Eingangsempfindlichkeit
nicht. Daher: funktionieren wird das über kurze Strecken schon, aber
zuverlässsig ist es nicht.
Gegen Reflexionen nimmt man 120E differentielle Impedanz und
Abschlusswiderstände, aber das lassen wir jetzt mal für den Anfang aus
der Betrachtung weg ;-)
Dragony schrieb:> Ich gehe deshalb davon aus, dass es nur> mit einem AVR absolut unmöglich ist, RS485 zu sprechen.
Es geht schon, Du nimmst einfach die beiden Pins des Analog-Comparator.
Nur mußt Du dann die UART in SW nachbilden.
Dragony schrieb:> Ich gehe deshalb davon aus, dass es nur mit einem AVR absolut unmöglich> ist, RS485 *zu sprechen*
Du kannst ganz einfach RS485 sprechen.
Am einfachsten mit einer Soft-SIO, die dann die Pegel zweier Portpins
entsprechend umschaltet: jeweils komplementär den einen auf high, den
anderen auf low.
Und wie das Empfangen geht, hat Peter schon geschrieben...
Ich habe auf Senderseite einen AVR 13A und auf Empfängerseite einen DMX
Dimmer. Dazwischen ist ein abgeschirmtes 2-Meter DMX Kabel. Am Ende ist
der Bus mit 120 Ohm ordnungsgemäss terminiert. Ich möchte jetzt einfach
mal wissen, ob es auch ganz ohne zweiten 485 IC geht, zumindest bei so
einfachen Aufbauten.
Lothar: Deshalb kann ich nicht auf Empfängerseite was eigenes basteln,
sondern es muss mit einem echten DMX Empfänger funktionieren. Was da für
ein IC drin ist, weiss ich nicht. Mit einem echten DMX Sender
funktioniert es zumindest. Oszillator habe ich mit dem Oszilloskop auf
4us kalibiriert, damit die Timings stimmen. Meine Schaltung sieht so
aus:
Attiny13A-Seite DMX-Empfänger-Seite
PORT B2 am AVR --------------- 485+
GND --------------- 485-
GND --------------- GND
Danach lege ich folgende Pegel an B2 an:
(Sequenz)
HIGH (Idling...)
Transfer Start:
120us LOW
ab hier ist jeder befehl 4us lang
HIGH
HIGH
for (bytes) {
LOW (startbit)
Byte x (das erste byte ist immer 0, also 8*0. HIGH=1 LOW=0)
HIGH (stopbit1)
HIGH (stopbit2)
}
HIGH (wieder idling)
Sollte es so eigentlich funktionieren? Zumindest am Oszilloskop sieht
alles gut aus, nur tut sich am Dimmer nichts. Die Eingangs-RX-LED am
Dimmer, die sonst blinkt, bleibt dunkel.
RX485- auf GND legen ist die falsche Idee.
Da gibts zwischen RS482+ und RS485- nie eine negative Differenz.
Wenns denn schon gebastelt sein muß, was ich für absoluten Schwachsinn
halte, dann leg RX485- mit einem Spannungsteiler auf Ub/2. So gibt es
positive und negative Differenzen am Empfänger.
Willst Du uns verraten, wieso du 50 cent sparen willst, dafür aber eine
wackelige Schaltung bauen möchtest?
Dragony schrieb:> Sollte es so eigentlich funktionieren?
Noe, wie kommt der RS485+ den vom Pegel unter dem Pegel vom RS485-?
Geht nicht. Wenn dann dann sollte der RS485- irgendwo bei 2.5V liegen
dann kann der RS485+ +5V oder 0V werden also in Bezug auf dem RS485-
dann +2.5V oder -2.5V.
Aber man sollte das nicht machen, neben der Pegelanpassung sind die
Treiberbausteinen auch wesentlich resistender gegen ESD als so ein
Controllereingang.
Es handelt sich nicht um ein Produktivsystem, sondern ich will halt
wissen, was passiert wenn dasunddas ist und warum geht dasunddas nicht
etc. Ich würde sowas nie aus der Hand geben ;D
Ich glaube, so langsam verstehe ich es aber.
Ist also folgende Annahme FALSCH?: Wenn Pegel B um 200mV grösser ist als
A, liegt eine 1 an, sonst eine 0.
Ist dann folgende Annahme RICHTIG?: Wenn Pegel A im Vergleich zu GND
mindestens 200mV positiv ist UND GLEICHZEITIG Pegel B im Vergleich zu
GND mindestens 200mV negativ ist, liegt eine 1 an, sonst eine 0.
Das ist ja ein grosser und wichtiger Unterschied.
Kurz: Es reicht nicht, dass es mathematisch <200mV Unterschied hat, der
Pegel von + muss auch noch UNTER dem Pegel von - kommen. Das geht dann
bei meiner Schaltung wirklich nicht.
Dragony schrieb:> Ist also folgende Annahme FALSCH?:> Wenn Pegel B um 200mV grösser ist als A, liegt eine 1 an, sonst eine 0.
Nein, die ist halb richtig halb falsch. Richtig wäre:
Wenn Pegel B um mindestens 200mV grösser ist als A, liegt eine 1 an.
Wenn Pegel B um mindestens 200mV kleiner ist als A, liegt eine 0 an.
Dazwischen ist das Ergebnis undefiniert.
Und diese Spannungsdifferenz muss im Gleichtakteingangsspannungsbereich
des Empfängers sein. Dieser Gleichtaktbereich ist meist etwas im Bereich
von 0..15V. Der Pegel keines der Signale darf unter GND kommen...
Dragony schrieb:> Ist dann folgende Annahme RICHTIG?:
Falsch
Durch die differenzielle Übertragung vergleichst du eben nicht mit GND
sondern nur zwischen A und B.
Logisch 1: A > B
Logisch 0: A < B
und das jeweils um mindestens 200mV.
Aber ob das jetzt 5V und 0V oder 3.3V und 0V ist spielt keine Rolle.
Christian S. schrieb:> Gut, aber es heisst weiterhin, dass A=B undefiniert ist,> also A=0 und B=0 ist NICHT logisch 0. Richtig?
Ja, so steht es z.B. auch in Wikipedia.
Es ist richtig, daß die Differenz zwischen RS485+ und RS485- > 200mV
sein muß, aber keines der beiden Signale muß negativ in Bezug auf GND
sein.
RS485+ ist high (z.B. 5V gegen GND), dann ist RS485- low (0V gegen GND).
Dann ist die Differenz RS485+ - RS485- = 5V.
RS485+ ist low (0V gegen GND), dann ist RS485- high (z.B. 5V gegen GND).
Dann ist die Differenz RS485+ - RS485- = -5V.
Du benötigst keine Spannung die negativ in Bezug auf GND ist, sondern es
geht bei differenzieller Übertragung (wie der Name schon sagt) nur um
den Unterschied zwischen + und - Leitung und der kann negativ sein.
Zum Empfangen auf kurzen Distanzen dürfte es genügen RS485+ einfach auf
deinen RX-Eingang vom Mikrocontroller zu legen. (Besser mit Widerstand
davor).
Wenn man den UART in SW implementiert dürfte auch das Senden auf kurzen
Distanzen funktionieren, wenn man 2 Pins immer negiert zueinander
schaltet.
Es gibt tatsächlich Treiber die bei a=b logisch 0 annehmen. Davon kann
man aber nicht ausgehen, dass die anderen Teilnehmer es so machen. Das
ist nur sinnvoll, wenn man offline einen definierten Eingangspegel
möchte.