www.mikrocontroller.net

Forum: Hausbus Zeit zum Übertragen von Daten via I²C?

Autor: Mats Marcus (elektrofreak)
Datum: 11.05.2008 17:48

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
Autor: Jörg S. (joerg-s)
Datum: 11.05.2008 18:49

> 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.
Autor: Mats Marcus (elektrofreak)
Datum: 11.05.2008 19:40

> 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?
Autor: Jörg S. (joerg-s)
Datum: 11.05.2008 20:08

> 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.
Autor: Mats Marcus (elektrofreak)
Datum: 11.05.2008 21:28

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?
Autor: Mats Marcus (elektrofreak)
Datum: 11.05.2008 22:21

ich meine natürlich weniger -.- editieren geht leider nicht...
Autor: Jörg S. (joerg-s)
Datum: 12.05.2008 18:42

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.
Autor: Mats Marcus (elektrofreak)
Datum: 12.05.2008 19:10

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
Autor: Mats Marcus (elektrofreak)
Datum: 12.05.2008 19:38

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....
Autor: Jörg S. (joerg-s)
Datum: 12.05.2008 20:20

> .....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?
Autor: Mats Marcus (elektrofreak)
Datum: 12.05.2008 20:41

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...
Autor: Jörg S. (Gast)
Datum: 13.05.2008 08:54

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-Tutori...
Autor: Mats Marcus (elektrofreak)
Datum: 13.05.2008 10:38

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...
Autor: Jörg S. (Gast)
Datum: 13.05.2008 12:36

Laut Datenblatt kann der PCF8577 nur 300µA treiben. Und einfaches high
oder low kann er anscheinend auch nicht.
Autor: Jörg S. (Gast)
Datum: 13.05.2008 12:42

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.
Autor: Matthias (Gast)
Datum: 13.05.2008 13:03

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!)
Autor: Mats Marcus (elektrofreak)
Datum: 13.05.2008 16:08

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
Autor: Mats Marcus (elektrofreak)
Datum: 13.05.2008 16:40

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?
Autor: Matthias (Gast)
Datum: 14.05.2008 12:46

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

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net