Hallo Leute,
ich möchte einen I²C-Bus mit 2 ATmega644 aufbauen, doch gelingt mir das
nicht wirklich.
Ich bekomme ständig Störungen rein!
Der Bus soll in einer Umgebung mit einer starken Störquelle
(Anschlussleitung eines Hexapoden, kurzzeitig bis zu 15A) gelegt werden,
doch klappt es nicht mal ohne diese Störquelle so richtig...
Als Kabel benutze ich ein USB-Kabel von 1,5m Länge, von dem ich nur 2
Adern verwende.
Wenn die Leitung günstig hängt, bekomme ich fast keine Fehler rein, wenn
ich sie aber mit meinen Fingern anfasse, gibt es sofort viel mehr Fehler
(Statuscode 0x00, also Bus error due to an illegal START or STOP
condition). Wenn ich sie mit irgendwas anderem Anfasse, passiert das
nicht => kein Wackelkontakt.
Wenn ich die Ummantelung des Kabels auf GND lege, dann wirds nicht
besser, sondern viel schlechter.
Wahrscheinlich ist das so, weil sich dann die Kapazität der Leitung
erhöht.
Ich hab schon alles versucht, was mir einfiel, hab schon
Terminierungswiderstände ein und wieder ausgebaut, versucht zusätzliche
Pullups anzulöten und mit der Länge der Leitung runexperimentiert,
nichts hat wirklich was gebracht.
Ich bin mit meinem Latein am Ende.
Weiß jemand vielleicht weiter?
Vielen Dank im Voraus,
Gruß, Yaro
Hi
>Als Kabel benutze ich ein USB-Kabel von 1,5m Länge, von dem ich nur 2>Adern verwende.
Eine Masseverbindung hat sich in vielen Fällen als hilfreich erwiesen.
MfG Spess
Hallo Yaro,
USB Kabel ist warscheinlich die denkbar schlechteste Wahl weil das D-/D+
Paar wegen der differentiellen NAtur der USB Kommunikation verdrillt ist
und warscheinlich die Gefahr des Crosstalks zwischen SCL/SDA sehr gross
ist. Wenn es nicht anders geht versuche die Pullup Widerstaende so klein
wie moeglich zu machen (2.2-3.9K)
Zuerst versuch mal das Kabel gegen ein unverdilltes kurzes Kabel
auszutausche damit ein Vergleich moeglich ist wieder alles richtig
funktioniert.
Auch wueder ich mit dem OSZI die Kurvenform der Datensignale
uebrpruefen. Wenn die Flanken sehr lange sind dann ist vielelciuht auch
zu viel Kapazitaet drauf. Beim I22 Bus sollte die maximale Buskapazitaet
400pF nicht uberschreiten.
Gruss,
Gerhard
Anderes Bussystem? I²C ist nicht wirklich für sowas geeignet. Ist halt
für Verbindungen auf einer Leiterplatte, oder zumindest innerhalb einer
Baugruppe gedacht. Alles andere mag zwar unter günstigen Bedingungen mal
funktionieren, eine Saubere Lösung ist das aber nicht.
Danke schonmal für die schnellen Antworten.
@spess53: Masseverbindung war in meinem Fall komischerweise
kontraproduktiv...
@ Gerhard.: dass die Kabel verdrillt sind, wusste ich nicht. Ich werde
es gleich mal mit normaler kurzer Litze versuchen.
Wenn das nicht geht, werde ich nochmal mitm OSZI messen.
@ heinzhorst: Das Problem ist, dass ich beim Hexapod schon eine
SPI-Verbindung habe (2 Platinen kommuniziern mit einander) und wollte
nicht das Risiko eingenen, dass durch die neue lange Leitung dieser Bus
dann gestört werden würde.
Gruß, Yaro
Hallo Yaro,
die meisten Fehler wurden ja schon angesprochen. Warum nimmst du kein
RS485?
Ist Masse auf beiden Platinen geerdet? Falls ja, könntest du dir hier
eine Brummschleife durch die zusätzliche Masseverbindung einfangen.
Gruß, DetlevT
> Masseverbindung war in meinem Fall komischerweise kontraproduktiv...
Dann hast du aber ein systematisches Problem.
Du solltest dir mal alle Verbindungen und Massepfade deines Aufbaus
auf ein Blatt Papier zeichnen. Dann die fliessenden Ströme reinmalen.
Und jeder Stromkreis davon muß geschlossen werden. Also auch die I²C
Stromkreise für SCL und SDA.
Kannst Du mit der Übertragungsrate runtergehen? Ich habe hier an 30m
Leitung (Adern liegen parallel) einen LM75 an einem Mega8. Die
Abschlußwiderstände haben 1,1K auf der Seite des Mega8. Das dürfte
eigentlich schon nicht mehr funktionieren, läuft aber recht zuverlässig.
Yaro schrieb:> Wenn ich die Ummantelung des Kabels auf GND lege, dann wirds nicht> besser, sondern viel schlechter.
die hat auf gnd auch nix zu suchen sondern wird mit den beidseitigen
schirmgehäusen, wenn denn vorhanden, verbunden
Finsbury schrieb:> Yaro schrieb:>> Wenn ich die Ummantelung des Kabels auf GND lege, dann wirds nicht>> besser, sondern viel schlechter.>> die hat auf gnd auch nix zu suchen sondern wird mit den beidseitigen> schirmgehäusen, wenn denn vorhanden, verbunden
Manchmal hilft es auch, die Schirmung nur auf einer Seite mit Masse zu
verbinden, die andere Seite offen
Du hast schon 3 Leitungen? SDA, SCL und GND.
Wie sind die beiden uC Massen verbunden? Wie groß sind deine Pullups?
Welche Datenrate nutzt du?
Beim ATMega kannst du bei 5V bis runter auf 1kOhm gehen.
Wenn die Kabel sehr dünn und lang sind würde ich aber gar nicht so weit
gehen -> Spannungsteiler.
Sooo, hab das jetzt mal mit 0,5m langer, unverdrillter Litze versucht.
Ohne Störquellen funktioniert es fast Fehlerfrei, wenn ich aber den
Strom für die Motoren anschalte, bricht es sofort ab. Das war beim
USB-Kabel besser, da gabs wenigstens ein Paar erfolgreiche
Übertragungen.
Als Pullups verwende ich die internen AVR-Pullups (ca 50k), da werde ich
aber gleich noch kleinere ranbasteln.
@ Peter Dannegger: Ich will erstmal versuchen das Problem ohne eine neue
Platine zu löten in den Griff bekommen, wenn das nicht klappt, dann
versuche ich das so.
@ Lothar Miller: Alle µCs haben das selbe GND und die selbe
Versorgungsspannung. Die Übertragung funktioniert ja bei kurzem Kabel
und ausgeschalteten Motoren auch ganz gut.
Die Schirmung lag bei dem beschriebenen Aufbau einseitig auf GND, hat
aber nur gestört.
Das nächste, was ich tun werde ist die Pullups kleiner zu machen, mach
mich jetzt also zu Conrad auf. Außerdem besorge ich da auch gleich
CAN-Kabel und versuche es damit.
Gruß, Yaro
Yaro schrieb:> Das nächste, was ich tun werde ist die Pullups kleiner zu machen, mach> mich jetzt also zu Conrad auf. Außerdem besorge ich da auch gleich> CAN-Kabel und versuche es damit.>>> Gruß, Yaro
Es gibt keine CAN-Kabel. Es soll aber Leute geben die Google bedienen
koennen. Du gehoerst nicht dazu.
Wieso versuchst du es überhaupt weiter? Wenn schon der Laboraufbau nicht
klappt, dann klappts im realen Fall erst recht nicht ZUVERLÄSSIG.
Wenn du nur eine µC <-> µC Verbindung brauchst nimm doch RS485! Geht
sogar noch einfacher als I²C und ist nicht teuer.
@ David: Hab nicht bei Google, sondern bei Conrad geguckt, und der hatte
"UNITRONIC BUS CAN" und das ist Kabel.... und ich dachte, dass das
gemeint war.
@ mkeller: Das problem ist, dass ich es auf dem Board nicht rausgeführt
habe und mir ein neues Board ersparen wollte.
Langsam glaube ich aber wirklich, dass das so nicht funktionieren wird.
Werde dann wahrscheinlich eine Übergangsplatine basteln, die als Buffer
Fungiert. Kommuniziert mit dem Robo dann über I2C und mit dem Joystick
über RS485 oder SPI.
Welches davon ist zuverlässiger?
Gruß, Yaro
Hi
>Langsam glaube ich aber wirklich, dass das so nicht funktionieren wird.
Mit den internen Pull-Ups mit Sicherheit nicht. Hast du jetzt schon mal
kleinere getestet?
MfG Spess
Yaro schrieb:> @ Lothar Miller: Alle µCs haben das selbe GND und die selbe> Versorgungsspannung. Die Übertragung funktioniert ja bei kurzem Kabel> und ausgeschalteten Motoren auch ganz gut.
Schon einmal den Begriff "Brummschleife" gehört?
http://de.wikipedia.org/wiki/Brummschleife
Was für eine Geschwindigkeit nutzt du denn?
Wenn du nur die internen Pullup nimmst ist es kein wunder das es mit
Schirmung schlechter wird. Da steigen die Leitungskapazitäten an. Wenn
du ein Oszilloskop hast dann schließe es an, mach ein paar Bilder, bevor
du zum Conrad rennst? Was kaufst du denn wenn du nicht weist was du
brauchst?
@ spess53: Hab kleinere getestet (hab 2 gefunden 1,7k und 6k), aber die
haben die Übertragung erheblich gestört. (hab sie parallel zu den
internen Pullups geschaltet). deswegen habe ich sie wieder ausgebaut.
@ Detlev T.: Jetzt weiß ich so ungefähr, was eine Brummschleife ist,
aber ich glaube ich habe keine, weil meine GNDs alle Sternförmig
zusammengeschlossen sind. Die Schrimung war auch nur einseitig an GND,
jetzt hängt sie in der Luft.
@ Friedrich: 78kHz
Ich habe nochmal das USB-Kabel rausgekramt. Habe jetzt aber nicht die
beiden Datenadern zur Übertragung benutzt, sondern eine Strom und eine
Datenader verwendet.
Das Ergebniss ist deutlich besser als alles zuvor getestete, jedoch
nicht wirklich zufriedenstellend.
Was mich wundert ist, dass kleinere Pullups gestört haben. Wie kann das
sein?
Hab auch versucht, nur den 6k Pullup dranzumachen, hat aber auch nur
gestört.
Gruß, Yaro
Wenn ich jetzt noch die Schirmung einseitig auf GND packe, gibts kaum
störungen! So ist es wenigstens halbwegs akzeptabel.
@ Reinhard Kern: gibts sowas schon als Modul, oder müsste ich mir das
selbst bauen?
Gruß, Yaro
mkeller schrieb:> Wenn du nur eine µC <-> µC Verbindung brauchst nimm doch RS485! Geht> sogar noch einfacher als I²C und ist nicht teuer.
Er könnte auch einfach beides nehmen und die I²C Signale per RS485
Treiber übertragen :)
Lichtwellenleiter wäre aber auch auch ne schöne Sache...
Jörg S. schrieb:> Er könnte auch einfach beides nehmen und die I²C Signale per RS485> Treiber übertragen :)
Ist bei bidirektionalen Signalen nicht ganz trivial.
@ Jörg: Ich kenne mich mit dem RS485 nur oberflächlich aus und habe die
Leitungen auf meinem Board auch nicht rausgeführt. Könnte ich indem ich
2 P82B96 verwende (einer am einen, der andere am anderen µC) ohne
weiteren Aufwand die Strecke überbrücken? Macht das die Übertragung denn
dann stabiler? (Ich muss zugeben, ich hab das Datenblatt nur
überflogen, bin im Moment echt knapp mit der Zeit)
Gruß, Yaro
Hallo Yaro,
wenn es unbedingt sein soll, dann ueberpruefe mal folgendes:
Pullups: 3.9-4.7K. Mit Oszi ueberpruefen ob die ansteigende Flanke des
SDA Leitung einigermassen steil ist (1-5us). Die Flanken muessen
einigermassen rechteckig und sauber aussehen.
Versuch auch in Serie mit den SDA/SCL Leitungen am jeden uC Ende der
Leitung einen 100 Ohm Widerstand in Serie einfuegen
Wenn moeglich verwende 100KHz I2C Clock zum Anfang.
Die Datenmasse , Versorgung der Slave uC (Motorsteuerung) soll von der
Masse der Motorenversorgung seperat sein damit es keine Stoerungen durch
Verkopplungen gibt.
Die uC sollen jeder einen eigenen VCC Regler nach Moeglichkeit haben.
Zumindesten sollen ausreichen Elkos und Keramik Cs auf der VCC
Versorgung nahe am uC sein.
Am besten ist Sternverdrahtung der Motorenversorgung zum Netzgeraet hin
so dass Leistungsteil und Steuerteil nur an einem Punkt zusammenkommen
und kein Motorenlaststrom im uC Teil vagabundiert.
Auch der Motorenteil sollte ausreichende Stuetzelkos haben (4700uF).
Jeder Motortreiber (H-Bridge?) soll direkt dort Stuetzelkos
ausreichender Kapazitaet haben.
Teste Deine I2C Daten Kommunikation mit kurzen Verbindungsleitungen um
eine funktionelle Baseline zu erhalten.
Bis jetzt muss alles 100% funktionieren.
Erst dann schalte einen Motor dran und sieh was passiert. Wenn alles gut
geht die anderen.
Ich bin immer noch der Meinung dass Dein Problem, wenn auch vielleicht
nicht ideal, loesbar sein soll. Ich habe selber schon jede Menge mit I2C
gemacht und habe noch nie so etwas erlebt. Zum Aufgeben ist es noch
verfrueht;-)
mfg,
Gerhard
Hallo Gerhard, vielen Dank für die Ausführliche Beschreibung!
Im Moment habe ich (mit einer kurzen Leitung ein gut funktionierendes
System am Laufenden, werd aber nicht bei der kurzen Leitung bleiben.
Deswegen werde ich deine Ratschläge auch erst in den nächsten Tagen und
nicht heute befolgen.
Was die Pullups angeht, haben kleinere Pullups bis jetzt schon bei
mehreren Versuchen nur gestört (ich weiß selber nicht wieso), aber ich
werde nochmal welche ausprobieren.
Serienterminierung hat bei den früheren Versuchen zwar auch gestört,
werde ich aber trotzdem nochmal versuchen.
Wieso soll ich eine höhere Clock verwenden? Welche Vorteile hat das?
Die Masse Muss bei den Motoren die Gleiche wie bei den µCs sein, denn
die Motoren sind Servos (18 Stück) und die werden über einen der µC
angesteuert.
Die haben auch genug Kapazität auf ihrer Versorgungsleitung (um die
5000uF)
Wenn die Lange Leitung dann Probleme mache, dann messe ich mitm OSZI die
Flanken und ändere ggf. die Pullups.
Vielen Dank nochmal an alle, die was beigetragen haben!!!
Gruß, Yaro
Hallo Yaro,
100KHz ist die langsamere I2C Clockspeed
400kHz ist die Standard Clockrate
Dann gibt es noch was im MHz Beriech. Habe aber noch nie damit
experimentiert.
Nach dem I2C Standard muessen die Pullups im KOhm Bereich sein. Bei mir
hat immer 3.9K-4.7K bestens funktioniert.
Mit der Masseverbindung meine ich dass das Stromversorgungsteil
sternfoermig mit Deinen Motorsteuerungen verbunden sein soll und dass
jeder seinen eigenen Stuetzkondensator haben soll. Aber das hilft Dir in
Deinem Fall nicht zu viel weil jede Board mit Motorstoersignalen die
Datenverbindungen verseuchen.
Als Extremloesung koennte man vielleicht noch die Clock des I2C noch
(10kHz)weiter erniedrigen und mit RC Filtern auf jeder I2C Port Seite zu
filtern. Aber dann wird Deine Datenkommunikation warscheinlich zu
langsam. Man koennte aber damit experimentieren. Das geht warscheinlich
nur dann korrekt wenn soft I2C verwendet wird wo man den Samplepunkt der
Daten selber bestimmen kann.
wie schon gesagt wurde ist in Deinem Fall RS485 UART Kommunikation
warscheinlich deutlich besser weil die Daten dann differenzial
uebertragen werden koennen und Motorstoersignale bis zu einem bestimmten
Grad vom RS485 Empfaenger verkraftet werden.
Es gibt auch galvanik isolierte I2C Transceiver:
Siehe:
http://www.analog.com/static/imported-files/Data_Sheets/ADUM2250_2251.pdf
Sind aber leider etwas teuer.
NXP hat auch was.
Gruss,
Gerhard
>Wenn die Lange Leitung dann Probleme mache, dann messe ich mitm OSZI die>Flanken und ändere ggf. die Pullups.
Messe doch am besten gleich mal nach. Dann hast du es gewiss das es ein
HW Fehler ist, und nichts mit der Software zu tun hat.
Yaro schrieb:> @ Reinhard Kern: gibts sowas schon als Modul, oder müsste ich mir das> selbst bauen?
Hallo Yaro,
es gibt einige, z.B. TosLink, das sich für Audioübertragung eingebürgert
hat, oder Avago (ehem. HP). Ein Receivermodul mit Logikausgang kostet
10..15 EUR, Halter/Stecker für Sendedioden und Sensoren um 3 EUR.
Eigentlich lohnt selbermachen nicht, aber es ist auch kein grosses
Problem, einen Kunststoff-LWL direkt vor eine LED zu montieren, mehr ist
in den meisten Sendemodulen auch nicht drin. Aber was steckbares oder
schraubbares hat schon grosse Vorteile.
TxD und RxD einer seriellen Schnittstelle werden so wie sie sind über
LWL übertragen, weitere Kodierung ist nicht nötig. Schwieriger wird es
mit LWL bei bidirektionalen Signalen, deshalb würde ich I²C nicht
empfehlen.
Gruss Reinhard
PS mit Kunststoff sind 100 m kein Problem, mit Glasfasern kann man
Ozeane überqueren.
PS2: noch billiger:
http://de.farnell.com/jsp/search/browse.jsp?N=500003+1003166&Ntk=gensearch_002&Ntt=toslink&Ntx=mode+matchallpartial
>Was die Pullups angeht, haben kleinere Pullups bis jetzt schon bei>mehreren Versuchen nur gestört
Das kann nicht sein.
Der Fehler steckt ganz woanders!
Yaro schrieb:> @ Jörg: Ich kenne mich mit dem RS485 nur oberflächlich aus und habe die> Leitungen auf meinem Board auch nicht rausgeführt. Könnte ich indem ich> 2 P82B96 verwende (einer am einen, der andere am anderen µC) ohne> weiteren Aufwand die Strecke überbrücken?
Für SDA und SCL benötigst du auf beiden Seiten 2 von den ICs. Also
insgesamt 4.
> Macht das die Übertragung denn dann stabiler?
Zumindest Störunempfindlicher. Aber wenn es auf einer kurzen Strecke
ohne äussere Störungen schon mit normalen I²C nicht geht, ist da wohl
noch ein anderes Problem.
Reinhard Kern schrieb:> TxD und RxD einer seriellen Schnittstelle werden so wie sie sind über> LWL übertragen, weitere Kodierung ist nicht nötig. Schwieriger wird es> mit LWL bei bidirektionalen Signalen, deshalb würde ich I²C nicht> empfehlen.
Schwieriger in dem Sinn das man für I2C dann 4 LWL Leiter benötigen
würde (und die besagten P82B96 Treiber Bausteine).
Hallo Yaro,
es wurden hier schon viele Tipps gegeben, allerdings kann ich nicht so
recht erkennen, dass Du diese auch systematisch verfolgst.
1) Die Frage nach den Widerständen. 50k oder dazu 1,7k parallel sind
außerhalb der Spezifikation von I2C. Schalte den internen pullup aus und
setze 4k7 oder 3k9 ein.
100R in Serie vermindern mögliche Störungen.
Du hast ein Oszi: Gut! --> Flanken anschauen, wie oben sehr gut
beschrieben.
2) Masseverbindung: Da Du eine sternförmige Masseverbindung zwischen
allen Beteiligten hast, sollte das kein Problem sein.
3) Störungen, wenn die Motoren laufen: Hier noch einmal die
Kondensatoren überprüfen. 5000uF für 15A halte ich für etwas wenig,
denke eher an 1000uF pro 1A.
4) Sind alle µCs auch abgeblockt mit 100nF? Spannung ist auch
stabilisiert?
Falls das alles nicht hilft, dann erst würde ich über zusätzliche I2C
Bausteine gemäß App-Notes (s.o.) nachdenken.
Und immer schön in die Datenblätter schauen und die vorgegebene
Schaltungen und Bauteilwerte beachten.
Gruss,
Pete77
Wenn Du die internen Pullups benutzt hast Du den Port als Eingang
konfiguriert, was schlecht ist, da die dann praktisch keinen Strom
treiben, wenn dann noch ne kleine Leitungskapazität dazu kommt haste
keine Flanken mehr sondern Gebirge, das wird nix, darum hat das mit den
extern parallel geschalteten gleich nochmal schlechter funktioniert,
weil die Flanken dann nochmal gedämpft wurden.
Habe hier 50m I2C in kräftig gestörter Umgebung liegen, läuft
einwandfrei.
Konfiguriere die IO als Ausgänge, sprich SCL aus Ausgang, SDA beim
Senden als Ausgang, beim Empfangen als Eingang, vergiss die internen
Pullups(!) und häng auf SDA SCL 4k7 gegen +5V (oder kleiner) und die
Kiste läuft.
Außerdem haben die internen Pullup auch keine 50k sondern 10k.
Hi
>Wenn Du die internen Pullups benutzt hast Du den Port als Eingang>konfiguriert, was schlecht ist, da die dann praktisch keinen Strom...
Nein. Wenn TWI aktiviert ist wird die Datenrichtung vom TWI
kontrolliert. Die internen Pull-Ups können allerdings wie gewohnt
aktiviert werden.
Der minimale Pull-Up-widerstand beträgt übrigens 1,53kOhm.
MfG Spess
Hallo Leute, heute habe ich nochmal ein längeres Kabel drangemacht. Es
Funktioniert ohne Störungen!
Habe immernoch die internen Pullups.
Benutze jetzt ein 1,2m langes USB-Kabel von dem ich eine Daten und eine
Strom-Ader verwende. Die Schirmung liegt einseitig auf GND.
Beim Ersten Versuch mit dem USB-Kabel hatte ich beide Datenadern
verwendet, bis ich erfahren habe, dass sie verdrillt sind, was wohl das
Problem war.
Ganz ohne Schirmung (normale zweiadrige Litze) hat es ohne Motoren
relativ gut geklappt, mit Motoren gabs aber sofort heftigste Störungen.
Mit dem USB-Kabel ging es dann ganz gut, obwohl es mit Motoren auch zu
Störungen kam. Nachdem ich die Schirmung dann einseitig auf GND gelegt
habe, funktionierte es sehr gut.
vielleicht werde ich es in nächster Zeit mit einem noch längeren Kabel
ausprobieren, aber momentan habe ich keins...
Auf Glasfaser werde ich nicht mehr umsteigen, weil es so schon
Funktioniert, trotzdem danke für den Tip!
trotzdem nochmal @Pete K.:
1) hatte schon 6K versucht (bei den früheren Versuchen), war aber
contraproduktiv. Als ich aber einen weiteren ATmgea mit Pullups an den
Bus gehängt habe (da ist n lcd-Display dran) hat es den Bus etwas
stabilisiert. Wenn ich das nächste mal eine Platine designe, werde ich
externe Pullups dranhängen.
Was das OSZI angeht, brauche ich ja jetzt nicht mehr messen, weil es
funktioniert und ich nur ungerne die alte Leitung wieder dranhängen
will, um sie zu messen. Es ist aber sehr wahrschenlich, dass ich dann
grenzwertige Flanken sehen würde.
3) Mehr Elkos kann ich nicht dranhängen, weil der DC-DC Regler nicht
mehr als 5000µF am Ausgang haben darf.
4) µC sind alle mit 100n und eigenen Spannungsreglern(jeweils auch mit
Kondensatoren nach Datenblatt) ausgestattet.
Vielen Dank nochmal für die Hilfe!!
Wenn ich noch Probleme bei der Übertragung bekomme (was ich nicht
hoffe), dann werde ich das posten.
Das ist ein echt tolles Forum! Sonst bekommt man nirgendswo in so kurzer
Zeit so viel kompetente Hilfe!
Gruß, Yaro