Forum: Mikrocontroller und Digitale Elektronik I2C Slave-Adresse umadressieren?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas P. (thom_pe)


Bewertung
0 lesenswert
nicht lesenswert
Moin.

Ich habe eine Frage zum I2C-Bus. Es gibt ja Module, die eine feste 
Adresse haben, die sich nicht ändern lässt. Wenn man davon aber mehrere 
gleichartige am selben Bus ansprechen möchte, die dann alle die selbe 
Adresse hätten - gibt es sowas wie Adressumsetzer, die zwischen Slave 
und Master sitzen, und das möglich machen?

Thom

von hp-freund (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Thomas P. (thom_pe)


Bewertung
0 lesenswert
nicht lesenswert
Guter Hinweis! Klingt nach dem, was ich suche, muss ich erstmal lesen.

Danke.

Thom.

von grundschüler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Thomas P. schrieb:
> Es gibt ja Module, die eine feste
> Adresse haben

Meistens -wenn es Sinn macht- lässt sich die Adresse einstellen.

von Wumo (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
grundschüler schrieb:
> Thomas P. schrieb:
>> Es gibt ja Module, die eine feste
>> Adresse haben
>
> Meistens -wenn es Sinn macht- lässt sich die Adresse einstellen.

Bei den Modulen, die eine feste Adresse haben, läßt sich diese Adresse 
einstellen?

---reboot brain and think again---

von Klaus R. (klara)


Bewertung
0 lesenswert
nicht lesenswert
Wumo schrieb:
> grundschüler schrieb:
>> Thomas P. schrieb:
>>> Es gibt ja Module, die eine feste
>>> Adresse haben
>>
>> Meistens -wenn es Sinn macht- lässt sich die Adresse einstellen.
>
> Bei den Modulen, die eine feste Adresse haben, läßt sich diese Adresse
> einstellen?
>
Grundschüler wollte wohl damit sagen, dass es mit besagtem I2C-Slave 
wohl keinen Sinn hätte.
Der  I2C Bus - Multiplexer ist schon die beste Lösung. Den gibt es schon 
für zwei Busse im 8 poligen Gehäuse.
http://www.nxp.com/documents/data_sheet/PCA9540B.pdf

von grundschüler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Grundschüler wollte wohl damit sagen, dass es mit besagtem I2C-Slave
> wohl keinen Sinn hätte.


Nein ich wollte damit sagen, dass ein TO der das verwendete Modul nicht 
bezeichnen kann, möglicherweise einfach nicht weiß, ob und wie man die 
Adresse ändern kann.

von Fabian H. (hdr)


Bewertung
0 lesenswert
nicht lesenswert
Teilweise gibt es auch mehrere Typen von I²C Devices. Die unterscheiden 
sich dann geringfügig in der Bauteilbezeichnung und eben in der Adresse, 
sind aber ansonsten identisch.

Hatte irgendwann mal ausversehen auf ein Layout den falschen Typ 
bestückt (hatte noch ein angestelltes "A") und mich ewig gewundert, 
warum der Mist nicht läuft, obwohl doch in den vorherigen Tests immer 
alles gut ging.

von Wumo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
grundschüler schrieb:
> Klaus R. schrieb:
>> Grundschüler wollte wohl damit sagen, dass es mit besagtem I2C-Slave
>> wohl keinen Sinn hätte.
>
> Nein ich wollte damit sagen, dass ein TO der das verwendete Modul nicht
> bezeichnen kann, möglicherweise einfach nicht weiß, ob und wie man die
> Adresse ändern kann.

Da er es schon selbst angesprochen hat und weiß, daß es Module mit und 
ohne Adressierungsänderung gibt, darf man ihm schon zutrauen, daß es 
sich in seinem Fall um Module handelt, die sich nicht ändern lassen.

von Peter R. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Man  kann  auch den I2C- slave mit einem Mikrokontroller "beschummeln".

Ein BUS-Pin von ihm ist an den Bus angeschlossen, ein Slave-Pin an den 
I2C-Slave.

Wenn der Slave bereits angesprochen ist, reicht der Kontroller die bits 
einfach durch.

Beim Adressbyte gehts anders: Der Kontroller liest bitweise die Adresse 
am Bus  mit, gibt aber dabei an den Slave die dem Slave eigene Adresse 
aus.
Wenn der Kontroller seine eigene Adresse empfangen hat, gibt er am Bus 
ein ACK aus. Der Kontroller reicht das ACK allerdings nur dann an den 
Bus weiter, wenn er die "neue" Adresse erkannt hat.

 Dazu müsste dann aber noch eine Flankenerkennung kommen, mit der die 
Start- oder die Stop-Bedingung erkannt wird.

Klingt vielleicht etwas kompliziert, aber mit einem Atiny 13 oder dgl. 
wäre das im Einzelfall eine durchaus machbare Lösung.

von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Peter R. schrieb:
> Ein BUS-Pin von ihm ist an den Bus angeschlossen, ein Slave-Pin an den
> I2C-Slave.

Das habe ich jetzt nicht verstanden. Gibts dazu einen Schaltplan?

von Günter R. (galileo14)


Bewertung
0 lesenswert
nicht lesenswert
Man könnte auch eigene Chip-Selects einführen, sodaß man die SCL's der 
nichtselektierten ICs mit je einem Oder-Gatter auf high festhält und nur 
den selektierten IC freigibt. Mit zusätzlichen PIO-Ausgängen selektiert 
man dann den jeweiligen IC.

von Fragender (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo
Die ICs PCA .. finde ich sehr inetressant. Habe mir die Datenblätter 
angesehen. Gibt es ein kleines Beispiel für einen Code in C?

von Klaus R. (klara)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Du brauchst nur immer, wie bei einer Eisenbahn, einmal den gewünschten 
Bus mit einem I2C-Write freischalten. Das war es.
mfg klaus

: Bearbeitet durch User
von Peter R. (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
MaWin schrieb:
> Das habe ich jetzt nicht verstanden. Gibts dazu einen Schaltplan?

Welcher MaWin ???

von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Peter R. schrieb:
> Welcher MaWin ???

Ich bin MaWin.

von Peter R. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Thomas P. schrieb:
> gibt es sowas wie Adressumsetzer, die zwischen Slave
> und Master sitzen, und das möglich machen?

Die genannten Bus-Multiplexer können das. Für einen Ausgang lässt sich 
das mit einem  Atiny13 machen:

PB0 an SCL, PB1 an SDA desI2C bus mit Master und den andren slaves
PB3 an SCl PB4 an SDA des slave mit deoppelt auftretender Adresse

Wenn halt eine Adresse auf den Bus gegeben wird, unterdrückt der 
Umsetzer die Originaladresse und gibt die ihm einprogrammerte Adresse 
weiter. Ansonsten reicht der Umsetzer die andren Bytes oder Signale wie 
Stop und Start unverändert weiter.
Von der Hardware her eigentlich nichts besonderes.
Von der Software her etwas mühsam, aber machbar.

von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> Peter R. schrieb:
>> Welcher MaWin ???
>
> Ich bin MaWin.

Aber ich hab es jetzt verstanden und brauche keinen Schaltplan mehr.

von Fragender (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Würde es gern machen. Hardware kein Problem für mich. Habe mir die 
Erklärung zur Umschaltung in den Datenblättern angesehen. Ist mir noch 
unklar.

von Thomas P. (thom_pe)


Bewertung
0 lesenswert
nicht lesenswert
Moin.

Das sind ja mal ne Menge antworten, Danke schonmal.

> möglicherweise einfach nicht weiß, ob und wie man die Adresse ändern kann

Im konkreten Fall geht es um HMC5883L. Weil ich aber nicht die Anwendung 
diskutieren wollte, sondern die Frage grundsätzlich beantwortet haben 
wollte, hatte ich das weggelassen.

> Man  kann  auch den I2C- slave mit einem Mikrokontroller "beschummeln".

Das war bisher meine einzige Idee, habe da aber etwas Sorge, dass das 
Timing dann nicht mehr so richtig klappt. Mag unbegründet sein.

> die SCL's der nichtselektierten ICs mit je einem Oder-Gatter auf high
> festhält und nur den selektierten IC freigibt

Die Idee finde ich gut, und an sowas hatte ich auch gedacht, als ich das 
Kontrollregister vom Multiplexer gesehen habe. Wenn ich das richtig 
verstanden habe, macht der nämlich genau das, nur mit dem Unterschied, 
dass der das Chipselect nicht über zusätzliche PIO Leitungen macht, 
sondern dass diese Infos über den I2C selbst an den Multiplexer 
geschickt werden. Oder-Gatter habe ich rumliegen, Multiplexer nicht.

Warum macht man das auf der Taktleitung? Intuitiv hätte ich die 
Datenleitung genommen.

> Du brauchst nur immer, wie bei einer Eisenbahn, einmal den gewünschten
> Bus mit einem I2C-Write freischalten. Das war es.

Das verstehe ich nicht (habe keine Eisenbahn). Kannst du das bitte für 
etwas doofere wie mich erklären?

Thom.

von Thomas P. (thom_pe)


Bewertung
0 lesenswert
nicht lesenswert
>> die SCL's der nichtselektierten ICs mit je einem Oder-Gatter auf high
>> festhält und nur den selektierten IC freigibt

> Warum macht man das auf der Taktleitung? Intuitiv hätte ich die
> Datenleitung genommen.

Oh, ich glaube, ich habe es verstanden. Der Takt wird ja eh vom Master 
kontrolliert, und wenn die Taktleitung vom Chipselect dauerhaft auf Low 
gezogen wird, dann sieht der Slave nicht, wie die Zeit vergeht, und der 
ganze Verkehr auf der Datenleitung rauscht einfach an ihm vorbei.

Oder?

Thom.

von S. R. (svenska)


Bewertung
0 lesenswert
nicht lesenswert
Thomas P. schrieb:
> Oder?
Genau.

von Christian B. (luckyfu)


Bewertung
0 lesenswert
nicht lesenswert
Thomas P. schrieb:
> Warum macht man das auf der Taktleitung? Intuitiv hätte ich die
> Datenleitung genommen.

Außerdem ist die Datenleitung bidirektional... Da wäre ein Ausblenden 
deutlich komplizierter.
Wir haben aktuell auch so einen I²C Mutliplexer im Einsatz (TCA9548A) 
Das funktioniert recht zuverlässig. Man kann auswählen, ob man nur einen 
Slave mit einer Nachricht beglücken will oder mehrere. (Letzteres macht 
natürlich nur Sinn, wenn die Kollegen keine Daten übermitteln wollen, 
sonst gibt's Kauderwelsch

: Bearbeitet durch User
von Christian M. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Christian B. schrieb:
> Datenleitung bidirektional.

Takt kann auch bei Clock-Stretching...

Gruss Chregu

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Man kann auch das I2C in SW machen und dann den Master 8 SCL- und eine 
gemeinsame SDA-Leitung erzeugen lassen.
Welche SCL-Leitung aktiv ist, legt man mit einem Maskenbyte fest.
Damit kann man dann 8 Sensoren ansteuern.

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> Peter R. schrieb:
>> Welcher MaWin ???
>
> Ich bin MaWin.



https://youtu.be/oKqqRrITlWg
???

: Bearbeitet durch User
von Christian B. (luckyfu)


Bewertung
0 lesenswert
nicht lesenswert
Christian M. schrieb:
> Takt kann auch bei Clock-Stretching...

Das geht dann jedoch nicht mehr. Ob das mit dem Multiplexer funktioniert 
müsste man mal recherchieren. Das Datenblatt schweigt sich darüber 
jedoch aus.

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Christian B. schrieb:
> Das Datenblatt schweigt sich darüber
> jedoch aus.

Clock-Stretching interessiert den Multiplexer nicht.

Der macht einfach nur ein Tor auf.
Oder um bei den Schienen zu bleiben; der Weiche ist es egal, wie viel, 
wie schnell, oder welche Züge drüber fahren. Es ist ein Problem des 
Zuges, in Spur zu bleiben. Die Weiche hat keine Chance, da irgendwie 
differenzieren zu können. Sie verändert auch nicht den Zug.

: Bearbeitet durch User
von Thomas P. (thom_pe)


Bewertung
0 lesenswert
nicht lesenswert
Moin.

Danke für die Kommentare und Ideen.

Thom.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.