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.
Edit: < sollte > heissen. Ich muss mich mal hier registrieren...
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
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.
Gut, aber es heisst weiterhin, dass A=B undefiniert ist, also A=0 und B=0 ist NICHT logisch 0. Richtig?
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.