Hallo, ich hab folgendes vor. An einem AVR (Master) sind mehrere andere AVR's (Slaves) angebunden per I2C. Das ganze ist Modulartig auf einer Hutschiene aufgebaut. Die Kommunikation soll dabei über einen Rückwandbus laufen. Am Anfang haben alle Slaves die Adresse 0. Nun sollen die Slaves die I2C-Weiterleitung zum nächsten Slave unterbechen können. Damit der Master nacheinander die neuen Adressen zuweisen kann. Und damit er auch weiß, an welcher Stelle wer sitzt. Kann man nun die Leitung des I2C einfach über Mosfets schalten oder gibt es da spezielle Sachen von TI oder NXP?
Sorry, ich halte die Idee für ziemlich XXXX.... Verpass jedem Ding einen Dipschalter, Oder mach die Codierung in den Steckern... I2C ist ein Bussystem, und wenn du da drin rumfurwerkst, mit FETs und so, solltest du dir überlegen, ob I2C überhaupt das richtige für diesen Zweck ist.
Mathias O. schrieb: > oder gibt es da spezielle Sachen von TI oder NXP? Natürlich. Such Dir was aus: http://www.nxp.com/products/interface_and_connectivity/i2c/i2c_multiplexers_switches/#products
Mathias O. schrieb: > Kann man nun die Leitung des I2C einfach über Mosfets schalten Im Grunde schon, und es sollte ausreichen, SDA abzuschalten, da es ohne SDA keine Start Condition gibt. Beachte, dass MOSFETs aufgrund der Body-Diode nur in eine Richtung abtrennen. Was dabei rauskommt ist die als I2C-Pegelwandler bekannte MOSFET-Schaltung, die hier mit Gate auf GND abkoppelt: http://www.nxp.com/documents/application_note/AN10441.pdf Wirst allerdings verteilte Pullups brauchen, da jedes Segment einen eigenen benötigt.
Bei Bussystemen gibt es das Problem der Auto Adressierung doch öfters. Kenne mich da zwar nicht aus, auf die schnelle habe ich das hier gefunden: https://de.m.wikipedia.org/wiki/ALOHA
Frank schrieb: > https://de.m.wikipedia.org/wiki/ALOHA Da geht es nicht um die Adressierung, sondern um einen Multimaster-Zugriffsverfahren. Was ich bei I2C nicht empfehlen würde.
:
Bearbeitet durch User
Hi Mathias die Idee hatte ich auch schon, aber jeder sagt, so wie Ulrich auch, das das nicht geht. Ich wollte mir so ein Chip mit Enable nehmen, wie PCA9515A. Es gibt ja auch welche mir Rückmeldung zum 2. Bus, wie der PCA9510A da erkennt der im 2. Bus, ob er mit dem Ersten verbunden ist. Oder einen Hub wie PCA9516A (5x) wo die anderen Geräte dran kommen. Hier ist die Adressvergabe sehr einfach. :-) Habs leider nie testen können.
Stephan schrieb: > sagt, so wie Ulrich auch, das > das nicht geht. Hat er nicht geschrieben. Er hält es nur für Unsinn.
Danke erstmal für die hilfreichen! Antworten. Ulrich hat nur gesagt, dass er es für XXXX.... hält. Das kann auch genial heißen ;). Aber wenn Jeder sagt, dass es nicht geht. Dann müssen die das ja auch getestet haben. Also da ich nur I2C und 24V/GND durchschleife, muss jedes Modul seine 5V selber erzeugen, somit muss auch jedes Modul seine eigenen Pullups drinhaben. Ist das soweit richtig? Ich denke mal der PCA9515A reicht bei mir. Nur steht da, das ich den nicht in Serie betrieben kann. Heißt das, das der doch nicht für mich in Frage kommen kann?
Stephan schrieb: > ok, Unsinn halt, sorry Yes! Unsinn ist eine freundliche Übersetzung meiner XXXX. Wenn dir die Position im Netz soooo wichtig ist, dann versuche es doch mal mit Token Ring. Ist über die UARTs der AVR recht einfach machbar, und die "Position" ist fest eingebaut. Es geht doch nix über Ringelrein, Händchen an Händchen, nur nicht los lassen...
Im Prinzip kannst Du über einen guten, niederohmigen Analogschalter eine der Leitungen (z.B. SDA) zum nächsten Slave per Power-On-Default abtrennen. Dem ersten Slave nach Power-On die Adresse zuteilen, und dezidiert den Analogschalter auf diesem Board einschalten. Dann dem nächsten Slave usw. Das Problem ist nur dass Du dann eigentlich auf jedem Board einen Pullup brauchst und dann wird es recht niederohmig. Abgesehen davon dass das wie schon bemerkt ziemlicher Pfusch ist.
Ulrich F. schrieb: > Wenn dir die Position im Netz soooo wichtig ist, dann versuche es doch > mal mit Token Ring. > Ist über die UARTs der AVR recht einfach machbar, und die "Position" ist > fest eingebaut. Dann erklär mir es doch mal bitte genau. Das ganze soll halt als Lokalbus dienen. Später beim Master wird es dann an den Fernbus gehen z.B. Modbus-RTU und CAN. Tcf K. schrieb: > ziemlicher Pfusch Wie würdest du es dann machen?
:
Bearbeitet durch User
Mathias O. schrieb: > Dann erklär mir es doch mal bitte genau. Wie? Genau? Das ist, glaube ich, eine IBM Erfindung. Zumindest haben die Jahrzehnte darauf rum geritten. (wikipedia usw. geben gerne Auskunft) Aber so komplex (wie die das gemacht haben) brauchst du es ja vermutlich gar nicht. In 2 Punkten ist das Konzept nahezu unschlagbar: 1. Alle Teilnehmer sind fit! (sonst bleibt es stehen) 2. Die Position im Ring ist eindeutig. (unveränderliche Nachbarn) Ein Ring! Tx an den Rx des linken Nachbarn. Rx an den Tx des rechten Nachbarn. usw. Ringelrein. Falls du einen Master definiert(z.B. der mit dem Modbus), ist das der Startpunkt im Ring. Schnell ist es nicht, aber die Position war dir ja wichtig.
Mathias O. schrieb: > Wie würdest du es dann machen? entweder: Bus ungeschaltet zu allen Slaves führen und auf jedem Steckplatz zusätzlich durch Pull-Ups/Pull-Downs die Steckplatznummer binär codieren, so dass der Slave sie auslesen kann. oder: keinen Bus, sondern einen Stern aufbauen. auf die Backplane einen PCA9547 I2C Multiplexer. Der Master schaltet den Multiplexer auf den gewünschten Slave und kann dann mit diesem kommunizieren. Alle Slaves verwenden die gleiche I2C Adresse. Alle I2C Segmente sind voneinander entkoppelt und benötigen ihre eigenen Pullups. Eine saubere Sache also. Das sind technisch saubere Realisierungskonzepte. fchk
Hallo Matthias, dieses Problem habe ich auch schon einmal vor ca. 10Jahren gehabt. Die Lösung ist relativ einfach gewesen. Ich habe dem IIC Bus noch eine zusätzliche CTRL/Select Leitung spendiert. Am Anfang haben alle SLAVES die ADR 0. Nach dem Reset des MASTERS setzt dieser seine CTRL-Leitung, die nur zum 1. SLAVE geht und vergibt diesem dann eine Adresse (0x01). Alle anderen SLAVES ignorieren das Telegramm, da deren CTRL-Leitung eben noch auf L liegt. Nachdem der 1.SLAVE seine Adr quittiert hat, setzt dieser nun seine CTRL-Leitung, die zum nächsten SLAVE geht. Der MASTER vergibt die nächste Adr (0x02). Der 1. SLAVE reagiert nicht mehr, da dieser ja bereits mit 0x01 initialisiert ist, aber SLAVE2 übernimmt nun die Adresse. Das ganze geht so weit, bis ein SLAVE auf die Adressvorgabe nicht mehr reagiert. Damit weiss der MASTER auch gleich, wie viele Teilnehmer vorhanden sind. Das ganze geht also ohne zusätzliche Bausteine wie MOSFET oder PCA. Lediglich eine weitere Leitung wird benötigt. Vielleicht hilft Dir das ja weiter. Gruß TK
Du wirst lachen. Genau das ist mir heute morgen um kurz vor 6 beim Aufstehen auch eingefallen. Aber ist deins Hot-Swap-fähig?
Mathias O. schrieb: > Also da ich nur I2C und 24V/GND durchschleife, muss jedes Modul seine 5V > selber erzeugen, somit muss auch jedes Modul seine eigenen Pullups > drinhaben. Ist das soweit richtig? Hmmm..... also jedes Modul erzeugt selbst aus 24V seine 5V für die interne Logik? 1. Sagt das nichts aus, ob Pull-Ups eingebaut sind (normalerweise nicht - denn wie soll der Erbauer der ICs wissen, wieviele der ICs Du an einen I2C-Bus anschließen willst). 2. Handelt es sich hier um TMC222-Schrittmotortreiber? Die müssen nur ein einziges Mal neu mit der Adresse beschrieben werden, nicht bei jedem Start. Da wäre der Zusatzaufwand mit dem Adressdecoder sinnlos.
Wenn man schon eine geografische Adressierung will, dann wärs eigentlich am einfachsten, mit dem Slot selbst auch die Adresse vorzugeben. Dass also ein paar Leitungen am Stecker auf der Backplane die Slotnummer definieren. Wenn man an Anschlüssen knapp ist, aber in jeder Node einen ADC oder mindestens einen Analog-Comparator drin hat, dann kann man das auch in einem einzigen Slotanschluss per individuellem Widerstand realisieren.
:
Bearbeitet durch User
Hallo Matthias, Hot-Swap Fähigkeit hat immer auch was mit dem MASTER zu tun. In meiner Anwendung habe ich es nicht benötigt. Aber ich kann mir vorstellen, dass das geht. Der MASTER muss dann zyklisch eine unbenutzte Adresse initialisieren. Und wenn eine Antwort kommt, ist ein neues Modul dazugekommen. Um zu erkennen, ob welche aus der Kette abgekoppelt wurden müssen alle initialisierten SLAVES abgefragt werden (alle Adr. durchwobbeln und auf Antworten warten). Gruß TK
Walter T. schrieb: > 1. Sagt das nichts aus, ob Pull-Ups eingebaut sind Versteh ich jetzt nicht. Der Hersteller der ICs muss es ja auch nicht wissen. Reicht ja wenn ich es weiß, dass ich welche in mein Modul einbaue. Walter T. schrieb: > 2. Handelt es sich hier um TMC222-Schrittmotortreiber? Die müssen nur > ein einziges Mal neu mit der Adresse beschrieben werden, nicht bei jedem > Start. Da wäre der Zusatzaufwand mit dem Adressdecoder sinnlos. Ne. Eigene Slaves auf der Basis eines Mega88. Alles Slaves haben am Anfang die Adr. 0. Nacheinander werden dann die Slaves von dem vorigen Slave freigeschaltet damit sie vom Master eine Adresse zugewiesen bekommen. A. K. schrieb: > Wenn man schon eine geografische Adressierung will, dann wärs eigentlich > am einfachsten, mit dem Slot selbst auch die Adresse vorzugeben. Dass > also ein paar Leitungen am Stecker auf der Backplane ... Kann ich nicht, da ich fertige Installationsgehäuse von Phoenix Contact nutze und auch deren HBus. TK schrieb: > Hot-Swap Fähigkeit hat immer auch was mit dem MASTER zu tun. In meiner > Anwendung habe ich es nicht benötigt. Aber ich kann mir vorstellen, dass > das geht. Der MASTER muss dann... Es werden ja eh alle Slaves zyklisch abgefragt um deren Werte in die jeweiligen Registern beim Master einzutragen. Dann kann man ja auch vorher den Status abfragen. Und auch ob es ein Modul gibt mit der Adr. 0.
Mathias O. schrieb: > A. K. schrieb: >> Wenn man schon eine geografische Adressierung will, dann wärs eigentlich >> am einfachsten, mit dem Slot selbst auch die Adresse vorzugeben. Dass >> also ein paar Leitungen am Stecker auf der Backplane ... > > Kann ich nicht, da ich fertige Installationsgehäuse von Phoenix Contact > nutze und auch deren HBus. Diese Entscheidung wirst Du dann wohl noch einmal revidieren müssen. fchk
Frank K. schrieb: > Diese Entscheidung wirst Du dann wohl noch einmal revidieren müssen. Mit Sicherheit nicht. Soll schließlich ordentlich in eine Unterverteilung passen. Für alles gibt es eine Lösung und die softwarebasierte Adressierung macht da schon Sinn. Somit sind alle Module gleich und auch die einzelnen HBus-Segmente. Der Anwender muss dann nicht darauf achten, welche er braucht und die auch in der richtigen Reihenfolge zusammenzustecken.
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.