Hallo,
Kann mir jemand erklären, wie ein Bus funktioniert, der kein
Master-Slave Prinzip verwendet und auch kein Chip-Select? Bei
Ethernet-Netzwerken mit einem Hub z.B werden ja einfach mal Daten
versendet und die Leitung gleichzeitig mitgelesen. Unterscheidet sich
das Gelesene vom Gesendeten gab es eine Kollision und die Übertragung
wird ausgesetzt. Nun frage ich mich wieso es dabei keinen Kurzschluss
gibt? Denn wenn ich das mit zwei µControllern realisieren würde und
beide Schalten auf Ausgang um, dann habe ich ja keinen Widerstand mehr
dazwischen, der einen Kurzschluss verhindert. Schreibt der eine
Controller High und der andere Low müssten doch beide gebraten werden
oder nicht?
Grüße,
Ben
Ben90 schrieb:> Schreibt der eine> Controller High und der andere Low müssten doch beide gebraten werden> oder nicht?
Bei begrenzter Ausgangsleistung passiert nix, der stärkere gewinnt und
schreibt seine Info auf die Leitung, der schwächere steckt eben zurück.
In den meisten Ethernet-Karten steckt meistens eine Art
Ausgangs-Überträger, der Isoliert und erzeugt auch gleich die
symmetrischen Signale für ein Adernpaar. Könnte mir vorstellen, das der
auch den Kurzschlussschutz übernimmt.
Andreas K. schrieb:> Bei begrenzter Ausgangsleistung passiert nix, der stärkere gewinnt und> schreibt seine Info auf die Leitung, der schwächere steckt eben zurück.
Wenn ich einen AVR Pin auf Ausgang schalte gibt es aber keine Begrenzung
der Ausgangsleistung mehr oder sehe ich das falsch?
hallo schrieb:> läuft die Potentialbestimmung nicht über Pull-Up / Pull-Down> Widerstände, die den Strom begrenzen?
Daran habe ich garnicht gedacht, da der Controller ja eigentlich beide
Zustände (Low und High) als Ausgang zur Verfügung stellen kann. Also
würde eine Lösung mit externem Pull-Up so aussehen, dass die
Datenübertragung durch Schalten zwischen Low-Ausgang und
Tri-State-Eingang erfolgt. Und so kann tatsächlich kein Kurzschluss mehr
entstehen... Kann man das als übliche/professionelle Lösung betrachten?
Bin nur Hobby-Bastler und hab noch nicht wirklich ne Ahnung davon was
eine schöne Lösung ist und was eher als Hack anzusehen ist. Andererseits
benutzt TWI ja auch einen externen Pull-Up und dürfte also auch das oben
genannte Prinzip verwenden, oder?
Danke für die Antworten,
Ben
Ben90 schrieb:> Andreas K. schrieb:>> Bei begrenzter Ausgangsleistung passiert nix, der stärkere gewinnt und>> schreibt seine Info auf die Leitung, der schwächere steckt eben zurück.>> Wenn ich einen AVR Pin auf Ausgang schalte gibt es aber keine Begrenzung> der Ausgangsleistung mehr oder sehe ich das falsch?>
Wenn du den µC direkt an den BUS hängst, dann nicht, das ist richtig!
Je nach Entfernung der beiden treibenden Controller
(Entfernung=Kupfer=Widerstand=Strombegrenzung) kommt es dann eventuell
zur Zerstörung von einem oder beiden Controllern.
Aber schon wenn du einfach nur einen richtig bemessenen Widerstand
zwischen µC und Bus setzt ist das kein Problem mehr. Will man dies so
lösen, so müsste man berechnen wie groß der maximale Strom ist den der
jeweilige µC treiben kann und den entsprechenden Vorwiderstand wählen.
hat man auch gleich einen Schutz bei Kurzschluss in der Verkabelung.
> hallo schrieb:>> läuft die Potentialbestimmung nicht über Pull-Up / Pull-Down>> Widerstände, die den Strom begrenzen?>> Daran habe ich garnicht gedacht, da der Controller ja eigentlich beide> Zustände (Low und High) als Ausgang zur Verfügung stellen kann. Also> würde eine Lösung mit externem Pull-Up so aussehen, dass die> Datenübertragung durch Schalten zwischen Low-Ausgang und> Tri-State-Eingang erfolgt. Und so kann tatsächlich kein Kurzschluss mehr> entstehen... Kann man das als übliche/professionelle Lösung betrachten?> Bin nur Hobby-Bastler und hab noch nicht wirklich ne Ahnung davon was> eine schöne Lösung ist und was eher als Hack anzusehen ist. Andererseits> benutzt TWI ja auch einen externen Pull-Up und dürfte also auch das oben> genannte Prinzip verwenden, oder?>> Danke für die Antworten,> Ben
Es wird eigendlich nicht zwischen LOW und "Tristate" umgeschaltet, denn
wo man mit PullUps arbeitet braucht man eigendlich keinen HIGH Pegel
durch den Treiber selbst. Daher wird auf den Tristate Ausgang
verzichtet. Zumal der TS Zustand ja auch bei den gängigen kleinen µC in
der Regel so erreicht wird das der Port auf Eingang umgeschaltet wird.
(Tristate als Zustandsbezeichnung ist ja sowieso nicht ganz korrekt,
eigendlich ist das ja nur die Bezeichnung der Schaltungstechnik - wird
aber zugegebenermaßen von vielen, auch von mir manchmal, als synonym für
den HighImpedance Zustand verwendet)
Wenn man soetwas aufbaut ist es deutlich leichter nach dem OpenCollector
Prinzip zu verfahren, also mit dem µC einen Transistor anzusteuern.
Natürlich nur ohne Aufwand möglich wo der RX/TX nicht über einen
Bidirektionalen Pin läuft, aber wo das so ist, da funktioniert der
Kollisionsschutz eh nicht so wie du gefragt hattest.
Dieses Verfahren wird in der Praxis auch bei Bussen angewand wo mehrere
Teilnehmer gleichzeitig ein Signal auf den Bus legen können -BZW sogar
SOLLEN. Das ist zum Beispiel beim IEEE488/IEC-625 bei den
Steuerleitungen NDAC und NRFD der Fall, die jeder Teilnehmer für sich
setzt und die erst dann "false" (false = bereit, das N für NOT steht)
werden dürfen wenn ALLE Teilnehmer "false" gesetzt haben. AND Verhalten
halt, die folge von OC und hier beabsichtigt...
Die Frage welches Verfahren von beiden nun das "bessere" ist, das kann
man nicht allgemeingültig beantworten. Das kommt ein wenig auf die
Randumstände an. Leitungslänge, erwartete Störfeldstärken und nicht
zuletzt auch wie wahrscheinlich (=häufig) das gleichzeitige Senden ist.
OC zum Beispiel hat den Vorteil, das die Signale IMMER einen definierten
Pegel haben, also entweder sauber HIGH oder LOW sind. Das HIGH ist dann
definiert als AND...
Bei der Schutzwiderstandslösung kann im Falle eines
gegeneinandertreibens ein undefiniertes Signal entstehen, welches bei
ca. "U_High/2" +/- deutlicher "%" liegt.
Andererseits kann man bei der Widerstandslösung mit deutlich geringeren
Impedanzen = höheren Strömen arbeiten, was zu einem störfesteren Signal
führt. Somit ist auch längere Leitungsführung denkbar.
Wollte man bei der OC Lösung auch nur ansatzweise in den Bereich der
geringen Impedanzen arbeiten, so geht das nur wenn man die Pull-Ups sehr
genau und für den speziellen Fall berechnet. Man definiert also genau
welches Gerät nun welche Pull-Ups verwendet. Sofern man nicht einen
PULL-UP pro Signal an einer zentralen Stelle vorsieht, sondern jeden
Transciver mit eigenem PULL-UP ausstatten will ändert sich die Impedanz
dann mit jedem GErät welches zu - oder abgeschaltet wird.
Daher ist hier ein niederohmiges Verhalten nur in definitiv
geschlossenen Systemen praktisch denkbar.
Und es gibt noch einige Argumenten PRO/CONTRA mehr...
Aber ich denke jetzt solltest du dir selbst ein Bild machen können.+
Gruß
Carsten
Hallo,
Ben90 schrieb:> Daran habe ich garnicht gedacht, da der Controller ja eigentlich beide> Zustände (Low und High) als Ausgang zur Verfügung stellen kann. Also> würde eine Lösung mit externem Pull-Up so aussehen, dass die> Datenübertragung durch Schalten zwischen Low-Ausgang und> Tri-State-Eingang erfolgt. Und so kann tatsächlich kein Kurzschluss mehr> entstehen... Kann man das als übliche/professionelle Lösung betrachten?> Bin nur Hobby-Bastler und hab noch nicht wirklich ne Ahnung davon was> eine schöne Lösung ist und was eher als Hack anzusehen ist. Andererseits> benutzt TWI ja auch einen externen Pull-Up und dürfte also auch das oben> genannte Prinzip verwenden, oder?
Das hast Du genau richtig erkannt. TWI (I2C) benutzt dieses Verfahren.
Die Ausgänge sind OpenDrain (OpenCollektor), die Leitung hat einen
Pullup dran und das IC zieht sie aktiv auf Low.
Beim AVR kann man das emulieren, indem man das Portbit auf L legt und
die Steuerung mit den DDR-Bit erledigt. Pin als Ausgang -> Low, Pin als
Eingang -> Hochohmig, PullUp zieht auf H. Liest man jetzt den Zustand
des Eingangs und bekommt L, hat ein anderer Busteilnehmer die Leitung
auf L gezogen und man kann reagieren.
Gruß aus Berlin
Michael
Vielen Dank, für die sehr schönen und ausführlichen Antworten.
Ich habe nun mal versucht auf deren Basis die beiden Varianten für
folgendes Szenario darzustellen:
- Mehrere µController sollen auf einem 4-bit breiten Bus bidirektional
beliebig miteinander kommunizieren können.
- Dabei sollen auftretende Kollisionen erkannt werden und mit einer
entsprechenden zufälligen Sendepause reagiert werden.
Variante 1 (Bild v1):
- PD0 bis PD3 ist der 4-bit breite parallele Bus
- Jeder Controller hängt über Widerstände an diesem Bus dran, um
Kurzschlüsse bei Kollisionen zu verhindern. Diese Widerstände müssen,
wenn ich das korrekt verstanden habe, etwa 125 Ohm betragen. (ATMega8
verträgt maximal 40mA pro Pin)
- Um beim Senden gleichzeitig Lesen zu können (und Kollisionen zu
erkennen), sind aber weitere 4 Pins nötig, welche als Eingänge
geschaltet sind. (PC0 bis PC3)
- Die Leitung PD5 wird über interne Pull-Ups auf High gezogen und wird
von einem Controller auf Low gezogen, wenn dieser den Bus benutzen
möchte. (Falls dies zwei gleichzeitig tun, treten Kollisionen auf, die
erkannt werden müssen.)
Würde das so funktionieren?
Und könnte man das auch einfacher gestalten?
Variante 2 (Bild v2):
- PD0 bis PD3 ist wieder der 4-bit Bus.
- Die Bus-Leitungen werden über die externen Pull-Ups auf High gezogen.
- PD5 ist wieder die Leitung, um den Bus anzufordern.
- Kommuniziert wird über das Toggeln der Bits im Datenrichtungsregister
(DDRD), also durch das Wechseln zwischen Ausgang-Low und
High-Impedanz-Eingang.
Diese Variante benötigt nur 5 Pins pro Controller, verhindert auch
Kurzschlüsse und erkennt ebenso Kollisionen.
Folglich scheint Variante 2 um längen besser zu sein?
Also nehme ich an, dass in Variante 2 entweder etwas fehlt oder man in
Variante 1 doch noch Pins einsparen kann, denn sonst gäbe es ja keinen
Grund für Diskussionen. :-)
Gruß, Ben
Ich habe mich mal noch weiter eingelesen und vermute, dass meine letzten
Fragen etwas zu unspezifisch waren. Habe so den Eindruck, dass das Thema
Bus zu komplex ist und zu viele verschiedene Möglichkeiten zur
Realisierung bietet, als dass man es in ein Schema pressen könnte.
Dennoch etwas zum grundlegenden Verständnis:
Carsten Sch. schrieb:> Wenn man soetwas aufbaut ist es deutlich leichter nach dem OpenCollector> Prinzip zu verfahren, also mit dem µC einen Transistor anzusteuern.
Je mehr verschiedene Quellen man liest, desto eher bekommt man den
Eindruck, dass Jeder die Begriffe Tri-State, Open-Collector/Drain,
Hochohmig/High-Imp/High-Z oder "Nicht Verbunden" nach Belieben verwendet
und auch Jeder etwas anderes darunter versteht.
Den obigen Satz verstehe ich so, dass vorgeschlagen wird an einen Pin
des µControllers einen Transitor anzuschließen. Wäre das Ergebnis nicht
aber das Selbe, als würde man den Pin im Controller als Eingang
schalten?
In verschiedenen Threads hier im Forum werden die Begriffe Tri-State und
Open-Collector gegenübergestellt, als wären es zwei verschiedene
Realisierungsmöglichkeiten für die selbe Problematik. Womöglich liege
ich Falsch, aber ich habe eher den Eindruck, dass Tri-State der
Überbegriff ist, welcher nur sagt, dass ein Pin 3 Zustände annehmen
kann: High, Low und "Hochohmig". Dieser dritte Zustand ist dann als
Open-Collector realisiert. Also ein Schalter der nicht geschlossen ist,
was in der E-Technik nichts weiter als ein nicht durchgeschalteter
Transitor ist, der somit einen hochohmigen "scheinbar-unendlichen"
Widerstand darstellt.
Das Verwirrende scheint zu sein, dass der Begriff "Tri-State" sowohl die
3-Zustands-Fähigkeit eines Pins beschreibt, als auch den dritten Zustand
selbst, also den High-Imp-Zustand.
Sehe ich das richtig oder wandle ich da gerade auf dem Holzweg?
Grüße, Ben
Ben90 schrieb:> Je mehr verschiedene Quellen man liest, desto eher bekommt man den> Eindruck, dass Jeder die Begriffe Tri-State, Open-Collector/Drain,> Hochohmig/High-Imp/High-Z oder "Nicht Verbunden" nach Belieben> verwendet und auch Jeder etwas anderes darunter versteht.
Richtig, fast.
Formal korrekt wäre High-Z (hochohmig) der richtige dritte Zustand eines
Tri-State-Treibers. Es wird aber statt High-Low-Hochohmig gern gesagt
High-Low-Tristate. Allerdings versteht man im Zusammenhang mit einem
üblichen Bus die Zustände sehr konkret.
Beim CAN (und auch beim I²C) z.B. gibt es einen dominanten 0-Pegel und
einen rezessiven 1-Pegel. Der 1-Pegel kann also jederzeit ohne Schaden
für die Hardware von einer 0 überschrieben werden.
Wenn jetzt ein Teilnehmer eine 1 ausgibt, aber eine 0 zurückliest, dann
hat er offenbar den Bus verloren...
Du hast bei deinen Busbetrachtungen übrigens komplett verdrängt, dass
die drei uCs nicht synchron zueinander laufen. Aus diesem Grund und
wegen Laufzeitunterschieden (Leiterbahnlänge...) hast du evtl. an den
Bussen unterschiedliche Pegel, die dann auch noch nicht synchron
zueinander eingelesen werden... :-o
Aus diesem Grund sind solche Multimaster-Busse sehr gern Eindraht-Busse
(CAN, I²C), denn auf nur 1 Leitung kann es solche
Synchronisationsprobleme nicht geben...
Lothar Miller schrieb:> Du hast bei deinen Busbetrachtungen übrigens komplett verdrängt, dass> die drei uCs nicht synchron zueinander laufen.
Ja, gängige Lösungen sehen hier noch ein paar Leitungen für einen
Handshake vor oder man verwendet einfach eine Taktleitung. Kollisionen
könnte man mit Daisy-Chaining schon präventiv verhindern. Die obige
Lösung hatte ich mir als Mischung vorgestellt und düfte so auch
funktionieren, aber sie ist schlichtweg schwachsinnig. Man überträgt
Daten parallel, um mehr Speed rausholen zu können, was man oben aber
durch die Kollisionen und Timingschätzungen kaputt machen würde.
Fazit: Wer die Busse auf dem Mainboard, den Netzwerk-Switch oder die
ganzen seriellen Busse in den µControllern erfunden hat, wird sich da
schon was bei gedacht haben. Dennoch ist es hilfreich selbst was zu
"erfinden", um festzustellen, warum es so nicht verwendet wird oder
einfach nicht funktioniert.
Lothar Miller schrieb:> Es wird aber statt High-Low-Hochohmig gern gesagt> High-Low-Tristate.
Man hätte den dritten Zustand eher Dual-State nennen sollen, da er je
nachdem was anliegt einen der ersten beiden Zustände "übernimmt".
Gruß, Ben
Ben90 schrieb:> Man hätte den dritten Zustand eher Dual-State nennen sollen, da er je> nachdem was anliegt einen der ersten beiden Zustände "übernimmt".
Nein, er übernimmt nichts, weil er eigentlich gar nicht da ist.
Hochohmig wie ein Eingang eben...
Die Ausgänge, die den letzten Zustand mit einem entsprechenden
Pullup/Pulldown (z.B. 10k Ohm) halten, heißen "Keeper".
Ethernet mit Patchkabel ist kein Bus, sondern eine
Punkt-zu-Punkt-Verbindung (Wie PCIe und SATA). Es gibt getrennte Sende-
und Empfangsleitungen und je Leitung nur einen Sender und Empfänger.
Kollisionen sind somit ausgeschlossen. Früher brauchte es dafür noch
Crossover-Kabel um Sender und Empfänger zu tauschen, jetzt reicht auch
1:1 Patchkabel, da in den halbwegs aktuellen Bustreibern eine
automatische Erkennung eingebaut ist.