PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Bus



Snow Wolf
16.05.2011, 15:24
Hallo

Meine Frage ist eigentlich recht simpel und zwar wenn ich einen ATmega16 über I2C Bus etwas ansteuern will muss ich nur SCL, SDA und INT verbunden werden?

MfG Snow Wolf

BMS
16.05.2011, 15:53
Hallo,
die INT-Leitung ("Interrupt") musst du nicht zwangsläufig anschließen, außer du möchtest z.B. einen Portexpander anschließen, der über die INT-Leitung dem Prozessor bedeuten kann, dass sich die Eingangszustände geändert haben.
Wichtig sind noch zwei Pull-up-Widerstände zwischen SDA und +5V sowie zwischen SCL und 5V. Wähle so etwa im Bereich 2,2k...10kOhm. Interne Pull-ups gibt es zwar auch, aber die sind zu hochohmig dafür.
Die angeschlossene Hardware braucht meist auch noch Versorgungsspannung, üblicherweise wird dann I2C-Bus und Versorgungsspannung auf einem Flachbandkabel gemeinsam verkabelt.
;)
Grüße, Bernhard

PicNick
16.05.2011, 15:59
Ja, und vergiss GND nicht

Snow Wolf
16.05.2011, 18:07
Ok das heißt ich muss folgende Leitungen in den Bus intigrieren damit alles funktioniert: SCL, SDA, INT (nur wenn ich eingänge habe), GND. Muss ich auch die Versorgungsspannung mit einschließen?

MfG Snow Wolf

Chypsylon
16.05.2011, 18:31
Prinzipiell benötigst du nur SCL und SDA. INT ist, wie Bernhard schon erwähnt hat, rein optional und hat mit dem Bus selber nichts zu tun. Auch GND und VCC haben mit dem Bus nichts zu tun, aber wenn dein Bauteil GND und VCC Pins hat solltest du die auch dementsprechend versorgen.
Welche erweiterungen willst du überhaupt anschließen? (Ich würde auf einen pcf8574 tippen :confused:)

021aet04
16.05.2011, 18:32
Du brauchst die Versorgungsspannung, damit die Schaltung versorgt wird. Damit der I2C Bus funktioniert brauchst du SCL, SDA (über Pullup Widerstände mit pos. Versorgungsspannung verbinden) und GND (hast du schon über die Versorgung. Den INT brauchst du nicht. Solltest du z.B. bei einem PCF8574 (Portexpander) wichtige Eingänge haben, kannst du den INT-Anschluss mit einem Int Eingang des µCs verbinden. Wenn die Eingänge eher unwichtig sind und du den z.B. PCF8574 zyklisch ausließt brauchst du den INT nicht. Du kannst die INT Ausgänge von mehreren I2C Bausteinen an einen INT-Eingang des µC schließen (parallel). Du musst aber einen Pullup Widerstand verwenden (es geht auch der interne des µC).

Mit dem RTC-Baustein PCF8583 kannst du z.B. jede Sekunde einen INT auslösen. So hast du am µC eine relativ genaue Zeit, die du verwenden kannst.

Noch einmal aufgeschlüsselt:
Wichtig:
>+U
>GND
>SCL
>SDA
Wenn nötig:
>INT
MfG Hannes

Snow Wolf
16.05.2011, 19:25
Ok es ist sind 2 PCA9555D Bausteine die ich verwenden will. Das heißt ich muss due +5V vom µC und GND an den Bus hängen damit alles einwandfrei funktioniert?

MfG Snow Wolf

Chypsylon
16.05.2011, 19:50
Ok es ist sind 2 PCA9555D Bausteine die ich verwenden will. Das heißt ich muss due +5V vom µC und GND an den Bus hängen damit alles einwandfrei funktioniert?

Mit dem Bus (also SCL und SDA) ist nur +5V über Pullup Wiederstände (z.B. 4,7k) verbunden aber die PCA9555D musst du mit GND und +5V versorgen (wahrscheinlich eh was du gemeint hast ;) )
Grüße aus Graz :)

Klebwax
17.05.2011, 01:21
Mit dem Bus (also SCL und SDA) ist nur +5V über Pullup Wiederstände (z.B. 4,7k) verbunden aber die PCA9555D musst du mit GND und +5V versorgen (wahrscheinlich eh was du gemeint hast ;) )
Grüße aus Graz :)

Ich versuche mal ein wenig System in das Ganze zu bringen. Jeder Chip braucht eine Versorgung. Ich hab jetzt die PCA9555 nicht nachgesehen, aber ich vermute sie brauchen 5V, der ATmega16 auch. Wenn sie miteinander kommunizieren sollen, sollten sie eine gemeinsame Masse haben.

Und nun der Bus. I2C hat 2 Leitungen, die müssen an alle Beteiligten gehen, es ist ja ein Bus. Der Bus ist OC, daher werden Pullups an beiden Leitungen gebraucht. Die I2C Spec sagt, jeder Ausgang muß 3mA treiben können, also darf der Pullup nicht so klein sein, daß mehr als 3mA fließen. Von der Physik ist das schon alles. Von der Logik muß man noch beachten, das alle Knoten am Bus eine eigene Adresse haben. Der µC ist der Master, die beiden PCA9555 müssen auf unterschiedliche Adressen gesetzt werden.

Ein Interrupt gehört nicht zum I2C Bus. Wenn ich aber als Master nicht dauernd die Slaves pollen will, kann mir ein Interrupt die Arbeit erleichtern. Dazu wird jeder Interruptausgang eines PCA9555 an einen Interrupteingang des µC gelegt. Wenn dann ein Interrupt auftritt, weiß der µC an welchem PCA ein Ereigniss aufgetreten ist, um das er sich kümmern muß.

MfG Klebwax

modtronic
18.05.2011, 09:15
Hallo

Ich gebe dir noch einen kleinen Tip.

Ich habe das so gelöst. die I2c-Bausteine benötigen für ihre Arbeit ja +5V. Da ich jetzt nicht weiß wie lange deine Leitung dazwischen ist empfehle ich dir
bei längerer Leitung den Spannungsregler für die beiden PCA mit auf der Platine unterzubringen wo sich sich befinden.
Ich habe das über eine 10 poligen Wannenstecker gemacht
Ich habe dort + 12V, GND, SCA und SCL. Die 5 Volt werden dann über ein 78L05 aus den 12 Volt gewonnen.
Ich habe mich für diese Lösung entschieden um SPannungsverlust vorzubeugen da ich dazwischen längere Leitungen haben.

MFG
Patrick

Snow Wolf
18.05.2011, 12:47
Ich glaub so werde ich das machen. Aber wenn ich nur GND verbinde müsste es dann nicht auch funktionieren?

MfG Snow Wolf

Richard
18.05.2011, 14:30
Hallo

Ich gebe dir noch einen kleinen Tip.

Ich habe das so gelöst. die I2c-Bausteine benötigen für ihre Arbeit ja +5V. Da ich jetzt nicht weiß wie lange deine Leitung dazwischen ist empfehle ich dir
bei längerer Leitung den Spannungsregler für die beiden PCA mit auf der Platine unterzubringen wo sich sich befinden.
Ich habe das über eine 10 poligen Wannenstecker gemacht
Ich habe dort + 12V, GND, SCA und SCL. Die 5 Volt werden dann über ein 78L05 aus den 12 Volt gewonnen.
Ich habe mich für diese Lösung entschieden um SPannungsverlust vorzubeugen da ich dazwischen längere Leitungen haben.

MFG
Patrick

Der I²C Bus ist nur für relativ kurze Verbindungen geeignet, Lange Leitungen = Große Kapazitäten können die Bausteine nicht treiben. Genau genommen ist der I²C BUS ein Platinen BUS welcher NICHT wirklich für Kabel Anbindung geeignet ist.
Der Rest ist Probieren, Testen und Glück oder auch nicht haben....Man könnte einmal versuchen rs485 Leitungstreiber an I²C zu koppeln, das sind auch OC Treiber welche Parallel am Bus hängen, aber locker 1200m überbrücken können. :-)

Gruß Richard

Snow Wolf
18.05.2011, 14:34
Naja und wie geht das mit den Treibern? Kann ich da einfach 2 nehmen anstecken und schon geht das ganz normal?

MfG Snow Wolf

Richard
18.05.2011, 15:48
Naja und wie geht das mit den Treibern? Kann ich da einfach 2 nehmen anstecken und schon geht das ganz normal?

MfG Snow Wolf

Ich habe extra "versuchen" geschrieben weil (ich) das noch nie probiert habe.

Gruß Richard

modtronic
18.05.2011, 17:16
Also

GND ist immer bezugsmasse.
GMD musst du mit dem AT-Mega verbinden, den I2c Bausteinen und auch mit dem Spannungsregler.
Es ist dnan immer deine Bezugspotential.

Also wegen der Länge. 10 m gehen schon beim i2c BUs
ich Betreibe ich bei einem Kollegen auf der MOdellbahn und da klappt es auch.
Aber ich gebe dir recht das man da vorsichtig sein sollte.

Klebwax
18.05.2011, 19:40
Ich glaub so werde ich das machen. Aber wenn ich nur GND verbinde müsste es dann nicht auch funktionieren?

Ja, es wird.


Der I²C Bus ist nur für relativ kurze Verbindungen geeignet, Lange Leitungen = Große Kapazitäten können die Bausteine nicht treiben. Genau genommen ist der I²C BUS ein Platinen BUS welcher NICHT wirklich für Kabel Anbindung geeignet ist.
Der Rest ist Probieren, Testen und Glück oder auch nicht haben

Das hat mit Glück nichts zu tun. Ein I2C Ausgang muß 3mA und 400pF treiben. Wenn man dann das verwendete Kabel berücksichtigt, läßt sich die Länge genau bestimmen. Um die größte Länge zu erreichen, muß der Pullup so klein wie möglich sein, um die Signalanstiegszeit kurz zu halten. Wenn man durch ungeschickte Kabelbelegung Probleme mit Übersprechen hat, hat das mit I2C nichts zu tun. Selbstverständlich ist der I2C Bus für Geräteinterne Kabel gedacht gewesen, z.B. zwischen den Baugruppen eines Röhrenfernsehers.
Mit speziellen Treiberbausteinen und den richtigen Kabeln sind auch Buslängen von über 100m möglich, auch ohne Glück.


Ich habe das über eine 10 poligen Wannenstecker gemacht
Ich habe dort + 12V, GND, SCA und SCL. Die 5 Volt werden dann über ein 78L05 aus den 12 Volt gewonnen.
Ich habe mich für diese Lösung entschieden um SPannungsverlust vorzubeugen da ich dazwischen längere Leitungen haben.

Das ist eine vernünftige Lösung. Wenn man dann noch, wie bei anderen Datenkabeln auch üblich, zwischen zwei signalführenden Adern eine Passive Ader (12V oder GND) führt, minimiert man ein mögliches Übersprechen. Und wenns mal etwas mehr Strom sein soll, einen Schaltregler statt des 78L05.

MfG Klebwax

MfG Klebwax

modtronic
18.05.2011, 20:01
Ich arbeite mit 2,2 K Pull-Up Widerständen.
Einmal in der Nähe des AT-Mega und einmal in der Nähe der I2c Bausteine.
Ich habe wie gesagt bei 10 m keine Probleme gehabt und die beiden Leitungen liegen Nebeneinander..also scl und sda.

ich nutzte eine 1opoligen Wannenstecker wobei die beiden Gegenüberliegenden Pins immer Gleiches Potential haben.
Daher immer zwei Leitungen gleiches Potential
aber ich gebe recht das man die beiden Leitungen evlt noch voneinander trennen sollte
Oder einfach einen Treiber dazwischen dann ist das Problem aus der Welt.
Ich glaube mit dem Treiber werde ich mal einen Versuch machen

MFG
modtronic

Klebwax
18.05.2011, 20:28
Ich arbeite mit 2,2 K Pull-Up Widerständen.
Einmal in der Nähe des AT-Mega und einmal in der Nähe der I2c Bausteine.
Ich habe wie gesagt bei 10 m keine Probleme gehabt und die beiden Leitungen liegen Nebeneinander..also scl und sda.

ich nutzte eine 1opoligen Wannenstecker wobei die beiden Gegenüberliegenden Pins immer Gleiches Potential haben.
Daher immer zwei Leitungen gleiches Potential
aber ich gebe recht das man die beiden Leitungen evlt noch voneinander trennen sollte
Oder einfach einen Treiber dazwischen dann ist das Problem aus der Welt.
Ich glaube mit dem Treiber werde ich mal einen Versuch machen

Der Reihe nach:
2 mal 2,2k bedeutet 1,1k Pullup, bei 5V mehr als 3mA. Hier verläßt du dich darauf, daß die Ausgänge besser sind als das Datenblatt. Hier ist also Glück angesagt. Das Problem könnte sein, daß die Ausgänge kein eindeutiges Low erzeugen können.

Kein Problem bei 10m ist ok.

Mit einem Treiber-Baustein wird das Problem des Übersprechens größer und nicht kleiner. Ein schwacher Ausgang (3mA ist schwach) und ein langes Kabel machen das Signal "rund". Ein starker Ausgang (extra Treiberbaustein) sorgt für schnelle Signalanstiege und damit für erhöhtes Übersprechen.

Der I2C Bus ist aber so langsam, daß selbst mit einem billigen Scope alle Probleme gefunden und ohne Vodoo gelöst werden können. Die Spec ist weniger als 50 Seiten und frei verfügbar.

MfG Klebwax

modtronic
18.05.2011, 20:37
Also..du meinst
ich sollte die Pullups nur auf der Treiberkarte einlöten oder nur auf einer Platine mit den PCF Bausteinen
oder Lieber dann die Widerstände vergrößern so daß alle Parallel auf ca 2,2 KOhm kommen ???

Oder sollte ich evlt die Pull-Ups auf 4,7 Kohm ändern? Ich denke das würde auch noch reichen.

bei dem Treiber den ich habe benötigt man insgesamt zwei Stück von-
einen als Sender und einen als Empfänger, dazwischen wird das Signal verstärkt
Das Problem mit dem Übersprechen habe ich so gelöst, das auf den geätzen Versionen immer eine Leitung dawischen auf GND liegt

Auf meine Platinen als Laborversuch war das nciht so einfach möglich, da denke ich bin ich auf der Sicheren Seite.

Habe jetzt mal 4,7 Kohm eingelötet und der Bus läuft auch stabil.
Habe sowieso überall Jumper und dann kann ich ja wie ich es brauche die Pull Ups einstellen.
Wenn ich jetzt entscheiden würde wie ich es jetzt machen würde.. würde ich die Pull-Ups auf dem letzen Teilnehmer einstellen.

Kann es aber noch ändern Falls erforderlich.

MFG
modtronic

Klebwax
18.05.2011, 23:21
Also..du meinst
ich sollte die Pullups nur auf der Treiberkarte einlöten oder nur auf einer Platine mit den PCF Bausteinen
oder Lieber dann die Widerstände vergrößern so daß alle Parallel auf ca 2,2 KOhm kommen ???

Oder sollte ich evlt die Pull-Ups auf 4,7 Kohm ändern? Ich denke das würde auch noch reichen.

bei dem Treiber den ich habe benötigt man insgesamt zwei Stück von-
einen als Sender und einen als Empfänger, dazwischen wird das Signal verstärkt
Das Problem mit dem Übersprechen habe ich so gelöst, das auf den geätzen Versionen immer eine Leitung dawischen auf GND liegt

Bei einem nicht segmentierten Bus, also ohne Treiberbausteine, würde ich Pullups auf beide Seiten setzen, also z.B. jeweils 4,7k oder 3,9k. Solange der Bus auf einer Platine ist, reicht auch einer. Bei einem Kabel entsteht dabei ein positiver Effekt, wenn das Kabel unterbrochen wird, funktioniert die Physik trotzdem und der Bus hängt nicht. Man kann leicht testen, ob das Kabel ok ist, der Slave muß, wenn er mit seiner Adresse angesprochen wird, immer mit ACK antworten. So kann man leicht die Integrität seines Systems testen.

Was für einen Treiber setzt du ein? Da gibt es unterschiedliche Konzepte.

MfG Klebwax

modtronic
19.05.2011, 12:59
was meinst du mit treiber genau ?

ich habe 8 platinen mit jeweils 2 pcf 8574. Einer ist die AP der andere die P version.
wo sollte ich da pullups aktivieren ?

MFG