Forum: Haus & Smart Home Zeit zum Übertragen von Daten via I²C?


von Mats M. (elektrofreak)


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

von Jörg S. (joerg-s)


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.

von Mats M. (elektrofreak)


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?

von Jörg S. (joerg-s)


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.

von Mats M. (elektrofreak)


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?

von Mats M. (elektrofreak)


Lesenswert?

ich meine natürlich weniger -.- editieren geht leider nicht...

von Jörg S. (joerg-s)


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.

von Mats M. (elektrofreak)


Lesenswert?

Ok, sieht auch nicht schlecht aus. SMD kann ich gerne mal versuchen. 
Aber wo bekomme ich das Teil her?

Btw. Brauche ich auch eig. nur 30 Ausgänge pro IC oder ich steuer mit 3 
von den Teilen 4 x 30er Packs von LEDs an, das geht auch

von Mats M. (elektrofreak)


Lesenswert?

Was mir noch eingefallen ist: es sollte eine Bauteil-Bibliothek für 
dieses IC existieren, da ich keine ahnung habe, wie ich (besonders bei 
SMD) mir eine eigene mache. DIL-Packages hat Eagle ja frei, sodass man 
auch unbekannte ICs für Eagle verwenden kann aber im SMD-Format....

von Jörg S. (joerg-s)


Lesenswert?

> .....aber im SMD-Format....
Hat Eagle auch schon alles drin. Schau dir mal die smd-ipc.lbr an.

> Btw. Brauche ich auch eig. nur 30 Ausgänge pro IC oder ich steuer mit 3
> von den Teilen 4 x 30er Packs von LEDs an, das geht auch
Ich dachte du brauchst 512 Ausgänge, oder nicht?

von Mats M. (elektrofreak)


Lesenswert?

ich hab zwischen 12 und 20 LED-Reihen mit je 30 leds. rechnerisch sind 
das etwa 360-600. Rechnen wir mal mit 16x30=480. Das sollte dir helfen.

Dann sollte SMD kein Problem sein. Woher kann ich das IC beziehen? 
Reichelt und Conrad haben es nicht...

von Jörg S. (Gast)


Lesenswert?

Wo man das herbekommt weiss ich nicht.

Ist I²C eigentlich zwingend? Ansonsten könnte man ja auch "normale" 
seriell/parallel Wandler nehmen und hintereinander schalten.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister

von Mats M. (elektrofreak)


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...

von Jörg S. (Gast)


Lesenswert?

Laut Datenblatt kann der PCF8577 nur 300µA treiben. Und einfaches high 
oder low kann er anscheinend auch nicht.

von Jörg S. (Gast)


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.

von Matthias (Gast)


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

von Mats M. (elektrofreak)


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

von Mats M. (elektrofreak)


Lesenswert?

Der 74HC595 scheint recht gut geeignet zu sein und auch günstig 
erhältlich zu sein. Die maximale Frequenz wird im Megaherz-Bereich 
angegeben. Dies kommt mir jedoch sehr komisch vor... welche 
Geschwindigkeit wäre mit einem 8MHz getaktetem ATMega32 zu erreichen?

von Matthias (Gast)


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

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.