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
> 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.
> 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?
> 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.
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?
ich meine natürlich weniger -.- editieren geht leider nicht...
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.
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
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....
> .....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?
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...
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
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...
Laut Datenblatt kann der PCF8577 nur 300µA treiben. Und einfaches high oder low kann er anscheinend auch nicht.
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.
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!)
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.