PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AT Mega 128 und P82b715 / P82b96 Probleme ??



modtronic
09.12.2019, 16:10
Mahlzeit

Die beiden ICs P82b715 und P82b96 sollen den i2c Bus Verstärken um längere Busleitungen zu ermöglichen.
Beide Extender/Buffer arbeiten Problemlos am Atmega 16 oder 32 ect, jedoch nicht am 128er Typ.
Ich brauche pro Sender und Empfänger seite immer ein Päärchen.

Hat jemand ähnliche erfahren damit gemacht und evlt ein Problem damit gehabt und gelöst ?

Das Problem äussert sich, das sobald nur ein IC am BUs hängt dieser nicht mehr sauber arbeitet.
ich habe leider im Netz sehr wenig dazu gefunden, ein Telefonat mit einem Elektroniker brachte leider auch nicht
den gewünschten Erfolg.

Der 128 ist eine SMD variante, ich denke nicht das dass Problem ist ? oder ?

Hoffe jemand weiss Rat

Grüsse
Pat

Moppi
09.12.2019, 16:33
Hallo,

mit welcher Spannung werden die einzelnen ATmega denn betrieben? Alle mit 5V? Oder ist das zwichen dem 16er, dem 32er und dem 128er unterschiedlich? Und mit welchen Spannungen werden die P82b715 und P82b96 betrieben?



MfG
:Weihnacht

modtronic
09.12.2019, 16:59
Hi

Sämtliche At Megas werden mit 5Volt stabilisert betrieben.
Dezentrale Platine bekommen je ein eigenes netzteil, Spannungsregler spendiert.
Masse wird dann Dicker ausgeführt, der Schirm einseitig aufgegelegt.

ich habe ca 14 P82B715 in Betrieb die alle Problemlos laufen, meist an 8er, 16 oder 32 Megas.

ich baue meine Steuerung im Europaformat auf.
Für die Senderplatine gibt es eine Karte die in das echtsprechende rack eingeschoben wird.
Diese karte läuft am 32 Typ zb Problemlos, am 128 macht sie den Bus strubelig.

Das lässt sich so testen, das ich alle Ports des MC23017 auf High setze. wenn ich den MCP direkt am i2c Bus betriebe
leuchten alle angeschlossen Leds auf.
Über den B715 und b96 jeweils nur der PORT B, PORTA bleibt tot.
Ein direkt angeschlossener MCP zeigt das gleiche Verhalten. Der Fehler kommt auch sobald nur der b715 oder b96 am Bus ohne Empfänger angeschlossen ist.

der 715 wird mit 5 Volt betrieben, der 96 wird mit 12Volt gespeist.
Beide zeigen das gleiche Problem ?

ich habe auch schon mit und ohne i2c Pull ups versucht, gleiches Problem.

Grüsse
Patrick

Crazy Harry
09.12.2019, 17:06
Was für ein Mega128 ist das genau und wo liegen die I2C-Anschlüsse? Hardware- oder Software-I2C?

modtronic
09.12.2019, 17:20
Hi

Ähm, ich habe mir den At.-Mega bei chip 45 gekauft, bzw mehrere

Hier mal der Link
https://www.chip45.com/products/crumb128-light_avr_atmega_modul_board_atmega128.php

Hardware, software i2c ? sagt mir leider nix.

aber wenn du so fragst würde ich sagen, hardware da ich ja auch Platinen gebaut habe.

vllt erklärst du mal was ein software i2c sein soll ? leider noch nicht so gehört.

Was meinst du mit, wo liegen die Anschlüsse ?

Grüsse
Patrick

Crazy Harry
09.12.2019, 17:50
Hardware-I2C verwendet die Pins 25 und 26 und der uC übernimmt das Takten und die Datenausgabe. Software-I2C emuliert per Software ein I2C-Interface und es kann fast jeder PortPin verwendet werden.
Ich weiss nicht wie dein Treiber arbeitet, aber evtl. mußt du DDR vom SCL manuell setzen?
Schon mal direkt am Controller getestet?

modtronic
09.12.2019, 18:17
Hallo

Ja,dann ist es Hardware.
ja wie oben geschrieben direkt am Controller läuft es Problemlos.
Sobald der Bustreiber 715 oder 96 angeschlossen spinnt der Bus.

Ich verwende die Routinen vom Codevision für den i2c Bus.
da alle anderen Megas laufen, sollte es hier wohl auch gehn.
Die Routionen werden über den Codewizard eingestellt, PORT und Pins auswählen fertig

Der Mega 128 läuft im 8 Mhz Betrieb.

Grüsse
Patrick

Crazy Harry
09.12.2019, 19:16
Wie schnell ist der I2C? 100 oder 400kHz? Schon mal mitm Oszi die Signale angeschaut?

modtronic
09.12.2019, 20:41
Hi

Der Bus läuft mit der Standard Routine 100khz.
Wäre aber auch egal, da der 96er Typ 400 könnte, der Fehler aber gleich ist.

Habe mir das ganze auf dem Oskar angesehn, leider konnte ich nichts finden
was das Problem erklären könnte.
Ich vermute das der 128er einen anderen Treiber für den Bus und das evlt Hardwaretechnisch nicht schafft.
Die Frage wäre ob man das ganze evlt mit nem normalen TTL oder Cmos Baustein Puffern könnte ?
Habe im Netz nichts gefunden.

Grüsse
Patrick

Moppi
09.12.2019, 21:04
Die Frage wäre ob man das ganze evlt mit nem normalen TTL oder Cmos Baustein Puffern könnte ?

Du könntest z.B. einen SN74HC32 zum Ausprobieren nehmen. Sind ODER-Gatter. Zwei Eingänge eines Gatters überbrücken. Dann folgt der Ausgangszustand, des Gatters, dem Eingangszustand.
Oder Du legst einen Eingang eines ODER-Gatters auf 0V (LOW), und den anderen Eingang verbindest Du mit dem ATmega-Ausgang. Gibt dasselbe Ergebnis.

Der SN74HC32 "Can Drive Up To 10 LSTTL Loads". Sollte also ausreichend sein. Ein ATmega sollte das aber auch schaffen. Daher wunder Dich nicht, falls das nichts ändert.


MfG

modtronic
09.12.2019, 21:44
Du könntest z.B. einen SN74HC32 zum Ausprobieren nehmen. Sind ODER-Gatter. Zwei Eingänge eines Gatters überbrücken. Dann folgt der Ausgangszustand, des Gatters, dem Eingangszustand.
Oder Du legst einen Eingang eines ODER-Gatters auf 0V (LOW), und den anderen Eingang verbindest Du mit dem ATmega-Ausgang. Gibt dasselbe Ergebnis.

Der SN74HC32 "Can Drive Up To 10 LSTTL Loads". Sollte also ausreichend sein. Ein ATmega sollte das aber auch schaffen. Daher wunder Dich nicht, falls das nichts ändert.


MfG

Nabend

Das war mein erster Gedanke das es vermutlich auch nicht gehn wird.
Hat den niemand sowas schonmal gebaut ?

Frage ist, ob man das ganze noch mit den Pull Ups beeinflussen könnte, bzw ich frage mich was ist am MCP anders als an dem P82b715 ??

Ich verwende 4,7K, vllt verkleinern, vergrössern ?

Grüsse
Pat

Moppi
09.12.2019, 22:08
Hallo!

Die Pull-Ups beeinflussen den ATmega nicht. Nur die Datenübertragung von einem P82B715 zum anderen. Wenn die Übertragung von einem P82B715 zum andern also funktioniert (mit anderen ATmega-Modellen) müssen die Widerstände nicht geändert werden. Jedenfalls laut Datenblatt. Da steht auch ne Formel zur Berechnung drin.

Stell doch mal bitte einen Schaltplan oder Flussdiagramm (mit Bezeichnung der ICs) hier ein, dass man erkennt, wie die Kommunikation läuft, das macht es etwas einfacher.


Das Problem äussert sich, das sobald nur ein IC am BUs hängt dieser nicht mehr sauber arbeitet.
Mir z.B. ist noch nicht klar, wie das genau aussieht, wenn "nur ein IC am BUs hängt".
Ist für mich unlogisch, da Du doch immer zwei brauchst, also ein Paar?

Ich kenne den MC23017 nur vom Sehen, habe aber keinen Plan, wie man den anschließt. Ich sehe aber was von ITB und ITA, was bestimmt etwas mit den Ports zu tun hat. Ich sehe auch noch RST, was vermutlich RESET bedeutet. Vielleicht hast Du einen Programmierfehler beim ATmega128? - Programmcode und Funktion prüfen.


MfG
:Weihnacht

modtronic
09.12.2019, 23:14
Hallo

Wenn ein MCP direkt am i2c Bus läuft, aber über den Busextender nicht, kann es ja kein Programmfehler sein.

ich habe mir die Datenblätter jetzt auch nochmal angesehn und mir hat es gerade keine Ruhe gelassen.
Ich habe die Pullups erst auf 20K erhöht, was dann bei den direkten MCP am Bus den gleichen Fehler zur Folge hat wie an den Dezentralen.
Dann habe ich die Pullups auf 1,5K verringert und sie da....es läuft

ich habe dann nochmal meine Oskar angeschlossen und das was sie ändert ist die Differenz zwischen Low und High.
zwar unlogisch weil eigentlich keine Pullups nötig sind auf der Senderseite.
Ich habe jetzt zwei MCPs auf der externen Platinen am laufen. Wenn es so geht lasse ich das ganze so

So ganz logisch scheint es nciht, aber es erklärt mir nur, das der 128er AT Mega doch anders sein muss, vllt aufgrund der SMD Bauweise ?

Wenn Interesse besteht stelle ich mal von dem ganzen Bilder ein ??

Grüsse
Patrick

Moppi
10.12.2019, 00:30
Die Pull-Up-Widerstände bestimmen den Spannungspegel, der an der Gegenstelle ankommt. Es handelt sich ja um einen Leitungstreiber. Normal werden da offene Kollektoren verwendet, deswegen der Widerstand gegen eine positive Spannung. Wenn Du den Widerstand verkleinerst, steigt die Spannung bei LOW-Pegel und bei HIGH-Pegel. Es ist schon sinnvoll, auszuprobieren, welche Widerstandswerte am besten funktionieren. Da spielt vor allem der Leitungswiderstand eine Rolle. Klemme mal die eine Seite einer Leitung an 5V an und messe am anderen Ende. Es kann ein nicht unerheblicher Spannungsabfall auftreten. Z.B. misst Du dann keine 5V mehr, sondern nur noch 4.8V oder 4.5V. Aber wir kennen die Leitungslängen hier nicht. Musst Du selber schauen, wie es sich damit verhält. Nimm Widerstandswerte, die für Deinen Zweck (Kabel und deren Länge) sicher funktionieren. Wenn es dann jetzt funktioniert, ist es ok so. Alles andere kannst Du nur mit Messen herausbekommen, wie Pegel, die der ATmega am Ausgang liefert und ob der Pegel Einfluss auf das Signal auf der Leitung hat.



MfG
:Weihnacht

Moppi
10.12.2019, 06:53
Guten Morgen,


was ist am MCP anders als an dem P82b715

Ich dachte die ganze Zeit, Du setzt P82b715 ein.

Dafür gibt es dieses Bild für die Beschaltung:
34554
Da brauchst Du die beiden Pull-UPs an den Treiber-Ausgängen.





MfG

- - - Aktualisiert - - -


Beim MCP23017 steht im Datenblatt:



3.5.7 PULL-UP RESISTOR CONFIGURATION REGISTER

The GPPU register controls the pull-up resistors for the port pins. If a bit is set and the corresponding pin is configured as an input, the corresponding port pin is internally pulled up with a 100 kOhm resistor.


Der 100k-Pull-UP ist also offenbar nur zuschaltbar, wenn ein Port des MCP23017 als Input konfiguriert wird. Je nach Leitung (-länge) können 100k aber zu viel sein. So dass Du einen extra Pull-UP an der Leitung benötigst.

Für den Fall, dass Du etwas nachrechnen willst:

Für den P82b715 steht unter 9.2.2 Detailed Design Procedure genau, wie man die Pull-UPs berechnet, welche Auswirkungen dies auf das Signal hat, dass man bei mehreren Widerständen an einer Leitung die gegenseitige Beeinflussung berücksichtigen muss (Parallelschaltung), und dass vom Prinzip her nur ein Pull-UP an einer Leitung notwendig ist.

Klebwax
10.12.2019, 09:02
Normal werden da offene Kollektoren verwendet, deswegen der Widerstand gegen eine positive Spannung.
Der Open-Collector bzw. Open-Drain Ausgang gehört zum Konzept des I2C Busses. Sowohl SCL als auch SDA können von jedem Gerät am Bus angesteuert werden und das ist über OC Treiber gelöst. Die I2C Leitungen sind immer OC. Damit eine Leitung High werden kann, muß an jeder Leitung ein Pullup sein.


Dafür gibt es dieses Bild für die Beschaltung:
[/COLOR]34554
Da brauchst Du die beiden Pull-UPs an den Treiber-Ausgängen.

Dieses Bild ist missverständlich. Natürlich müssen sowohl links als auch rechts an SDA/SCL ebenfalls Pullups sein. Diese müssen nicht unbedingt sichtbar sein, es können auch interne Pullups z.B. in einem µC sein. Verhalten sich die verschiedenen Atmegas da gleich?


Der 100k-Pull-UP ist also offenbar nur zuschaltbar, wenn ein Port des MCP23017 als Input konfiguriert wird. Je nach Leitung (-länge) können 100k aber zu viel sein. So dass Du einen extra Pull-UP an der Leitung benötigst.

Diese Pullups sind an den Portpins des MCP, nicht an den Datenleitungen. Wie soll es auch möglich sein, bei einem Slave Pullups am Bus einzuschalten, wenn der Bus wegen fehlender Pullups gar nicht geht.

Die Größe der Pullups ist unkritisch.


Ich habe die Pullups erst auf 20K erhöht, was dann bei den direkten MCP am Bus den gleichen Fehler zur Folge hat wie an den Dezentralen.
Dann habe ich die Pullups auf 1,5K verringert und sie da....es läuft

Das darf so nicht sein, du hasst dort ein anderes Problem.



ich habe dann nochmal meine Oskar angeschlossen und das was sie ändert ist die Differenz zwischen Low und High.
zwar unlogisch weil eigentlich keine Pullups nötig sind auf der Senderseite.

Vielleicht ist es dieses Problem: selbstverständlich sind auf allen drei Segmenten des Busses Pullups nötig. Wenn es auf der µC Seite bisher ohne sichtbare Pullups lief, hast du möglicherweise in deinem Treiber interne Pullups eingeschaltet und das funktioniert beim 128 etwas anders.

MfG Klebwax

modtronic
10.12.2019, 15:01
Mahlzeit

Zum Verständnis.
ich betriebe die MCP23017 nur als Outputs
Von der Schaltung ist das ganze so aufgebaut

AT-Mega 128 -> P82B715 -> P82b715 -> MCp23017
Sender Empfänger

Der Empfänger mit dem MCp23017 sitzt mit dem Spannungsregler auf einer Platine

Als Kabel wird ein 4 poliges abgeschirmtes Kabel verwendet
auf der Empfängerplatine ist ein 78s05 verbaut für die Versorgung der dez. Platine
Der Schirm ist nur am Sender auf Masse gelegt

Die Pull Ups auf der Treiberseite als LSCL und LSDA sind immer vorhanden gewesen. (330 Ohm)
laut dem Datenblatt soll es angeblich nicht nötig sein, auf der Senderseite am i2c Bus (CPU)
also scl und sda an der CPu diese einzubauen
So läuft es allerdings auch bei zb dem Mega 16 Problemlos. Hier wird nur die Empfängerseite, also das zurückwandeln des Busses auf den i2c mit Pull Ups versehn, die Senderseite hat die 330 Ohm.

Am At-mega 128 habe ich nun als Pull Ups des i2c Busen 1,5K genommen
da läuft es. Ohne geht es auch nicht.

Ich habe nun auf der Dezentralen externe Platine die Pull Ups auf 2,2K (i2c) geändert.
so läuft alles stabil

das der Mega 128 irgendwie anders sein muss, zeigt schon die Hardwaretechnische Sache
das ich die Pullups anpassen mussn bzw das erprobte und Funktionierende am Mega 16, 32 und 8 am Mega 129 nicht funktioniert.
Kabellänge ist ca 4m, das ganze drei mal in die Gleiche Richtung verlegt, daran kann es als nicht liegen.

Wenn es so läuft, lasse ich das laufen, weil ich habe mich jetzt fast 1 Woche damit befasst.

Grüsse
Patrick

Moppi
10.12.2019, 16:35
FRAGEZEICHEN

Vielleicht hängt das damit zusammen, was im Datenblatt des ATmega128 steht:

SCL, Two-wire Serial Interface Clock: When the TWEN bit in TWCR is set (one) to enable the Two-wire Serial Interface, pin PD0 is disconnected from the port and becomes the Serial Clock I/O pin for the Two-wire Serial Interface. In this mode, there is a spike filter on the pin to suppress spikes shorter than 50ns on the input signal, and the pin is driven by an open drain driver with slew-rate limitation.

Würde bedeuten, dass SCL (Pin#25 PD0) für I2C-Betrieb dann als Open-Drain geschaltet wird und einen externen Pull-UP benötigt(?)
Dann hättest Du einen Pull-UP am Pin#25 des ATmega128, wegen dem Open Drain. Der andere Pull-UP am Pin#26 entspräche dann dem R1 im Datenblatt des P82B715, wie unter Figure 5. Single Pullup Buffered Bus gezeigt. Allerdings halte ich 1.5kOhm für ein bißchen wenig. Ich würde es mit größeren Werten versuchen >=4.7kOhm. Dieser R1 wird im Beispiel des P82B715 mit 10kOhm angegeben.

/FRAGEZEICHEN


Beim ATmega328 steht dasselbe drin:

SCL/ADC5/PCINT13 – Port C, Bit 5– SCL: 2-wire Serial Interface Clock. When the TWEN bit in TWCR is set (one) to enable the 2-
wire Serial Interface, pin PC5 is disconnected from the port and becomes the Serial Clock I/O
pin for the 2-wire Serial Interface. In this mode, there is a spike filter on the pin to suppress
spikes shorter than 50 ns on the input signal, and the pin is driven by an open drain driver
with slew-rate limitation.

Und beim ATmega16 steht dasselbe drin:

SCL, Two-wire Serial Interface Clock: When the TWEN bit in TWCR is set (one) toenable the Two-wire Serial Interface, pin PC0 is disconnected from the port andbecomes the Serial Clock I/O pin for the Two-wire Serial Interface. In this mode, there isa spike filter on the pin to suppress spikes shorter than 50 ns on the input signal, and thepin is driven by an open drain driver with slew-rate limitation.

Also wieder keine richtige Erklärung, irgendwie.

MfG
:Weihnacht

modtronic
10.12.2019, 16:56
Hallo

ja darüber bin ich schon gestossen, habe es aber nicht weiter beachtet weil... das ich generell immer die Pull Up Widerstände am i2c Bus auf meine CPU Platinen vorsehe.
In der Regel nehme ich 4,7K, damit läuft am Mega 128 der I2c Bus, direkt zb den MCp angeschlossen Problemlos, bzw auch alle anderen Mega bei mir.
Früher habe ich 10K genommen auch das ginge.

Es ist das erste mal, das ich solch ein Problem hatte mit dem i2c Bus.
ich weiss nur, wenn die Pull Ups nicht da sind, läuft der Bus generell nicht, daher sehe ich sie immer vor.
Das sie zu Gross sind (4,7K) hätte ich nicht gedacht

Grüsse
Patrick

- - - Aktualisiert - - -


FRAGEZEICHEN

Vielleicht hängt das damit zusammen, was im Datenblatt des ATmega128 steht:


Würde bedeuten, dass SCL (Pin#25 PD0) für I2C-Betrieb dann als Open-Drain geschaltet wird und einen externen Pull-UP benötigt(?)
Dann hättest Du einen Pull-UP am Pin#25 des ATmega128, wegen dem Open Drain. Der andere Pull-UP am Pin#26 entspräche dann dem R1 im Datenblatt des P82B715, wie unter Figure 5. Single Pullup Buffered Bus gezeigt. Allerdings halte ich 1.5kOhm für ein bißchen wenig. Ich würde es mit größeren Werten versuchen >=4.7kOhm. Dieser R1 wird im Beispiel des P82B715 mit 10kOhm angegeben.

/FRAGEZEICHEN


Beim ATmega328 steht dasselbe drin:


Und beim ATmega16 steht dasselbe drin:


Also wieder keine richtige Erklärung, irgendwie.

MfG
:Weihnacht

Wie ich oben geschrieben hatte
läuft das ganze mit 4,7K nicht, was ich als Standard Wert immer hatte
Bei 2,2K hatte ich es auch versucht, da ging es mal ja, mal nein

Klebwax
10.12.2019, 18:27
ich betriebe die MCP23017 nur als Outputs

Das spielt für den I2C Bus keine Rolle.


Als Kabel wird ein 4 poliges abgeschirmtes Kabel verwendet

Schon mal die Signale auf diesem Bus angesehen? Wie sieht es mit Cross Talk, Übersprechen, zwischen SCL und SDA aus?



Die Pull Ups auf der Treiberseite als LSCL und LSDA sind immer vorhanden gewesen. (330 Ohm)

Woher stammt dieser Wert? Ich halte ihn für zu klein. Da fließen bei 12V mehr als 30mA in jedem, der Teiberbaustein muß also über 60mA liefern. Das ist ja mehr als der ganze Rest der Schaltung braucht.


laut dem Datenblatt soll es angeblich nicht nötig sein, auf der Senderseite am i2c Bus (CPU)

An einem I2C-Bus müssen Pull-Ups sein, sonst wird keine Leitung je High. Das ist eine Binse, ob das extra im Datenblatt eines Treiberchips stehen sollte?



Kabellänge ist ca 4m, das ganze drei mal in die Gleiche Richtung verlegt, daran kann es als nicht liegen.

Wenn es so läuft, lasse ich das laufen, weil ich habe mich jetzt fast 1 Woche damit befasst.

4m schaffe ich ohne Treiber mit einem geteilten Pullup von je 4,7k auf beiden Seiten. Mit den Treibern und 12V soll man 100m und mehr erreichen. Du hast also ein anderes Problem, daß du mit extrem niederohmigen Pullups überdeckt hast. Nach meiner Erfahrung fällt einem sowas auf die Füsse, wenn man es am wenigsten braucht.

MfG Klebwax

Moppi
10.12.2019, 18:41
Du hast also ein anderes Problem, daß du mit extrem niederohmigen Pullups überdeckt hast.

Das denken wohl mittlerweile alle, die irgendwie helfen wollen. Aber die Frage ist doch: was für ein Problem soll diese Symptome verursachen? Deswegen hatte ich ja auch schon getipt, dass es evtl. ein Softwareproblem ist (setup()-Code).
Mich interessiert brennend, was es ist. Dafür gibt es einen Grund und der scheint so schwer nicht zu finden zu sein, da man es gut eingrenzen können sollte.


MfG
:Weihnacht

Achim S.
10.12.2019, 19:21
Hallo
wenn ich das richtig sehe arbeitest du mehr mit dem I2C Bus. Habe ebenfalls verschiedene Module mit dem Bus aufgebaut und betreieb sie auch damit. Nutze auch verschiedene Prozessoren SAM und Ati 841.
achim

modtronic
10.12.2019, 20:12
ich verwende den b715.
Den Betreibe ich, wie oben auch geschrieben mit 5V.
Der Wert 330 Ohm stammt aus dem Datenblatt.

Ich habe 4M mit dem i2c Bus noch nie geschaft. ich
baue an der Steuerung bereits 6 Jahre, bze entwickel daran.
ich bezweifel das der Bus in einer Modellbahn wo nach andere Spannungen herrschen dauerhaft sauber läuft.
Umsonst wird so ein Baustein ja auch nicht angeboten

ich habe At-Mega 8 laufen da habe ich vor dem Sender keine Pull Ups verbaut.
ist auch laut Datenblatt beider Extender/Buffer so beschrieben

Mit dem Oskar habe ich geschaut, auch oben geschrieben
Sieht alles gut aus !

Grüsse
Patrick

Klebwax
11.12.2019, 15:19
Ich habe 4M mit dem i2c Bus noch nie geschaft.

Das hab ich nicht einfach nur dahin gesagt, das hab ich verfiziert. Ich beschäftige mich mit I2C schon eine Weile. Vollständig verstanden, wie da alles zusammenspielt, habe ich den Bus, als ich einen Master in Software (bitbanging) geschrieben habe. Und da nicht nur hier der I2C Bus den Ruf hat, nur für ganz kurze Strecken brauchbar zu sein, habe ich selbst einige Versuche gemacht. Ein paar Aufzeichnungen hab ich gefunden.

Der Testaufbau war ein PIC24 mit Hardware I2C. Da der einen eigenen Baudrategenerator für I2C hat, kann man da beliebig leicht an der Frequenz drehen. Er hat außerdem zuschaltbare Pullups an den Pins, man kann also leicht mit internen und externen Pullups testen. Als Slave habe ich damals einen LIS3LV02 Accelerometer auf einem Breakouboard genommen. Da musste man nicht viel löten. Die Software ist simpel: man erzeugt ein Start, schickt die richtige Adresse und ein WRITE und dann ein Stop. Kommt ein ACK, hat der Slave die Adresse erkannt. Ansonsten ist der Bus gestört. So machen das die I2C-Bus Scanner.

Ein Bild, das ich gefunden habe ist dies vom LA

34555

Es zeigt, daß der LIS3L auf kurzer Strecke mit 1MHz funktioniert. Das ist das 2,5 fache des garantierten Wertes von 400kHz. Hier der Testaufbau dazu

34556

Und auch mit diesem Aufbau waren mehr als die 400kHz erreichbar. Hier habe ich zwei Pullups von 4,7k jeweils an den Enden verwendet. Das Kabel war rund 3,5m lang, ein gewönliches Telefonkabel mit 4 Adern.

34557

Das einzige was da zählt ist die Kombination von Kabelkapazität und Pullup. Diese bilden einen Tiefpass für die steigende Flanke des Signals. Je länger das Kabel, desto flacher wird der Anstieg und desto niederohmiger muß der Pullup werden. Ansonsten erreicht der Highpegel bei gegebenem Takt nicht mehr gültige Werte. Aufgrund der I2C Spezifikation gibt es eine theoretische Grenze: der Treiber muß 3mA liefern können, daraus errechnet sich je nach Busspannung ein minimaler Pullup. Und er muß 400pf treiben können, daraus errechnet sich die mögliche Kabellänge. Nimmt man mal typische 50pf pro Meter und weitere 50pf für die übrigen Kapazitäten an, kommt man auf 5m. Praktisch habe ich auch 10m erreicht, dann aber nicht mehr mit 1MHz.

Das diese Überlegungen nicht ganz daneben liegen, zeigen käufliche HDMI Kabel. In denen liegt ein normaler I2C Bus, über den der PC die Daten des Monitors aus einem I2C-EEPROM liest. Und die gibt es bis 5m.

Die Treiber, wie der P82B96, habe mehrere Funktionen. Als erstes erhöhen sie den Strom von 3mA auf 30mA und die Kapazität von 400pF auf 4000pF. Damit kann man also ein längeres Kabel mit größerer Kapazität mit kleineren Pullups und damit gleicher Zeitkonstante betreiben. Aus den 5m werden so 50m. Deine 330Ω stammen aus einer solchen Rechnung, als Kabelkapazität wird hier 3000pF, also eine Länge von rund 60m, angenommen.

Gleichzeitig sind sie auch Levelshifter. Die Busse an beiden Seiten können verschiedene Spannungen haben. Daraus ergibt sich eine interessante Möglichkeit.

34558

Man betreibt den Bus im Kabel mit 12V und benutzt diese gleich als Versorgung für den Slave. Wenn man dort einen Schaltregler einsetzt, kann man dort mehr Strom entnehmen, als im Kabel fließt. Da spielt dann auch der Widerstand des Kabels keine Rolle, der Schaltregler kommt auch mit weniger als 12V klar. So verwende ich diese Treiber. Meine I2C Slaves sind typisch Prozessoren mit eigner Umgebung, die über den 12V I2C-Bus gesteuert und versorgt werden. Im einfachsten Fall werden dort Tasten entprellt, Drehencoder ausgewertet und LEDs angesteuert. Es gibt noch einen weiteren positiven Effekt. Der low-Pegel muß jetzt nicht mehr kleiner als 30% von 5V bzw 3,3V sein sondern 30% von 12V. Das Gleiche gilt für den High-Pegel. Der Störabstand wird also massiv größer. Und zu guter letzt schleppt man nicht die direkte Versorgung vom µC und vom Device durch die Gegend und fängt sich dabei Störungen ein.

Und nun zum größten Problem mit längeren Leitungen, dem Übersprechen. Je länger SDA und SCL parallel verlaufen desto größer kann das werden. Hier mal ein SDA Signal, das komplett unbrauchbar ist. Da schlägt SCL voll durch.

34559

Das Problem wird noch dadurch verschärft, daß manche die beiden Leitungen des I2C Busses mit differentiellen Signalen verwechseln und auf einem verdrillten Adernpaar führen. Die Beispiele z.B. aus dem P82B96 zeigen aber daß SDA und SCL mit je einer Versorgung ein Paar bilden sollten.

Sorry, ist etwas länger geworden

MfG Klebwax