Forum: Mikrocontroller und Digitale Elektronik RS485 ohne Treiber-IC unmöglich?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dragony (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Disco (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Christian B. (casandro) Flattr this


Bewertung
0 lesenswert
nicht lesenswert
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.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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?

von WehOhWeh (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

von Peter D. (peda)


Bewertung
1 lesenswert
nicht lesenswert
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.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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...

von Dragony (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von spontan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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?

von Helmut L. (helmi1)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Dragony (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Dragony (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Dragony (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Edit: < sollte > heissen. Ich muss mich mal hier registrieren...

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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...

: Bearbeitet durch Moderator
von operator (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Christian S. (dragony)


Bewertung
0 lesenswert
nicht lesenswert
Gut, aber es heisst weiterhin, dass A=B undefiniert ist, also A=0 und 
B=0 ist NICHT logisch 0. Richtig?

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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.

von Klugscheisserchen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Christian S. (dragony)


Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten. Jetzt komme ich gut weiter.

von Disco (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.