Moin Mal wieder eine Frage zum i2c. Ich hab ein Master slave System. Master ist Atmega644 und slave ist attiny45. Attiny und Mega laufen auf 8MHz. Benutzt wird die Peter fleury lib. Lasse ich den Master auf 1mhz mit folgenden Einstellungen laufen dann kann ich lesen und schreiben auf dem Bus: F_CPU 1000000UL SCL 100000L Nun möchte ich den Master aber auf 8MHz laufen lassen. Folgende Einstellungen: F_CPU 8000000UL SCL 100000L Damit kann ich weder lesen noch schreiben. Stelle ich scl auf 800000L kann ich schreiben aber nicht lesen. Welche Einstellungen müssen vorgenommen werden und vorallem warum?
Was du hinter solchen Namen versteckst ist weitgehend irrelevant. Ok, die Delay-Routinen lassen sich von F_CPU direkt beeindrucken. Aber nicht die CPU. Der ist das egal. Wichtig ist, mit welchem Takt der Prozessor wirklich läuft und wie man den Takt von I2C wirklich konfiguriert hat. Und wie sieht das aus?
Ein verstellen des F_CPU ändert aber nicht die Taktfrequenz des AVR. Dafür müssen FuseBits verändert werden. Das ist Dir bewusst? F_CPU ist lediglich für den Code wichtig, um zu wissen, welche Taktfrequenz eingestellt ist und folglich die Teiler für die abgeleiteten Takte richtig berechnen zu können. http://www.engbedded.com/fusecalc/ Sei bitte vorsichtig mit der Einstellung der Taktquelle. Mit "External Clock" legst du den AVR lahm. Grüße Oliver
Wie gesagt wenn der Master auf 8MHz läuft (fuse div8 nicht gesetzt) dann kann ich schreiben wenn der scl auf 800000 steht. Aber leider nicht vom bis lesen. Wenn der Master auf 1mhz läuft also Füße gesetzt dann kann ich lesen und schreiben wenn scl auf 100000 steht.
Oliver Ju. schrieb: > Ein verstellen des F_CPU ändert aber nicht die Taktfrequenz des > AVR. Dafür müssen FuseBits verändert werden. Das ist Dir bewusst? F_CPU > ist lediglich für den Code wichtig, um zu wissen, welche Taktfrequenz > eingestellt ist und folglich die Teiler für die abgeleiteten Takte > richtig berechnen zu können. > > http://www.engbedded.com/fusecalc/ > > Sei bitte vorsichtig mit der Einstellung der Taktquelle. Mit "External > Clock" legst du den AVR lahm. > > Grüße Oliver Ja das ist mir bewusst. Ich passe das F_CPU nur der realen Geschwindigkeit an. Scl steht auf 100khz. Dies ist ja der Takt des Bus. Ich setze lediglich die div8 fuse somit habe ich immer noch zugriff auf den AVR
Taktet SCL mit 100kHz oder hättest du gerne, dass SCL mit 100kHz taktet? Denn von alleine passiert das nicht, da muss man was einstellen.
Ich dachte über #define SCL_CLOCK lege ich die Geschwindigkeit fest? Täusche ich mich da? Wenn ja wo lässt sich der scl clock einstellen?
A. K. schrieb: > Taktet SCL mit 100kHz oder hättest du gerne, dass SCL mit 100kHz taktet? > Denn von alleine passiert das nicht, da muss man was einstellen. Nicht zwingend.
1 | void i2c_init(void) |
2 | { |
3 | /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */ |
4 | |
5 | TWSR = 0; /* no prescaler */ |
6 | TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* must be > 10 for stable operation */ |
7 | |
8 | }/* i2c_init */ |
Quelle: http://homepage.hispeed.ch/peterfleury/i2cmaster.zip - twimaster.c Aber der Präprozessoroutput wäre mal interessant. Grüße Oliver
:
Bearbeitet durch User
Da steht: ((F_CPU/SCL_CLOCK)-16)/2 und must be > 10 for stable operation Bei 1MHz/100kHz steht da (10-16)/2, also -3. Was immer das als Takt ergibt, 100kHz werden es wohl kaum sein.
:
Bearbeitet durch User
Peter M. schrieb: > Lasse ich den Master auf 1mhz mit folgenden Einstellungen laufen dann > kann ich lesen und schreiben auf dem Bus: > F_CPU 1000000UL ... > Nun möchte ich den Master aber auf 8MHz .... > Einstellungen: > F_CPU 8000000UL Dir ist klar, dass der Unterschied zwischen 1mHz und 8MHz etwa 9,9 Größenordnungen beträgt, deine Angaben für F_CPU sich aber nur um 0,9 unterscheiden? Das passt nicht zusammen ;-)
A. K. schrieb: > Bei 1MHz/100kHz steht da (10-16)/2, also -3. Was immer das als Takt > ergibt, 100kHz werden es wohl kaum sein. Dann ist die Bitrate also nicht möglich.
Anders ausgedrückt: Bei 1MHz Master ist SCL extreeeem langsam. Bei 8MHz normal. Weshalb es nach einem Problem im Slave riecht.
Meckerziege schrieb: > Dir ist klar, dass der Unterschied zwischen 1mHz und 8MHz etwa 9,9 > Größenordnungen beträgt, deine Angaben für F_CPU sich aber nur um 0,9 > unterscheiden? Das passt nicht zusammen ;-) Ohh der Thread wurde wohl mit "-pedantic" gebaut.
Peter M. schrieb: > Stelle ich scl auf 800000L kann ich schreiben aber nicht lesen. Welche > Einstellungen müssen vorgenommen werden und vorallem warum? wie soll das gehen?
1 | void i2c_init(void) |
2 | {
|
3 | /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
|
4 | |
5 | TWSR = 0; /* no prescaler */ |
6 | TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* must be > 10 for stable operation */ |
deine 8 MHz / 800Khz gibt schon 10 und -16 geht nicht durch 2 erst Recht nicht.
Joachim B. schrieb: > wie soll das gehen? Hier ist SCL zwar 8x schneller als bei 1MHz, aber immer noch weit unter 100kHz, weil im I2C Taktregister genau wie bei 1MHz/100kHz der Wert 253 steht.
:
Bearbeitet durch User
Die Berechnung setzt doch nicht die I2C Geschwindigkeit fest oder? Was könnte es denn am slave sein? Dieser läuft auf 8 MHz. Das merkwürdige ist ja das es funktioniert wenn der Master auf 1 MHz läuft und scl auf 100khz definiert ist.
Meckerziege schrieb: > Peter M. schrieb: > Lasse ich den Master auf 1mhz mit folgenden Einstellungen laufen dann > kann ich lesen und schreiben auf dem Bus: > F_CPU 1000000UL > > ... > Nun möchte ich den Master aber auf 8MHz .... > Einstellungen: > F_CPU 8000000UL > > Dir ist klar, dass der Unterschied zwischen 1mHz und 8MHz etwa 9,9 > Größenordnungen beträgt, deine Angaben für F_CPU sich aber nur um 0,9 > unterscheiden? Das passt nicht zusammen ;-) Sorry aber ich meinte nicht mHz sondern MHz :)
Peter M. schrieb: > Die Berechnung setzt doch nicht die I2C Geschwindigkeit fest oder? Doch. > Das merkwürdige ist ja das es funktioniert wenn der Master auf 1 MHz > läuft und scl auf 100khz definiert ist. Dein Slave funktioniert bei sehr niedrig getakteten SCL (1MHz/100kHz) vollständig. Bei höherem Takt (8MHz/800kHz) nur noch halb, bei vollem Takt (8MHz/100kHz) überhaupt nicht. Code vom Slave, Takt vom Slave? Wird das USI verwendet?
:
Bearbeitet durch User
Peter M. schrieb: > Die Berechnung setzt doch nicht die I2C Geschwindigkeit fest oder? Natürlich tut sie das! Schau doch mal ins Datenblatt und rechne dir doch mal die realen Bitraten für diverse Takt-Defines aus. Grüße Oliver
:
Bearbeitet durch User
Sorry aber ich finde das leider nicht! Wo genau hast du clock stretching gefunden? Und was bewirkt dies?
Peter M. schrieb: > Sorry aber ich finde das leider nicht! Wo genau hast du clock stretching > gefunden? Und was bewirkt dies? https://www.google.de/search?q=i2c+clock+stretching&ie=utf-8&oe=utf-8&gws_rd=cr&ei=p9LnVKnpM6HlywP8gYGQAg
Peter M. schrieb: > Sorry aber ich finde das leider nicht! Wo genau hast du clock stretching > gefunden? Und was bewirkt dies? War Unsinn. Ist nicht sonderlich übersichtlich, dieser Code.
:
Bearbeitet durch User
Nochmal was zum Aufbau: Scl und sda haben keine externen pull ups sondern ich benutze die internen. Die Leitungen zu den slaves: vom Master ca 30 cm auf eine Verteiler Platine. Von dort aus ca 40 cm zu jedem slave. Vielleicht hilft das bei der Fehler suche weiter. Nach einiger googlen habe ich nur raus gefunden das die Master lib von fleury und die usi slave lib von jtronics gut zusammen funktionieren.
So habe den Fehler gefunden. Liegt an den Leitungen Wie gesagt vom Master 30 cm zur Verteiler Platine und von dort 30 cm zu jedem slave. Und es gibt 100 slaves.Somit erhält man eine gesamt Kabellänge von: 30,3 Meter. Was kann ich tun um das ganze mit dieser Kabellänge zum laufen zu bekommen?
Peter M. schrieb: > Scl und sda haben keine externen pull ups sondern ich benutze die > internen. Und die Signale sehen sauber aus? Peter M. schrieb: > Was kann ich tun um das ganze mit dieser Kabellänge zum laufen zu > bekommen? Signaltreiber, notfalls aufspalten mit einem Multiplexer. Die AN11084 von NXP "Very large I2C-bus systems and long buses" kennst du? http://www.nxp.com/documents/application_note/AN11084.pdf
Meckerziege schrieb: > Peter M. schrieb: >> Lasse ich den Master auf 1mhz mit folgenden Einstellungen laufen dann >> kann ich lesen und schreiben auf dem Bus: >> F_CPU 1000000UL > > ... >> Nun möchte ich den Master aber auf 8MHz .... >> Einstellungen: >> F_CPU 8000000UL > > Dir ist klar, dass der Unterschied zwischen 1mHz und 8MHz etwa 9,9 > Größenordnungen beträgt, deine Angaben für F_CPU sich aber nur um 0,9 > unterscheiden? Das passt nicht zusammen ;-) Kauf Dir ne neue Brille.
Peter M. schrieb: > Scl und sda haben keine externen pull ups sondern ich benutze die > internen. > Die Leitungen zu den slaves: vom Master ca 30 cm Vergiss das. Es ist ein Wunder daß es jemals überhaupt funktioniert hat. Mach da die benötigten Pullups dran, vorher brauchst Du gar nicht erst weiterexperimentieren.
Bernd K. schrieb: >>> Lasse ich den Master auf 1mhz mit folgenden Einstellungen laufen dann ... >> Dir ist klar, dass der Unterschied zwischen 1mHz und 8MHz etwa 9,9 > > Kauf Dir ne neue Brille. ändert nichts ... https://de.wikipedia.org/wiki/Vors%C3%A4tze_f%C3%BCr_Ma%C3%9Feinheiten#SI-Pr.C3.A4fixe
Peter M. schrieb: > Und es gibt 100 slaves. Dir ist schon klar daß die lib von JTronics in der unmodifizierten Variante nur mit der unteren Hälfte des I²C Adressraums (also nur 64 verschiedenen Adressen) funktioniert? Das sieht man wenn man sich mal anschaut wie dort der Code im Interrupt den Unterschied zwischen einer Startbedingung und einer Stopbedingung festzustellen versucht: Das höchste Adressbit muss null sein sonst funktioniert das nicht.
Peter M. schrieb: > Wie gesagt vom Master 30 cm zur Verteiler Platine und von dort 30 cm zu > jedem slave. Und es gibt 100 slaves.Somit erhält man eine gesamt > Kabellänge von: 30,3 Meter. Gewöhnlich versucht man, bei Problemen die Komplexität der Situation zu reduzieren. Wenn es also in einem derartigen Gesamtsystem Ärger gibt, dann probiert man es mit 1-2 Slaves statt 100. Und man nimmt es ganz bestimmt nicht gleich mit 100 Slaves in Betrieb, ohne vorher die Grundfunktion kontrolliert zu haben.
:
Bearbeitet durch User
Bernd K. schrieb: > Es ist ein Wunder daß es jemals überhaupt funktioniert hat. Nö. Aus TWBR=253 und 1MHz Takt ergeben sich reale 2kHz SCL. So geruhsam getaktet kann das tatsächlich funktionieren. Bei 8MHz CPU Takt und 800kHz SCL-Wunschvorstellung ging das reale SCL entsprechend auf 16kHz hoch, und es ging nur noch ein Bisschen. Passt ganz gut ins Bild. Treibermässig kann er dabei bleiben, wenn er mit reduziertem SCL Takt leben kann - diesmal mit Absicht. Da die AVRs mindestens bei 5V robustere Pin-Treiber haben als I2C vorsieht kann er in einem reinem 5V-AVR-Netz die Pullups auch weiter reduzieren als I2C offiziell zulässt.
:
Bearbeitet durch User
Also das System wurde mit 2 slaves getestet jedoch waren die Leitungen für die anderen slaves schon verlegt und auch angeschlossen jedoch ohne den slave am ende der Leitung. Ob die Signale sauber sind kann ich nicht Sagen Sagen dafür fehlt mir das nötige messmittel :/ Ich hab gestern Nacht noch einen einzigen slave an den Master angeschlossen (restlichen 99 Leitungen auch abgeklemmt) und siehe da der Bus läuft auf 400khz bei einer Prozessor Geschwindigkeit von 8 MHz. Durch eine bestimmte testprogrammierung kann ich nur vermuten das in dem Fall die Signale sauber sind. Sind alle 100 Leitungen dran, der Prozessor auf 1mhz und der Takt auf 100khz sind die Signale meiner Meinung nach nicht sauber und es gibt Übertragungsfehler. Wie weit würden mir externe Pull ups and scl sda an beiden Seiten des Busses bringen? Ich habe den pca9600 gefunden. Wenn ich ein solchen Baustein jedoch vor jeden slave schalte bin ich pleite. Da ab 30 cm die Leitungen parallel abzweigen und ich somit 100 enden habe. Kann dieser auch als Verstärker genutzt werde, also auf der Hälfte des Weges? Dann würde ich nur 4 benötigen denn vom Master geht eine Leitung auf einen 4er Verteiler und von diesem vierer Verteiler auf jeweils einen 25 Verteiler. und meine Idee wäre es jeweils einen Verstarkter an den Anfang eines jeden 25 Verteilers zu geben
Peter M. schrieb: > Wie weit würden mir externe Pull ups and scl sda an beiden Seiten des > Busses bringen? Viel. Ein R pro Leitung, nicht zwei. 5V: 470 Ohm, 3,3V: 560 Ohm. Sollten dann aber nur AVRs am I2C hängen. Hintergrund: Dieser Widerstand läd bei 0=>1 um die 1-2nF Buslast durch Leitungen und Slaves auf. Dein interner Pullup mit seinen um die 30K braucht dafür viel zu lang.
:
Bearbeitet durch User
Ok dann fahre ich gleich los und besorge mal 2 470 Ohm. Die schalte ich dann direkt am Master zwischen scl und 5v und zwischen sda und 5v. Ich werde über Erfolg oder Misserfolg berichten. Zu dem pca9600 kann niemand sonst was sagen?
Wenn ich die externen Pullups ein löte muss ich die internen im master raus nehmen richtig? Muss die Pins dann Eingänge oder Ausgänge sein? Wie sieht das beim slave aus?
I2C Problem schrieb: > Wenn ich die externen Pullups ein löte muss ich die internen im master > raus nehmen richtig? Muss die Pins dann Eingänge oder Ausgänge sein? Ob die internen AVR-Pullups vom Master dann aktiv sind oder nicht spielt keine Rolle, 470 Ohm parallel 30K Ohm... > Wie sieht das beim slave aus? Stimmt, die hatte ich nicht auf der Rechnung. Der verwendete USI Code schaltet die der Einfachheit der Pinsteuerung halber ein, weil man normalerweise nur eine 1stellige Anzahl Slaves dran hat und es dann egal ist. Bei 100 Slaves läppert sich das jedoch. Na, schaun wir mal was rauskommt.
I2C Problem schrieb: > Wie sieht das beim slave aus? I2C Pullups int nur 1x am Bus vorgesehen, nicht pro Node. Bei aktivem USI/TWI sind die internen Pullups automatisch abgeschaltet.
:
Bearbeitet durch User
Erstmal danke für die gute Hilfe:) Noch mal eine zwischen fragen. Das aufgebaute Master-Slave-System lief schon fast einwandfrei außer ein paar programmier fehlern. Die einstellungen waren CPU Tack von Master und Slave 1 MHz also DIV8 Fuse gesetzt. Als Freuquenz im Programm war allerdings schon 8 MHz angegeben. Und als SCL 100kHz. Funktionierte das nur durch zufall?
A. K. schrieb: > Viel. Ein R pro Leitung, nicht zwei. 5V: 470 Ohm, 3,3V: 560 Ohm. Sollten > dann aber nur AVRs am I2C hängen. 100 Slaves mit ja 30kΩ Pull-Up ergeben zusammen einen Pull-Up von 300Ω an den Bus-Leitungen. Da ist der treibende Ausgangs schon gefordert. So gesehen könnte ein 470Ω-Widerstand dann besser sein? Falls die Leitung allerdings nicht in Stern-Topologie verlegt ist, wäre wegen Signalreflektionen die Aufteilung des Pull-Ups auf die Leitungsenden günstiger. Wenn natürlich die Verkabelung für 100 Slaves von nur zwei/drei Slaves hoch gezogen werden soll, muss das schief gehen. Peter M. schrieb: > Ob die Signale sauber sind kann ich nicht Sagen Sagen dafür fehlt mir > das nötige messmittel :/ Es sind nicht die besten Voraussetzungen, um soetwas stabil zum Laufen zu bringen.
Wolfgang schrieb: > 100 Slaves mit ja 30kΩ Pull-Up ergeben zusammen einen Pull-Up von 300Ω > an den Bus-Leitungen. Da ist der treibende Ausgangs schon gefordert. Weshalb ich nochmal nachgesehen habe. Egal was der Code programmiert, USI schaltet die internen Pullups ab. > allerdings nicht in Stern-Topologie verlegt ist, wäre wegen > Signalreflektionen die Aufteilung des Pull-Ups auf die Leitungsenden Die sind in erster Linie bei SCL interessant, aber da sind es 70cm bis zu den Slaves und das ist üblichen Rahmen von I2C. Der Master hat dank vollständigem TWI ausserdem einen slew-rate limiter drin.
I2C Problem schrieb: > Funktionierte das nur durch zufall? Gewissermassen. Durch die 1MHz/100kHz Konfiguration wurde SCL unbeabsichtigt auf 2kHz gedrosselt. Und damit lief es trotz extrem schwacher Pullups.
Peter M. schrieb: ... I2C Problem schrieb: ... Multiple Persönlichkeitsstörung oder wirklich verschieden? PS: Was ist denn nun der Stand?
:
Bearbeitet durch User
Wolfgang schrieb: > Wenn natürlich die Verkabelung für 100 Slaves von nur zwei/drei Slaves > hoch gezogen werden soll, muss das schief gehen. Die Pullups vom Master. Bei dessen TWI greift die Programmierung der Portregister und evtl. programmierte interne Pullups sind aktiv. Beim USI ist das anders.
:
Bearbeitet durch User
Keine Persönlichkeitsstorung ;) Projekt zu zweit würde ich das nennen ? Also 470 ohm pull up auf scl und sda sind drin. Eine Besserung zeigt sich und zwar das jetzt der Master auf 8 MHz läuft und scl_Clock auf 100khz und sich nicht mehr aufhängt. Allerdings ist die Übertragung fehlerhaft. Wenn ich einen slave allein also ohne die restlichen 99 toten Leitungen anschließe läuft es super ohne feststellbare Übertragungsfehler. Also einen kleinen Erfolg haben die Pull ups gebracht. Was könnte ich noch tun?
Peter M. schrieb: > Also einen kleinen Erfolg haben die Pull ups gebracht. Was könnte ich > noch tun? Geh mal mit dem SCL Takt runter. Vielleicht gibts eine Rate, mit der es sowohl funktioniert also auch für die Anwendung schnell genug ist.
A. K. schrieb: > Die sind in erster Linie bei SCL interessant, aber da sind es 70cm bis > zu den Slaves und das ist üblichen Rahmen von I2C. Der Master hat dank > vollständigem TWI ausserdem einen slew-rate limiter drin. Der Abstand spielt nur für Laufzeiteffekte/Reflektionen eine Rolle. Trotzdem muss die kapazitive Last der ganzen Kabelage umgeladen werden. A. K. schrieb: > Weshalb ich nochmal nachgesehen habe. Egal was der Code programmiert, > USI schaltet die internen Pullups ab. Peter M. schrieb: > Scl und sda haben keine externen pull ups sondern ich benutze die > internen. Damit scheint das Thema interne Pull-up der Slaves aus der Welt und der Bus hat ewig gebrauchen, um auf High-Pegel umzuschalten. Wozu wurden eigentlich Oszis erfunden?
I2C Problem schrieb: > Muss die Pins dann Eingänge oder Ausgänge sein? Das schaltet der Master während des Betriebes permanent um: SCL: - Wenn er Low ausgeben will dann schaltet er auf Ausgang und Low - Wenn er High ausgeben will dann schaltet er auf Eingang und wartet bis die SCL auch tatsächlich auf High geht (clock stretching) SDA: - Wenn er Low ausgeben will dann schaltet er auf Ausgang und Low - Wenn er High ausgeben will dann schaltet er auf Eingang und beim neunten Bit prüft er dann ob ACK oder NACK vom Slave. - Wenn er Daten vom Slave liest ist SDA auf Eingang, es sei denn es kommt das neunte Bit und er will ACK sagen.
:
Bearbeitet durch User
Als Alternative gibt es den PCA9518 I2C-Hub. Segmentierung in 4 oder mehr getrennte Slave-Busse.
:
Bearbeitet durch User
ich habe leider zur zeit nicht das nötige Kleingeld für Oszilloskop. Also zu meiner Bewertung der Übertragung: Slave schreibt in txbuffer eine 1 oder 0 je nachdem wie der fototransistor schaltet. Auswertung kann im Code eingesehen werden und funktioniert bei einem einzigen Pixel super. Master liest dann aus dem buffer. Bei 1 sendet er rot an die led auf dem slave bei 0 blau. Wie gesagt bei einem slaveadresse funktioniert es super. Wenn ich jetzt allerdings die kabelage komplett dran hänge und dann einen slave dran hänge dann kriegt die led keinen stabilen Zustand. Ich weiß das ist keine gute Art und Weise eine Übertragung zu prüfen aber wie gesagt ich habe leider kein Oszilloskop. Kurz gesagt die led schaltet richtig bei einem slave und keiner kabelage. Bei einem slave und restlicher kabelage habe ich keine stabilen Zustände. Ich hab eben auch mal die Hälfte der Leitungen abgeklemmt somit nur noch die kabelage von 50 slaves dran und man merkt eine Verbesserung. Wenn ich nur 25 dran habe wird es noch besser.
Peter M. schrieb: > Ich habe den pca9600 gefunden. Wenn ich ein solchen Baustein jedoch vor > jeden slave schalte bin ich pleite. Sollst du ja nicht. Der PCA9600 dient dazu, größere Segmente (egal ob lange Leitung oder viele Devices) zu treiben. Also jeweils einen für eine bestimmte Zahl von Geräten (max. 4000pF Kapazität auf dem Bus). > Da ab 30 cm die Leitungen parallel > abzweigen und ich somit 100 enden habe. Kann dieser auch als Verstärker > genutzt werde, also auf der Hälfte des Weges? > Dann würde ich nur 4 benötigen denn vom Master geht eine Leitung auf > einen 4er Verteiler und von diesem vierer Verteiler auf jeweils einen 25 > Verteiler. und meine Idee wäre es jeweils einen Verstarkter an den > Anfang eines jeden 25 Verteilers zu geben Yep, ein PCA9600 pro 25er-Verteiler sollte prinzipiell gehen (falls einer reicht - rechne die kapazitive Belastung aus). Allerdings darfst du die PCA9600 nicht direkt parallel schalten (-> Datenblatt lesen!), daher würde ich da im 4er-Verteiler noch einen PCA9516 als Hub vorsehen. Diese Kombination ist laut Datenblatt auch zulässig und es gibt von NXP auch extra eine Application Note dazu.
Wo ich grad LED lese: Kann es sein, dass direkt neben den I2C-Leitungen mörderische Transienten irgendwelcher damit geschalteter Power-LEDs auf Stromversorgungsleitungen spazieren gehen? Mach ein Bild von dem Aufbau, bzw. wahrscheinlich mehere.
Du hast also weniger als 1 Byte an zu übertragendem Informationsgehalt pro Slave und hast 100 Slaves und willst die wahrscheinlich alle permanent zyklisch abfragen? Alternativ-Vorschlag: SPI Daisychain.
Ralf Döblitz schrieb: > und es gibt von NXP auch extra eine Application Note dazu. Und welche meinst du da genau? http://www.nxp.com/technical-support-portal/#/tid=71114,sid=41735,tab=applicationnotes
Also ich will zyklisch 1 Byte lesen und 3 Byte senden (aus Sicht der Master) Ich versuche mal eine Skizze vom Aufbau hochzuladen. Bei Bildern wäre das glaube ich nicht so eindeutig.
Peter M. schrieb: > Bei Bildern wäre das glaube ich nicht so eindeutig. Bilder sind zusätzlich zum Schaltplan wegen der Art der Verkabelung von Signal und Strom nützlich.
Vorne der Master und hinten die sammeln schienen. In dem anderencbild sind die leitungsende für die slaves zu sehen
Peter M. schrieb: > Ich habe auch keine verbaut. :-) > Wo hättest du welche erwartet? Siehe unter Selbstbau in https://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment#Hardware und generell https://www.mikrocontroller.net/articles/Kondensator#Entkoppelkondensator Dazu dann noch ein Elko 22µf auf jede Platine.
Und mal endlich Schaltbilder von Master und Slave. Wer weiss was da noch an Klöpsen drin steckt.
Wolfgang schrieb: > Ralf Döblitz schrieb: >> und es gibt von NXP auch extra eine Application Note dazu. > > Und welche meinst du da genau? Im Datenblatt zum PCA9516 heißt es: Please see Application Note AN255 “I2C & SMBus Repeaters, Hubs and Expanders” for additional information on sizing resistors and precautions when using more than one PCA9515/PCA9516 in a system or using the PCA9515/16 in conjunction with the P82B96. Zum einen beudetet das, daß man den PCA9516 mit dem PCA9600 (der P82B96 war der Vorgänger) kombinieren kann, zum anderen führt das zu konkreten Dimensionierungshinweisen für die Pullups: http://www.nxp.com/documents/application_note/AN255.pdf
Schaltpläne habe ich leider keine aktuellen Grad. Der stand ist jetzt: Eine Leitung mit einem slave am Master. Perfekte schaltzustände. Master und slave laufen auf 8MHz und scl_Clock ist 50kHz 25 slave Leitungen mit einem slave am Master. Ständig toggelnder Zustand. Master, slave und scl_Clock mit den selben Einstellungen. Ich überlege Grad wie weit mich die Kondensatoren bringen würden bei 100 slaveleitungen wenn ich schon bei 25 derbe Probleme habe. (Hardwareaufwand = groß)(Funktion fragwürdig) Meine andere Überlegung ist ob es 4 Treiber Stufen auf den 4 Verteilern bringen werden. (Hardwareaufwand=gering)(Funktion fragwürdig) Und eine ganz andere Überlegung wäre die Auswertung Des schaltzustands über den slave laufen zu lassen und den Bus nur in eine Richtung zu nutzen. (softwareaufwand = groß)(Funktion eventuell eingeschränkt) Was meint ihr?
Verstehe ich das richtig: Du hast an keinem IC Abblockkondensatoren an der Versorgung?? Das kann doch nicht gut gehn ^^
A. K. schrieb: > Wo ich grad LED lese: Kann es sein, dass direkt neben den I2C-Leitungen > mörderische Transienten irgendwelcher damit geschalteter Power-LEDs auf > Stromversorgungsleitungen spazieren gehen? Ein gängiges Problem ist, daß sich I2C selbst stört: Crosstalk zwischen SCL und SDA. Wer es besonders gut meint, verdrillt beide auch noch. MfG Klaus
Peter M. schrieb: > Was meint ihr? Die Frage ist doch, wie lange man im Dunkeln tappt, wenn man ohne Oszi versucht, den Bus irgendwie zum Laufen zu bringen. > Ich überlege Grad wie weit mich die Kondensatoren bringen würden bei 100 > slaveleitungen wenn ich schon bei 25 derbe Probleme habe. Da sollte man gar nicht überlegen. Jeder Slave sollte mindestens seinen 100nF Kondensator über der Versorgung haben. Vorher würde ich mich über keinerlei Fehlverhalten wundern. Ein Streifen (z.B. 100nF/50V 0805) und die Sache ist erledigt.
Ok ich probiere das dann. Für Ein C zwischen Vcc und GND ist auf den Platinen noch genug platz. Bestelle jetzt bei reichelt und werde auch gleich dazu noch 4 Treiber Stufen pca9600 mitbestellen. Jemand noch eine Idee was ich gleich mitbestellen kann was auch eine Lösung sein könnte?
Peter M. schrieb: > Bestelle jetzt bei reichelt und werde .... Wie kann man eigentlich etwas entwickeln, wenn man ein paar Kondensatoren erst bestellen muß. Wenn man ein Brett annageln will, bestellt man sich dann auch zwei Nägel, oder doch besser drei, falls man einen krumm schlägt? MfG Klaus
Peter M. schrieb: > Für Ein C zwischen Vcc und GND ist auf den Platinen noch genug platz. Davon kann man wohl ausgehen. Bei einem X7R-G0603 100N von Reichelt wirst du Sorgen haben, den zwischen deinen Streifen wieder zu finden, falls dort VCC und Gnd auf benachbarten Bahnen liegen. Bei einem X7R-G0805 100N ist da etwas einfacher ;-)
Klaus hast du zu viel Langeweile das du hier dein dummen Kommentar hinterlässt? Wenn das deine Meinung ist dann behalte sie für dich und mach dir nicht noch die mühe diese mit allen Teilen zu müssen. Such dir Hobbys wie zb einen Sport etc. Soll für Ausgleich im leben sorgen. Und um doch auf deine Frage zurück zu kommen ( nimm die Antwort so hin und Fang keine Diskussion wie ein 10 jähriger an, es sei denn du bist es) Ich bin kein Bauteil Lager der tonnenweise alle möglichen Bauteile zur Verfügung hat. Ich scheiße kein Geld um mir alles mögliche parat zu Legen. Ich plane und bestelle dann. Diesmal habe ich etwas vergessen und bestelle nach. Was ein Tragödie! Fehler macht man eben und aus denen sollte man lernen.
Danke Wolfgang ich hatte eigentlich vor die große Bauform zu nehmen mit dem Rastermaß 5mm. Da aber Vcc und GND neben einander liegen nehme ich lieber diese hier: X7R-G1206 100N
@Peter aber du hast Ohne Schaltplan, Ohne Ahnung von Programmieren, ohne Ahnung von Elektronik, ohne Messmittel einfach mal was zusammengebastelt und das Forum soll das jetzt reparieren. Also immer schön freundlich bleiben
Schaltpläne sind vorhanden leider keine aktuellen. Ich weiß was an denen geändert wurde leider bringt euch das nicht viel. Anhang von programmieren ist drin bzw ein Verweis. Und was meinst du mit Elektronik Anhang? Ich glaube das nötigste bis auf Schaltplan hab ich drin um mein Problem zu beschreiben. Das forum soll mir überhaupt nichts reparieren sondern ein paar Tips zur Fehlerbeseitigung geben. Was ist denn heute los? Tag der Langeweile oder was? Ich habe viel brauchbare und ernstgemeinte antworten erhalten und bin dankbar über jede einzelne. Also Lies Nochmal die letzten posts und Überleg DiR wer unfreundlich geworden ist!!!! An A.K: Schaltpläne aktualisier ich gleich und lade sie hoch.
Wenn ich angeblich keine Ahnung vom Elektronik und keine Ahnung.Vom programmieren habe wie bin ich dann.Soweit gekommen das ein Prototyp mit wenigen slaves einwandfrei läuft? Such dir Hobbys oder eine Frau scheint dir wohl an beidem zu mangeln.
Peter M. schrieb: > Wenn ich angeblich keine Ahnung vom Elektronik und keine Ahnung.Vom > programmieren habe wie bin ich dann.Soweit gekommen das ein Prototyp mit > wenigen slaves einwandfrei läuft? Nichts für ungut, aber bevor man ein Bussystem mit ~100 Teilnehmern aufbaut, sollte man zumindest mal was von Abblockkondensatoren gehört haben.
1. Das ist mein erstes Projekt mit einem I2c 2. Dadurch das dass beim Prototypen nicht aufgefallen habe ich nicht dran gedacht. Ich bin ja nicht allwissend und will mit dem Projekt auch was lernen. Und dank dem Hinweis mit den blockkondensatoren habe ich was dazugelernt.
I2C Problem schrieb: Beim ATmega muss Pin31 auch an Gnd gelegt werden. > Hier die Schaltpläne des slaves ... Deine LED-Beschaltung solltest du noch mal überdenken. So ist eigentlich gar nicht einzusehen, warum die irgendwann mal leuchten sollten ;-) Und die Abblockkondensatoren - wo sind die?
Der Strom der GND leitung an der klemme mit s1 s2 s3 s4 fließt also durch den AVR durch? Gewagte konstruktion. ich kann mir auch nicht erklären, wie die leds jemals leuchten sollen. flip
Ja Sorry beim überarbeiten habe ich glatt die GND verbindung vergessen. Ja ich weiß bei beiden :D Abblockkondensatoren sind ja aktuell noch nicht drin. Sind aber bestellt und werden direkt verbaut sobald sie da sind. Ich mache Meldung sobald es weiter geht. Erstmal kümmere ich mich jetzt um die Touch geschichte ;) Hat jemand schonmal mit dem PCA9600 gearbeitet? Habe diese jetzt mal gleich mitbestellt ;)
Ich habe nun die pca 9600 bekommen. Ich bin mir allerdings nicht ganz sicher wie ich diese einbauen soll. Meine Idee wäre: Vcc und GND ist klar. Jetzt die sda nach dem Master auftrenne. Also sda vom Master auf sx. RX und tx Brücken und von dort aus zu den slaves. Bei scl das selbe Spiel nur Halt alles mit sy und ty und ry. Vor und nach dem pca natürlich noch pull-ups.
I2C Problem schrieb: > Hier die Schaltpläne des slaves und masters;) AVCC ist zwingend nötig für korrekte Funktion des dadurch versorgten Ports, egal ob der ADC verwendet wird oder nicht. Also AVCC=VCC und GND=GND.
:
Bearbeitet durch User
A. K. schrieb: > I2C Problem schrieb: > Hier die Schaltpläne des slaves und masters;) > > AVCC ist zwingend nötig für korrekte Funktion des dadurch versorgten > Ports, egal ob der ADC verwendet wird oder nicht. Also AVCC=VCC und > GND=GND. Ok wurde bereits erledigt. Ist mir auch aufgefallen. Trotzdem danke für den Hinweis. Was sagst du zu den pca9600? Bzw zu meiner Idee?
Leider funktioniert es nicht so wie ich es mir gedacht habe. Bzw gar nicht. Ist beim Aufbau was grundlegendes falsch?
Peter M. schrieb: > Leider funktioniert es nicht so wie ich es mir gedacht habe. Bzw gar > nicht. Ist beim Aufbau was grundlegendes falsch? Wenn du mehrere PCA9600 parallel schaltest: Ja, natürlich. Im Datenblatt des PCA9600 steht auf Seite 5 ganz klar und deutlich: "Remark: Two or more SX or SY I/Os must not be interconnected. The PCA9600 design does not support this configuration." Das impliziert, daß du für mehrere PCA9600 vorher einen I2C-Hub benötigst, zum Beispiel eben den PCA9516, der rein zufällig 5 Kanäle (ein Master und vier Slave-Stränge via PCA9600 in deinem Fall) unterstützt.
Peter M. schrieb: > Ist beim Aufbau was grundlegendes falsch? Wenn die Pläne die aktuelle Version repräsentieren, allerdings. Es fehlen immer noch die Sch*$$ Abblockkondensatoren, ohne die kein CMOS IC richtig will. Ich habs vor ein paar Tagen mal erklärt und schreib nicht alles nochmal: Beitrag "Re: 74HC595 Störanfälligkeit" Die Hersteller geben in ihren Applikationen das auch alles an, das machen die nicht aus Langeweile. Und beim Mega64 kannst du auch beim nächsten Fusen mal die JTAG Fuse abschalten, denn du wirst PORT C vllt. als Port benutzen wollen.
:
Bearbeitet durch User
Ok danke. Dann probiere ich es mal mit einem einzigen pca9600 aus. Vielleicht bringt das ja auch schon Abhilfe. Zu den blockkondensatoren: die sind bereits drin, da wo ich die Pläne rejngestellt habe waren sie noch nicht drin. Was mir eben noch aufgefallen ist: Hat der Master nur einen Slave und beide laufen auf 8MHz und der scl_Clock steht auf 100khz so liest er zwar aus aber leider nicht stabil. Wenn ich den scl_Clock langsamer mache sollte ich doch eigentlich eine bessere Übertragung hinbrkommen oder?
Ok erster Erfolg: Mit einem pca9600 30cm nach dem Master kann ich auf jeden Fall schon mal "sauber" den slave schreiben und lesen. Ich werde es später noch mit 50 dann mit 75 und schlussendlich mit 100 slaves probieren.
Kann es vielleicht sein das es 24 offene leitungsenden gibt wenn nur 1 Slave an einem 25 fach parallelverteiler hängt?
Kurze Rückmeldung: I2C läuft soweit stabil auf 100khz. Ein denk bzw Programmierfehler hat sich eingeschlichen. Der Fehler lag nicht somit die ganze Zeit nicht beim I2C. Die Touch Funktion des Tisches funktioniert auch muss nur noch bei verschiedenen Tageslicht Zuständen getestet werden und aus dieser Erkenntnis dann ein Algorithmus zur Auswertung geschrieben werden. Master programm mit Animationen, spielen und LcD Menü steht bereits genauso wie die Windows software. Sobald das zum laufen gebracht wurde wird eine Android App folgen. Bilder, Videos und eine dokumentation zum Projekt werden dann auch veröffentlicht. Danke an dieser Stelle für jegliche Unterstützung. LG
Peter M. schrieb: > 1. Das ist mein erstes Projekt mit einem I2c was bedeutet das? es ist nicht dein erstes Projekt mit IC? ich wundere mich auch, seit der Computersteinzeit 1977 hat jedes digital IC nach Abblockkondensatoren verlangt, was sollte sich da ändern? Das ist immer die erste Regel beim Planen und Bauen, ergo hat man 100nF-470nF Kerko immer parat und selten 2-3 Stück. scnr aber das musste hier nochmal auch für andere gesagt werden.
:
Bearbeitet durch User
ja und genau für solche tipps bin ich ja dankbar. ich hab es schlichweg vergessen und nicht dran gedacht. Ein paar hatte ich ja zu hause nur keine 120 Stück mehr. Ich habe schon öfter mal kleinere Sachen mit ICs gemacht. Und ja ich weiß auch das Abblockkondensatoren ran müssen. Das letzte Projekt lag auch schon einige Zeit zurück. Und da ich hier im Forum schon öfter gesehen habe das manche gerne einen Touch realisieren wollen aber nicht gerne die knapp 3 euro für einen sharp is471F ausgeben wollen. Ich weiß abhilfe und habe es mit dem temic k153p paar hinbekommen. Ist zwar bisschen Programmieraufwendiger aber es funktioniert einwandfrei und bei der preisersparnis finde ich das super.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.