Forum: Mikrocontroller und Digitale Elektronik Bus und Kollisionen


von Ben90 (Gast)


Lesenswert?

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

von hallo (Gast)


Lesenswert?

läuft die Potentialbestimmung nicht über Pull-Up / Pull-Down 
Widerstände, die den Strom begrenzen?

von Andreas K. (derandi)


Lesenswert?

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.

von Ben90 (Gast)


Lesenswert?

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

von Carsten S. (dg3ycs)


Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

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

von Ben90 (Gast)


Angehängte Dateien:

Lesenswert?

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

von Ben90 (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Ben90 (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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".

von Kevin K. (nemon) Benutzerseite


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Kevin K. schrieb:
> Ethernet mit Patchkabel ist kein Bus, sondern eine
> Punkt-zu-Punkt-Verbindung (Wie PCIe und SATA).
Nur das alte Koax-Kabel brauchte noch mit CSMA/CD...
http://de.wikipedia.org/wiki/Ethernet#CSMA.2FCD-Algorithmus
http://de.wikipedia.org/wiki/Carrier_Sense_Multiple_Access/Collision_Detection

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
Noch kein Account? Hier anmelden.