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
läuft die Potentialbestimmung nicht über Pull-Up / Pull-Down Widerstände, die den Strom begrenzen?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.