Forum: Mikrocontroller und Digitale Elektronik Probleme mit I²C Extender PCA9515


von Thomas B. (t5b6_de) Benutzerseite



Lesenswert?

Hallo Leute,

Ich hatte gehofft das Problem selbst zu lösen aber nundenn, erst mal wie 
ist das ganze überhaupt entstanden.

Ich habe hier Zuhause einen selbst aufgebauten Hausbus auf Basis von 
TWI/I2C

Der Bus wird mit 100kHz betrieben, als Kabel dienen herkömmliche 
Patchkabel,
über die auch die Stromversorgung der Geräte läuft (bei 
"Kleinverbrauchern" wie Temperatursensoren, 5V maximal 50mA).
Geräte die mehr Strom benötigen, z.B. hier mein Grafikdisplay erhalten 
ein externes Netzteil.
Und hier fängt die Problematik an. Da ich das Display nicht immer 
eingeschaltet habe ziehe ich das Netzteil.
Das Problem dabei ist, das der AVR (ATMega32) dann die TWI-Pins auf 
Masse zieht, sobald keine Betriebsspannung anliegt, und damit den Bus 
blockiert.

Um das Problem zu umgehen habe ich mich entschieden einen PCA 9515 als 
Zwischenglied zu nutzen.
Dieser wird über den Bus mit Strom versorgt. Der Enable-Eingang ist 
High-Aktiv und bekommt das Signal von der Betriebsspannung des Mega32.
Damit wird es möglich das Gerät von der Betriebsspannung zu trennen und 
der PCA wird hochohmig. Der Bus wird nicht mehr blockiert.

Der PCA funktioniert aber leider nicht wie gewünscht.

Lasse ich den PCA raus, funktioniert die Übertragung fehlerfrei, auch 
wenn über 50kByte am Stück übertragen werden.
Die Probleme sind unabhängig vom Takt und der Kabellänge. Wenn 
allerdings gar kein Gerät am Bus betrieben wird, tritt das Problem nicht 
auf.
Ist ein Gerät unmittelbar parallel dazu am Bus, also nicht mehr als 2m 
Kabellänge entfernt gibt es ebenfalls keine Probleme. An der 
Betriebsspannung/Signalverlauf kann ich keine erkennbaren Unterschiede 
messen, auch nicht im 10mV Bereich.

Anbei ein paar Fotos vom Oszilloskop mit dem Signal.
Es macht den Eindruck als wenn das IC mit fortschreitender Übertragung 
"langsamer" wird, und die Geräteseite nicht mehr richtig auf Masse 
ziehen kann.

Ich habe bereits mehrere ICs getestet, alle zeigen identisches 
Verhalten.
Auch habe ich die Betriebsspannung des PCA9515 auf 3,3V abgesenkt, keine 
Änderung.

Die Schaltung die ich hier habe entspricht dem aus dem Datenblatt.
Nur das der Bus (linke Seite) mit 5V statt 3,3V läuft, aber auch mit 
3,3V gibt's diese Probleme.

Ich hoffe das irgendjemand Vorschläge zur Problemlösung beitragen kann.

von enan (Gast)


Lesenswert?

Die Signalanstiegszeit bzw. Flankensteilheit beim oberen Signal ist 
ziemlich langsam. Versuch an der Stelle mal einen kleineren Widerstand 
(weniger Ohm). Eine etwas detailliertere Beschreibung der Oszi Bilder 
wäre noch hilfreich.
Gruß Sebastian

von Thomas B. (t5b6_de) Benutzerseite


Lesenswert?

2V/div, wie viel Zeit pro Div. vergeht ist im Dateinamen.

Das obige Signal ist jeweils immer das, was vom Bus kommt. Das untere 
auf der Geräteseite "nach" dem PCA

Ich habe als Pull-Up Widerstände für den Bus bereits 1kOhm in 
Verwendung.

Ich Versuche später mal den Widerstand nochmals zu halbieren auf 500 
Ohm.

Wäre das schlechte Signal (enorme anstiegszeit) die Ursache, dann müsste 
es ja doch über die gesamte Übertragung Probleme geben, und nicht nur 
für die 2. Hälfte?

von enan (Gast)


Lesenswert?

Ich würde dennoch auf das schlechte Signal mit den miserablen 
Anstiegszeiten tippen. Ich empfehle erst mal dort den Fehler zu suchen. 
Was hängt denn noch alles an dem BUS?
Oder häng einfach mal alles ab bis auf die pull-ups und schau dir das 
Signal vom µC dann nochmals an.
Signalpegel von 3.8V sind hier definitiv nicht wünschenswert. Auch wenn 
sie die spec der Teile gerade noch so erfüllen mögen.

Im Datenblatt des PCA steht übrigens, dass der mit 3.3V versorgt werden 
möchte. Hat zusätzlich noch overvoltage tolerante Pins die 5V 
verkraften.

von Thomas B. (t5b6_de) Benutzerseite


Lesenswert?

Hallo, die schlechten Anstiegszeiten werden durch die Gesamtkabellänge 
von etwa 50m verursacht. Der Bus hat eine Baumstruktur,

An Geräte sind zur zeit angeschlossen:


1x Grafikdisplay (Mega 32, externes Netzteil)
1x Textdisplay (Mega8, versorgung via Bus)
5x Temperatursensoren (Tiny24, via bus)
1x 3fach Schalter (Tiny 24, via bus)

Zwischendurch zum testen einiger neuer Funktionen am Root-Controller 
(Mega8)
ein Serielles 16kBit Eeprom, i2c kompatibel (24C16).

Weitere Geräte sollen folgen, entsprechend kommt noch mal höchstens 15m 
Kabel dazu.

100kHz ist vermutlich auch etwas extrem für diese große Kabellänge.
Aber bei 50kHz gibt es die gleichen Probleme. Und weiter runter mit dem 
Takt möchte ich ungern, da sonst die Ansteuerung des Grafikdisplays 
unerträglich langsam wird. Ich habe auch schon mal 100m Kabel an dem Bus 
gehabt, dennoch funktionierte alles Problemlos (um die maximale Frequenz 
auszuloten, wo der noch funktioniert. Da fingen die Probleme bei etwa 
200kHz an, das Signal war aber auch deutlich schlechter als wie es jetzt 
ist.)

Alle Geräte funktionieren einwandfrei. Nur der PCA macht seine Probleme.

Oder gibt es eine andere Möglichkeit das Problem (Twi Pins auf Masse 
wenn Betriebsspannung des AVR fehlt) zu umgehen.


Nachtrag:
Ich hab nun eine gesamtkabellänge von etwa einem Meter an dem 
Controller, das Signal ist nun deutlich besser (Anstiegszeiten kann ich 
mit dem alten schinken von Scope nicht mehr sauber messen.)

der PCA scheint jetzt fehlerfrei zu funktionieren,
Die Betriebsspannung des PCA habe ich mittels Dioden auf ca. 3,5V senken 
können. Aber das hilft mir leider wenig.

von enan (Gast)


Lesenswert?

Okay das sind doch schon ein paar mehr Informationen.
Leider ist I2C nicht für so lange Leitungen ausgelegt. Ist eigentlich 
mehr als BUS Verbindung innerhalb einer Platine gedacht oder aber über 
sehr kurze Strecken. Es gibt schließlich begrenzende Kapazitäten die der 
BUS verträgt. Beim PCA z.B. stehen 400pF als maximal zugelassene 
Kapazität. Da dürftest du mit deinem langen Kabel schon drüber sein. 
Außerdem sieht dein Signal mit den schlechten Anstiegszeiten aus wie die 
Ladekurve eines parasitären Kondensators, der von deinem langen Kabel 
dargestellt wird.
Ein paar meter würde ich dem ganzen zugestehen, aber 50 ist nach meinem 
Geschmack definitiv zu viel. Irgendwo hab ich auch mal gelesen, dass man 
die Takt, Daten und Masseleitungen verdrillen sollte.
So viel mal dazu.
Würde dir da zu einem RS485/422 BUS raten. Ist bei weitem nicht so 
empfindlich und sollte die Kabellänge auch können. Alternativ könnte man 
mit einer Richtungsumschaltung den I2C BUS auf 485er level bringen.

von Cyblord -. (cyblord)


Lesenswert?

50m ist einfach Quatsch per I2C. Nimm einen geeigneten Bus.

von enan (Gast)


Lesenswert?

Eine einfache Möglichkeit SCL und SDA vom Atmega zu trennen, falls 
dieser keine Versorgung hat, wäre ein bidirektionaler Buffer mit enable 
Pin.
Aus dem Kopf raus würde ich mal einen TXB0102 vorschlagen. Ich glaube 
der kann sowas. Ist allerdings eher als level Translator zwischen 
unterschiedlichen Spannungen gedacht und geht auf der einen Seite nur 
bis 3.3V

von enan (Gast)


Lesenswert?

Noch eine letzte Wortmeldung von mir heute.
Lies dir den verlinkten Artikel durch. Da sind ähnliche Vorschläge drin 
wie ich sie schon aufgeführt habe.
http://www.mikrocontroller.net/articles/I2C_als_Hausbus
Dennoch würde ich an deiner Stelle direkt auf 485/422 umsteigen wenn du 
die lange Leitung unbedingt brauchst.

von Thomas B. (t5b6_de) Benutzerseite


Lesenswert?

der PCA macht auch schon bei etwa 50cm kabellänge schlapp, vor allem bei 
längeren Übertragungen. Das ganze funktioniert zuverlässig, wenn der PCA 
nicht drin ist. So habe ich das jetzt und werde es vorerst so lassen.

Muss ich halt beides Trennen, Busleitung und Netzstecker.

Jetzt alle Geräte auf eine andere Technik umzustellen wäre mir viel zu 
viel Aufwand. zumal ich u.A. auch fertige Platinen habe.

Mir ist klar das der I2C/TWI-Bus nicht für solche extremen Längen 
gedacht ist. Leider war es für mich die einzigste logische Wahl, als ich 
mit dem System angefangen habe. Der Aufwand für ein eigenes 
Übertragungsprotokoll wäre mir auch zu viel Aufwand.

von enan (Gast)


Lesenswert?

Kann ich verstehen. Aber solltest du wieder was "längeres" vorhaben, 
dann lieber gleich 485/422.
Kannst aber immer noch den I2C BUS mitsamt Protokoll auf 485/422 Pegel 
anheben das dann auf das lange Kabel geben und am Zielpunkt wieder 
zurück wandeln.
Ein 485er Baustein wäre z.B. LTC2850. Kannst dir bei interesse ja mal 
ansehen.

von Thomas B. (t5b6_de) Benutzerseite


Angehängte Dateien:

Lesenswert?

Im Patchkabel habe ich Platz für 8 Leitungen,
RS485 ist eine interessante Sache, benötige für SDA und SCL dann 
insgeamt 4 Leitungen wenn ich mich jetzt nicht vertan habe.

Zur Zeit ist die hälfte aller Leitungen bei mir auf Masse, damit bei 
höherem Stromverbrauch das Massepotenzial nicht zu sehr angehoben wird 
(und somit "0"-Bits verloren gehen.


Aber dennoch bin ich etwas verblüfft, bei welchen widrigen Umständen 
eine halbwegs zuverlässige Übertragung noch möglich ist...


Falls ich irgendwann ein neues System aufbauen sollte, dann wird es 
wahrscheinlich beim i2c Bus bleiben, aber Daten und Takt über 485 
"getunnelt". Wie in dem Artikel der von enan erwähnt wird.

Trotzdem möchte ich mich an dieser Stelle für die Antworten bedanken.

Nachtrag:
Im Anhang befindet sich ein Screenshot der Weboberfläche für das System.

von C.Kaak (Gast)


Lesenswert?

Der i2c-Bus ist entwickelt worden um in einem Gerät Daten ohne viel 
Kabel zu verteilen. Für längere Wege RS485 benutzen. Man muß sich nur 
das richtige Protokoll aussuchen. Es muß ja nicht gleich ein CAN-Bus 
sein.
mfg C.Kaak

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
Noch kein Account? Hier anmelden.