Zeit zum Übertragen von Daten via I²C?

OP #864627
Lesenswert?

Hallo

ich möchte gerne recht viele Daten via I²C-Bus verschicken, um LEDs auf 
einem Display  (und es sind verdammt viele) anzusteuern. Gedacht habe 
ich an den PCF8577, welcher 32 I/O hat. Davon werde ich ca. 16 brauchen, 
wesshalb ein I²C-Bus-Multiplexer benötigt wird.

Nun ist die Frage, wie schnell die Datenübertragung abläuft, da die 
Berechnung von anderen Daten nicht allzu träge sein darf (Ich habe 
gemerkt, dass das Übertragen auf ein LCD-Display recht langsam ist und 
desshalb übertrage ich nicht alle Daten als ein Schub auf das Display).

Ich habe das System, mitdem der 8577 Angesteuert wird noch nicht so ganz 
durchschaut, habe aber vermutet, dass ich pro 8 übertragene bits auch 
ca. 8 bits zur adressierung benötigen werde. Meine Rechnung war daher:


Anzahl der übertragenen bits =
(4*(8+8))*16 + 2*16

8+8 wegen Daten und Adressierungen (als 8er Pakete), davon 4 stück pro 
IC
davon habe ich ja 16 stück
und die 2*16 habe ich für den Multiplexer reserviert.

--------------

1056 zu übertragende bits


Nun ist die Frage, wie lange braucht der uC und der Port-Expander für 
ein bit? Ich meine mal gelesen zu haben, dass der I²C-Bus 100kbit 
schaffen soll. Das würde als bedeuten, dass etwa 0,01s = 10ms vergehen 
würden, bis alle Daten übertragen wurden.


Kommt dieser Wert nahe an die wirkliche Zeit oder geht bedeutend mehr 
Zeit verloren?

PS: Der Mikrocontroller liest einen A/D aus und gibt als PWM den Wert 
aus. Ein Antriebsmotor in dem Fahrzeug (indem der Fahrer auch sitzt) 
wird mit diesem Signal angesteuert. Würde die Reaktionszeit über 100ms 
liegen, so ist dies beim Fahren zu merken und unangenehm. Dies möchte 
ich gerne vermeiden.


Mich würde es echt freuen wenn mir wer weiterhelfen könnte...



M.f.G. Elektrofreak
#864669
Lesenswert?

> Ich meine mal gelesen zu haben, dass der I²C-Bus 100kbit schaffen soll.
Wie schnell der I²C Bus ist hängt davon ab wie schnell dein Controller 
und wie schnell die ICs am Bus sind.
Schafft dein µC 400kHz die ICs aber nur 100kHz, dann läuft der Bus halt 
mit 100kHz. 400 sollten aber denke ich schon drin sein. Zur Zeit ist der 
I²C Bus glaub ich bis maximal 1MHz spezifiziert.

> Nun ist die Frage, wie schnell die Datenübertragung abläuft, da die
> Berechnung von anderen Daten nicht allzu träge sein darf
Hat dein µC I²C als Hardware? Dann kannst du doch bestimmt die 
Kommunikation auch in Interrupts machen. Dann hast du (bzw. der µC) 
nebenbei Zeit was anderes zu machen.
OP #864703
Lesenswert?

> Hat dein µC I²C als Hardware?

Ja, ich benutze den Hardware-I²C-Bus

> Dann kannst du doch bestimmt die
> Kommunikation auch in Interrupts machen. Dann hast du (bzw. der µC)
> nebenbei Zeit was anderes zu machen.

Wenn ich allen 16 Port-Expandern linear hintereinander Werte zuordne, 
brauche ich dann auch die Interrupts oder kann ich ihm nicht einfach die 
Daten geben und der uC schreibt die auf den Expander? (Ich dachte immer 
dass beim Senden des Befehls via I²C der Controller wartet, bis dieser 
Befehl abgearbeitet wurde und somit nicht für andere Berechnungen zu 
verfügung steht...)

Stimmt denn grob die Berechnung der Dauer der Übertragung, wenn alles 
hintereinander weg übertragen wird oder muss ich noch Zeit für ACK/NACK 
einplanen?
#864735
Lesenswert?

> oder muss ich noch Zeit für ACK/NACK einplanen?
Jedes Bit kostet natürlich Zeit.

> (Ich dachte immer dass beim Senden des Befehls via I²C der Controller
> wartet, bis dieser Befehl abgearbeitet wurde und somit nicht für andere
> Berechnungen zu verfügung steht...)
Wenn es ein TX Interrupt gibt, muss der µC immer nur das nächste Byte in 
den Ausgangsbuffer legen und hat dann Zeit bis der Interrupt kommt das 
der Buffer leer ist und er dann das nächste Byte reinschiebt.

Für ein IC also Quasi so:
-> Daten sollen gesendet werden
-> Variable mit Anzahl der zu übertragenden Bytes setzen (z.B. byte_cnt 
= 6;)
-> Erstes Byte in Buffer schieben (Buffer = Byte_Array[i++]; 
byte_cnt--;)
-> Warten auf Interrupt
-> Buffer leer, Interrupt kommt
-> Nächtes Byte in Buffer schieben (Buffer = Byte_Array[i++]; 
byte_cnt--;)
-> Warten auf Interrupt
-> usw. bis byte_cnt == 0 ist.
OP #864815
Lesenswert?

Ok, verstehe ich.

Wie sieht es aus, wenn ich keinen Interrupt verwenden würde (weil der 
externe Interrupt bereits anderweitig verwendet wird) mit der Zeit für 
die Verarbeitung? Rein theoretisch würde nämlich als einziges die 
Ausgabe der Daten via der Port-Expandern und an das LCD-Display Zeit 
benötigen. kann ich ca. 100k bit pro Sekunde rechnen oder ist es 
Erfahrungsmäßig mehr?
#865318
Lesenswert?

Hab mir gerade mal das Datenblatt vom PCF8577 angeschaut. Kann man den 
überhaupt für LEDs benutzen? Scheint mir eher ein spezial IC für LCD 
ansteuerung zu sein. Der PCF8577 kann laut Datenblatt auch nur 100kHz 
I²C Bus. Also bist du schon mal auf 100kBit/s begrenzt.

Ich glaube sowas wie ein PCA9505 ist eher was für dich. Hat 40Bit und 
noch 8 mögliche Adressen. An einem I²C Bus bekommst du also schon mal 
problemlos 320 I/Os ran. Anscheinend kann das Ding auch Fast-Mode, also 
400kHz auf dem I²C Bus.
OP #865719
Lesenswert?

I²C ist noicht zwingend, aber einfach, da bereits ein I²C-Bus existiert 
und so der Aufwand reduziert wird.

Kann der vorgeschlagene 8577 wirklich keine LEDs ansteuern? Wäre echt 
schade, da dieser Platztechnisch gut passt und verfügbar sowie günstig 
ist... Treiber wären wahrscheinlich zu teuer...
Gast #865821
Lesenswert?

Ich würde dir empfehlen es mit den Standard 74xx595 Schieberegistern zu 
machen (siehe Link oben). Die Dinger sind schnell (HC Typen 100MHz), 
beliebig viel hintereinander schaltbar, haben keinen Overhead bei der 
ansteuerung, einfach in der Ansteuerung, gibt's überall und auch in DIP 
Bauform.
Gast #865844
Lesenswert?

Gibt es einen Grun zwingend I²C einzusetzen?

Ein serielle Schieberegister, das sich kaskadieren lässt, würde 
vermutlich wesentlich effektiver sein. Die Teile gibt auch als 16er 
Version. ALso jeweils 16 Ausgänge pro IC (ich meine auch schon ein paar 
32er gesehen zu haben). Die Teile kann man hintereinanderschalten. Dann 
muss man nur einen
Bytestrom rausschicken, der so lang ist, dass alle Bits befüllt, werden. 
Dann einen kleinen Übernahmpuls und die Daten stehen am Ausgang an.

Praktisch ist dabei, dass man z.B. eine (Hardware) SPI Schnitstelle 
dafür benutzen kann. SPI sollte auch 1 MBit/s problemlos können. Aber 
vorsichtshalber immer im Datenblatt die Setup und Hold Zeiten genau 
anschauen! (Besonders die vom Übernahmepuls!)
OP #866001
Lesenswert?

gut, gut. Dann suche ich mal nach grooooßen Schieberegistern. Die 
Programmierung dürfte demnach nicht so schwer werden. Muss nicht eine 
Art Taktsignal mitgeliefert werden, welcher dem Register beim wechsel 
des Pegels die Daten ein Register weiter reicht? (Ich werde mich da mal 
einlesen...) Gibt es ein Beispiel für die Nutzung eines Regsters unter 
Bascom? Ich habe nur in C was gefunden...

PS: Ich verwende einen ATMega32
Gast #866730
Lesenswert?

Du willst doch LEDs steuern, wenn ich das oben richtig gelesen hab?

Es gibt von Allegro-Micro Schieberegister mit integrierter Stromquelle.
Damit kann man direkt LEDs treiben. Der Strom wird über einen ext.
Widerstand eingestellt.

Vielleicht hilft das die Schaltung noch ein wenig zu optimieren ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren