Forum: Mikrocontroller und Digitale Elektronik I2C Geschwindigkeit


von Peter M. (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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?

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Peter M. (Gast)


Lesenswert?

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.

von Peter M. (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Peter M. (Gast)


Lesenswert?

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?

von Oliver J. (skriptkiddy)


Lesenswert?

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
von (prx) A. K. (prx)


Lesenswert?

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
von Meckerziege (Gast)


Lesenswert?

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 ;-)

von Oliver J. (skriptkiddy)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Anders ausgedrückt: Bei 1MHz Master ist SCL extreeeem langsam. Bei 8MHz 
normal. Weshalb es nach einem Problem im Slave riecht.

von Oliver J. (skriptkiddy)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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
von Peter M. (Gast)


Lesenswert?

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.

von Peter M. (Gast)


Lesenswert?

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 :)

von (prx) A. K. (prx)


Lesenswert?

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
von Oliver J. (skriptkiddy)


Lesenswert?

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
von Peter M. (Gast)


Lesenswert?

Hier befinden sich die ganzen Codes :
Beitrag "I2C Übertragungsproblem"

von Peter M. (Gast)


Lesenswert?

Sorry aber ich finde das leider nicht! Wo genau hast du clock stretching 
gefunden?  Und was bewirkt dies?

von Joachim B. (jar)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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
von Peter M. (Gast)


Lesenswert?

Woran könnte es denn noch liege?  Jemand irgendeine Idee?

von Peter M. (Gast)


Lesenswert?

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.

von Peter M. (Gast)


Lesenswert?

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?

von Wolfgang (Gast)


Lesenswert?

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

von Bernd K. (prof7bit)


Lesenswert?

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.

von Bernd K. (prof7bit)


Lesenswert?

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.

von Meckerziege (Gast)


Lesenswert?

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

von Bernd K. (prof7bit)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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
von (prx) A. K. (prx)


Lesenswert?

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
von Peter M. (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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
von Peter M. (Gast)


Lesenswert?

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?

von I2C Problem (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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
von I2C Problem (Gast)


Lesenswert?

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?

von Wolfgang (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Peter M. schrieb:
...
I2C Problem schrieb:
...

Multiple Persönlichkeitsstörung oder wirklich verschieden?

PS: Was ist denn nun der Stand?

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

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
von Peter M. (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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?

von Bernd K. (prof7bit)


Lesenswert?

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
von (prx) A. K. (prx)


Lesenswert?

Als Alternative gibt es den PCA9518 I2C-Hub. Segmentierung in 4 oder 
mehr getrennte Slave-Busse.

: Bearbeitet durch User
von Peter M. (Gast)


Lesenswert?

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.

von Ralf D. (doeblitz)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Bernd K. (prof7bit)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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

von Peter M. (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von I2C Problem (Gast)


Angehängte Dateien:

Lesenswert?

skizze der verdrahtung.

von (prx) A. K. (prx)


Lesenswert?

Welcher Strom fliess pro Slave?

von Peter M. (Gast)


Lesenswert?

Maximal 60mA

von I2C Problem (Gast)


Angehängte Dateien:

Lesenswert?

Vorne der Master und hinten die sammeln schienen.

In dem anderencbild sind die leitungsende für die slaves zu sehen

von (prx) A. K. (prx)


Lesenswert?

Sehe keine Kondensatoren.

von Peter M. (Gast)


Lesenswert?

Ich habe auch keine verbaut. Wo hättest du welche erwartet?

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Und mal endlich Schaltbilder von Master und Slave. Wer weiss was da noch 
an Klöpsen drin steckt.

von Ralf D. (doeblitz)


Lesenswert?

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

von Peter M. (Gast)


Lesenswert?

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?

von blubs (Gast)


Lesenswert?

Verstehe ich das richtig: Du hast an keinem IC Abblockkondensatoren an 
der Versorgung?? Das kann doch nicht gut gehn ^^

von Klaus (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Peter M. (Gast)


Lesenswert?

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?

von Klaus (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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 ;-)

von Peter M. (Gast)


Lesenswert?

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.

von Peter M. (Gast)


Lesenswert?

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

von ttl (Gast)


Lesenswert?

@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

von Peter M. (Gast)


Lesenswert?

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.

von Peter M. (Gast)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

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.

von Peter M. (Gast)


Lesenswert?

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.

von I2C Problem (Gast)


Angehängte Dateien:

Lesenswert?

Hier die Schaltpläne des slaves und masters;)

von Wolfgang (Gast)


Lesenswert?

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?

von Flip B. (frickelfreak)


Lesenswert?

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

von Peter M. (Gast)


Lesenswert?

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 ;)

von Peter M. (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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
von Peter M. (Gast)


Lesenswert?

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?

von Peter M. (Gast)


Lesenswert?

Leider funktioniert es nicht so wie ich es mir gedacht habe. Bzw gar 
nicht. Ist beim Aufbau was grundlegendes falsch?

von Ralf D. (doeblitz)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Peter M. (Gast)


Lesenswert?

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?

von Peter M. (Gast)


Lesenswert?

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.

von thebeginner (Gast)


Lesenswert?

Kann es vielleicht sein das es 24 offene leitungsenden gibt wenn nur 1 
Slave an einem 25 fach parallelverteiler hängt?

von Peter M. (Gast)


Lesenswert?

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

von Joachim B. (jar)


Lesenswert?

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
von Peter M. (Gast)


Lesenswert?

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