Habe eine Anwendung, wo ich über einen Mircocontroller gerne 400 IO's schalten würde. Stell mir das so vor, das ich einen Hauptprint mit dem Controller habe, und auf jeder Seite, aneinanderhängend 25 Nebenprints mit jeweils 8 Outputs... Ich sollte diese innerhalb von etwa 400ms (So wenig wie möglich, aber kein killerkriterium wenns ein bisschen länger dauert) schalten können, zuverlässig! Da davon schlussendlich einige produziert würden, sollte das ganze möglichst billig sein... und möglichst wenig bauteile beinhalten (der platz ist beschränkt...) So So auf die Schnelle fallen mir die möglichkeiten: Schieberegister, i^2c Outputs, und Multiplexen ein... Mit schieberegistern würde das zumindest auf dem Papier (was bekantlicherweise geduldig ist) tiptop funktionieren... Doch wie siehts in der Praxis aus? Krieg ich das zuverlässig hin über so viele Prints (die prints liegen direkt aneinander...) oder spielt mir die Kapazität da einen Streich? wäre es möglich den Flanken regelmässig mit einem Komparator oder Schmitttrigger (müssten entsprechend schnell sein) ihre Steilheit zurückzugeben, oder bin ich da hauptsächlich auf Pull-ups angewiesen...? Wie würdet ihr diese lösung bezüglich der Störungsempfindlichkeit einstuffen? Multiplexen möcht ich eigentlich aus verschiedenen gründen nicht (z.b. zu starr, wenn ich mal ein paar Outputs mehr brauche...)
Unter meiner Zwischendecke werkelt ein Mega8 mit 12 Mhz. An dem hängen 8 Module mit je einem 595 als Schieberegister. Zwischen den Modulen jeweils ca. 50cm Flachbandkabel. Kein Widerstand, kein gar nichts. Am Flachbandkabel ist zur Sicherheit jede 2. Leitung entweder GND oder Vcc. An jedem Modul hängen jeweils Leds die per SoftPwm einzeln gedimmt werden, also ein bischen schneller als 400ms. Null problemo.
hmmmmm wenn das so unkritisch angesehen wird.... für eine weiter anwendung würd ich 1000 Outputs brauche... hab bis anhin gedach, dass ich die unterteile und mit verschiedenen controllern ansteuere... hät ich ne chance 125 Print mit je 8 Outputs (74HC959) hintereinander zu schalten... wär optimal...
Du hast dann natürlich schon viele Clock Eingänge die vom Prozessor aus versorgt werden wollen. Ich hab jetzt nicht ins Datenblatt geschaut, wieviel Strom so ein Clock Eingang haben möchte. So wie ich das sehe ist das schlimmste was dir passieren kann, dass du ab und zu mal zwischendurch die Clock Signale 'auffrischen' musst. Über einen Schmittrigger oder so führen. Einfach mal ausprobieren. Rein vom programmieren her gibt es da keine Probleme. Und da du pro Schieberegisterkette nicht mehr als 5 Pins brauchst, könntest du am Prozessor an 2 8-Bit Ports immerhin 3 Schiebe- registerketten anbringen.
"Prozessor an 2 8-Bit Ports immerhin 3 Schiebe- registerketten anbringen." Du meinst, das bringt was in puncto performance? Glaub ich nicht. Habe jetzt keine Takte gezählt, aber ungefähr 15, eher was mehr. -3 bytes schieben -3 bits an den jeweiligen datenausgang transportieren -clock-Impuls erzeugen -Schleifenzähler decrementieren -Schleife erneut durchlaufen (oder auch nicht) Macht also für die 3 Bytes=24Bit 120 Prozessortakte. SPI mit clk/4 braucht dafür 128 Takte, und dann gibts oft noch den double-speed-mode, jetzt verlierst du mit der Software-Schnittstelle deutlich. Ausserdem kannst du während der SPI-Transfers noch was anderes machen...
Ich würde eine 32x16-Matrix aus sechs 74HCT574-Latches aufbauen. Das ergibt 512 Ausgänge. Die Latches sind Parallel am Datenbus und du brauchst nur 6 Steuersignale dafür. Von der Geschwindigkeit ganz zu schweigen, liegt im µs-Bereich.
> Du meinst, das bringt was in puncto performance?
Performance sicher nicht.
Aber bei 125 Eingängen die an einem Ausgang nuckeln
überkommt mich ein seltsames Gefühl.
Noch mal durchgelesen: OK. War schlecht geschrieben.
Worauf ich hinauswollte: Wenn eine Schieberegisterkette
den Ausgangspin vom µC überlastet, könnte man immer
noch deren 3 machen.
Ich habe hier ein gerät das aus 6 bis 9 Eingängen fast 4 Millionen Ausgänge decodiert, welche jeweils einen 16 oder 32 bit Wert annehmen können. Ich glaube sogar mit ca 17ms. Aber billig ist das Teil nicht, das ist schon ein dreistelliger euro Betrag. Leider werden natürlich auch an den µC einige Anforderungen gestellt, ob das mit einem ATmega8 geht weiß ich nicht. Wenn du willst kann ich ja mal ein Bild hochladen.
ich denke die kapazitive Last ist für den µC Port gefährlicher, wenn das soviele und lange Leitungen werden dann würde ich auch erst einen Treiber mit mehreren Ausgängen ansteuern und zumindest die Clock und Übernahmeleitungen in Gruppen aufteilen.
Zitat: ich denke die kapazitive Last ist für den µC Port gefährlicher, wenn das soviele und lange Leitungen werden dann würde ich auch erst einen Treiber mit mehreren Ausgängen ansteuern und zumindest die Clock und Übernahmeleitungen in Gruppen aufteilen. Antwort: Ist es nicht, denn die Induktivität der Leitung ist beim Schaltpuls stärker als die Kapazität. ( ersatzschaltbild leitungen ) für einen uC Port kann NIEMALS eine Leitungslänge einen Pin killen.
Ich hab's doch oben geschrieben: so viele Ausgänge schreien nach einer Matrix, nicht nach jeder Menge Material! Ausserdem sollte man wärend dem Setzen der Ausgänge keine ungewollten Zustände riskieren, was bei Schieberegistern nun mal der Fall ist. Der gute alte Datenbus scheint aus der Mode zu sein, ist hierfür aber die ideale Lösung.
> Ausserdem sollte man wärend dem Setzen der Ausgänge keine ungewollten > Zustände riskieren, was bei Schieberegistern nun mal der Fall ist. Dafür hat der HC595 ja entsprechende Pins, die die Daten erst dann auf den Ausgang schalten, wenn alles durchgeschoben wurde.
Soll heißen: lieber 50 ICs verbauen, nur um ein paar IO-Pins zu sparen?? - Angenommen da sind 8-bit-Schieberegister wie der HC595 -
es geht aber nicht immer mit einer Matrix. STeht irgendwo, dass da nur LEDs geschaltet werden sollen - ist zwar anzunehmen, aber muss nicht sein.
Ist doch komplett wurscht was geschaltet wird, 16x32 ergibt 512 Ausgänge, wie auch immer die ausgangsseitig verwirklicht sind. Können auch Solid-State-Relais sein oder was auch immer.
ups.. Überschneidung.
>Dann mußt du ja multiplexen, ist ja eklig
Nein. Nur die 6x8 Bit 'reinschieben und die Ausgänge freigeben.
Und wie willst du so jedes einzelne Bit individuell setzen? Geht das? Wär ja cool...
Eine Matrix musst du multiplexen, eine Schieberegisterschaltung nicht. Wenn ich 1000 statische Ausgänge brauche, die ihren Pegel ganz von alleine halten, nehm ich lieber ein Schieberegister als eine Matrix.
für Sonic ist das alles das gleiche. Ist doch völlig egeal, was geschaltet wird..., nenene.
>>Dann mußt du ja multiplexen, ist ja eklig > >Nein. Nur die 6x8 Bit 'reinschieben und die Ausgänge freigeben. Damit aktiviere ich dann einen Kreuzungspunkt in der Matrix. Und was ist in der Zwischenzeit mit den restlichen 999? Da brauchst du dann erst recht wieder an jedem Kreuzungspunkt irgendeine Schaltung, die sich den Zustand merkt.
Ich glaube wir reden aneinander vorbei. Ich baue eine Matrix aus 6 Schieberegistern auf. 2 Stück (16 bit) Spalten und 4 Stück (32 bit) Zeilen. Auf diese Weise kann ich sehr wohl jedes Bit einzeln setzen und löschen ohne einen Ausgang für längere Zeit zu ändern. Um die Ausgänge unterbrechungsfrei zu ändern braucht's dann schon (wie ich oben schrieb) Latches, deren Output-Enable gemeinsam geschaltet wird. Geht bei den Schieberegistern auch, glaub' ich.
Sonic wrote: > Ich glaube wir reden aneinander vorbei. > Ich baue eine Matrix aus 6 Schieberegistern auf. 2 Stück (16 bit) > Spalten und 4 Stück (32 bit) Zeilen. Auf diese Weise kann ich sehr wohl > jedes Bit Welches Bit den? Ich will doch an den Kreuzungspunkt keinen Speicher setzen. Da sitzen vielleicht Relais! Wenn du eine Matrix hast, wählst du eine komplette Spalte aus. Aus dieser Spalte wählst du mit den Zeilentreibern eine bestimmte Zeile aus. Dort hast du dann Stromfluss. Und was ist mit all den anderen Kreuzungspunkten in dieser Spalte? Die haben dann logischerweise keinen Stromfluss. Nicht schön, wenn alle anderen Relais in der Spalte abfallen, nur weil ich eines davon umschalte. Bei Leds ist das kein Problem. Da benutzt du die Trägheit des Auges um ein kontinuierliches Leuchten hervorzubringen. Aber bei anderen Dingen brauchst du in den Knotenpunkten der Matrix erst recht wieder Speicherglieder, die sich den Zustand merken. Die wollen wir aber nicht, weil dann der ganze Vorteil der wenigen Bauteile wieder weg ist. Also läuft's wieder auf multiplexen hinaus. Heist aber auch, dass du dadurch zwangsweise an jedem Kreuzungspunkt eine PWM hast. Bei Leds ist das kein Beinbruch ...
@ Karl heinz Buchegger: Mal' dir mal am Besten eine Matrix auf. Wenn ich eine Spalte aktiviere kann ich mit der Zeile bestimmen, welches bit in dieser Spalte gesetzt werden soll. Da die Schieberegister ja sowieso Latches sind wird der Zustand bis zur nächsten Änderung gehalten. Multiplexen muss ich deshalb auch nichts. Ich setze ja nicht nur ein bit sondern die, die ich brauche. Die umgekehrte Funktion wäre die Abfrage einer 4x4-Tastatur. Da kann ich auch mehrere Tasten drücken und den Zustand auswerten.
Sonic wrote: > @ Karl heinz Buchegger: > Mal' dir mal am Besten eine Matrix auf. > Wenn ich eine Spalte aktiviere kann ich mit der Zeile bestimmen, welches > bit in dieser Spalte gesetzt werden soll. Da die Schieberegister ja > sowieso Latches sind wird der Zustand bis zur nächsten Änderung > gehalten. Multiplexen muss ich deshalb auch nichts. Ich setze ja nicht > nur ein bit sondern die, die ich brauche. > Die umgekehrte Funktion wäre die Abfrage einer 4x4-Tastatur. Da kann ich > auch mehrere Tasten drücken und den Zustand auswerten. Mach ich. Hier ist sie a ----- 1 2 3 b ----- 4 5 6 c ----- 7 8 9 | | | | | | d e f Wie müssen jetzt die Spaltentreiber d-e-f bzw. die Zeilentreiber a-b-c gesetzt sein, damit die Ausgänge 1 und 9, und nur die beiden, High Pegel führen?
@ sonic So geht es leider wirklich nicht denn bei einer Tastatur müssen schon Entkoppeldioden drin sein, sonst hast du Pseudosignale. Drücke Tasten an Kreuzung Spalte B mit Reihe 5 und E mit 8. Dabei entstehen auch (nicht gewollte) Verbindungen E mit 5 und B mit 8. Bei einer Ausgabematrix besteht genau das selbe Problem.
Meinetwegen mach an die Kreuzungspunkte Leds rein. Die Aufgabe ist nach wie vor dieselbe: Led 1 und Led 9 sollen leuchten, alle anderen sollen dunkel sein.
OK, haste Recht! Manchmal verrennt man sich. Habe das mit einer Relaismatrix verglichen, diese hat 16 'Schienen' auf die man 32 Ein- Ausgänge aufschalten kann. Brett vor'm Kopf kommt vor, sorry! :-(
Mann, hier geht's aber zur Sache! Die Tastatur muss ich natürlich nacheinander abfragen, zuerst Zeilen, dann Spalten. Das läuft in einer Schaltung schon prima, funktioniert also.
> Die Tastatur muss ich natürlich nacheinander abfragen, > zuerst Zeilen, dann Spalten Also: multiplexen Wie gesagt: Wenn an die 1000 Ausgänge Leds dran kommen ist eine gemultiplexte Matrix sicher eine Lösung. Ist kein Problem, ich hab ein kommerzielles Led-Anzeigeboard da, wie man es in Geschäften manchmal als Laufschrift sieht. Funktioniert genau nach dem von dir vorgeschlagenem Prinzip. Wenn das aber keine Led sind ....
Na, dann geht's wohl doch nur mit Materialaufwand. Wenn ich an die S7 bei uns im Betrieb denke.. Schränkeweise IO-Baugruppen für 5000 I/Os.
Ich habe mal eine Schaltung mit 192 Leds aufgebaut, alle über HC595 angesteuert. Problem: 8 LEDs an einem Register ziehen zuviel Strom. Zweites Problem: die Schaltung war auf einer Fläche von 2x1,2m verteilt. Nach dem dritten Register hatte ich Probleme mit der Kommunikation, es kam zu Bitfehlern, also hier schirmen oder gleich auf differentielle Kommunikation umsteigen, erhöht aber den Aufwand. Das Clock-Signal des Controllers muß natürlich verstärkt werden, wegen der hohen kapazitiven Last.
> Nach dem dritten Register hatte ich Probleme mit der Kommunikation
Hmm. Die habe ich bei meinen 8 nicht.
Ich hab allerdings zwischen jeweils 2 Signaladern im
Flachbandkabel vorsorglich jeweils eine Masseleitung
oder Vcc gelegt.
@Karl Heinz: Wie lang sind deine Kabel? Meine erstecken sich um die 12-15m. Habe sie schon verdrillt, aber naja...unsauberer Aufbau. Möchte den Aufbau nochmals neu machen, kleine AVRs nehmen und dann soll jeder mit einer gewissen Intelligenz ausgestattet werden und jede LED einzeln dimmbar machen. Ein Atmega8 übernimmt hier eine Masterrolle und steuert die kleinen AVRs an. Mal sehen. Evtl. gehen ich auf geschirmte Leitungen und setze auf RS485...
> Wie lang sind deine Kabel? Meine erstecken sich um die 12-15m. OK. So lange sind sie nicht. Von einem 595 zum nächsten sinds etwa 50cm. In Summe also um die 4 Meter. Anfangs hatte ich auch etwas Bauchweh wegen der Kabellängen. Nach einem Probeaufbau hat sich das dann allerdings schnell zerschlagen. Funktioniert astrein. > soll jeder mit einer gewissen Intelligenz ausgestattet werden > und jede LED einzeln dimmbar machen. :-) Hey. Da haben wir wohl dasselbe gebaut. Ich hab nur einen zentralen Mega8 und das Schieberegister. Ich hab mir auch überlegt Slave-CPU's einzusetzen, habs aber dann gelassen, da mir die Kommunikation zu aufwändig war. Ich hab allerdings nur 64 Leds dran und keine 192. Bei meinen 12Mhz am Mega8 wird das mit der SoftPWM schon ganz schön eng.
Und hier, je 40 LEDs, Platine ist 30cm lang, 12 Stk kamen hintereinander. Gesamtstrom war erheblich (knapp 10A), hinter der Platine lief ein 2,5mm²-Kabel, an jeder 2.Platine wurde zusätzlich gespeist. Die SR sind 74HCT4094. Angesteuert das Ganze von einem Mega8, Leitungstreiber 74HC4050.
hey crazy horse da will ich etwa das genau gleiche machen, hätte zwar keine LED aber das ist ja nicht der puntk... würde es dir was ausmachen mir das Schema deiner Platine zu mailen? würd mir sicher sehr helfen...
> für einen uC Port kann NIEMALS eine Leitungslänge einen Pin killen.
Auch nicht bei Gewitter?
Nicht nur Gewitter, bei hohen Schaltfrequenzen ist die kapazitive Last enorm! Das kann einem Kurzschluß ähneln. @Karl Heinz Buchegger: Ich mache demnächst mal ein Foto von meiner Platine...ist etwas kleiner als deine.
hallo, der thread war zu öang nur meinen senf, wenn du mit schieberegistern arbeitetest, ÜBERLÄUFE beachten !!!! gruss
Anstatt eines 74HC595 schlage ich den ST6C595. Das IC ist auch ein 8Bit Schieberegister bloss die Ausgangsstufe kann mehr Strom liefern. Eine 16Bit Version gibt es auch.
@Raphael B. >Nicht nur Gewitter, bei hohen Schaltfrequenzen ist die kapazitive Last >enorm! Das kann einem Kurzschluß ähneln. Bitte nochmal das Kapitel Leitungstheorie durcharbeiten. Dann klappts auch mit hohen Schaltfrequenzen. Die AVRs haben so ca. 10ns Anstiegszeit (teilweise sogar weniger). Das entspricht einer Laufzeit von ca. 2m Kabel. Wenn dahinter noch 100m Kabel sind, dann "sieht" das der Ausgang gar nicht. Er sieht im Schaltmoment nur die Impedanz des Kabels, bei Flachbandkabel ca. 100 Ohm zwischen zwei Leitungen. Bei 4m Kabellänge muss man auf jeden fall impedanzrichtig arbeiten, sprich die Leitungen müssen halbwegs konstanten Wellenwiderstand haben (100 Ohm kommt gut) und mit 100 Ohm abgeschlossen sein. Da bei 3,3V da schon ordentliche Ströme fliessen (33 mA), sollte man entweder 1) Split Termination, sprich 200 Ohm gegen VCC und GND, macht effektiv 100 Ohm, allerdings ist der Strom für den Treiber halbiert 2) AC-Termination, 100 Ohm über einen C gegen Masse, geht aber nur wirklich bei konstant laufenden Takten. Das mit den 500/1000 IOs ist also alles halb so wild, wenn man ein paar wesentliche Dinge beachtet. MFG Falk
@Barti >Ich habe mal eine Schaltung mit 192 Leds aufgebaut, alle über HC595 >angesteuert. Problem: 8 LEDs an einem Register ziehen zuviel Strom. Da kann man nen netten Trick anwenden Beitrag "Ansteuerung von LEDs mittels Schieberegister" >Autor: Peter Dannegger (peda) >Datum: 30.11.2006 17:08 >Bei den 74HC595 gibts den Trick, 4 LEDs gegen GND und 4 LEDs gegen VCC >zu schalten, dann ist die Belastung der VCC/GND-Pins halbiert. >In der Software dann noch ein EXOR mit 0xF0 und gut is. >Zweites Problem: die Schaltung war auf einer Fläche von 2x1,2m verteilt. >Nach dem dritten Register hatte ich Probleme mit der Kommunikation, es >kam zu Bitfehlern, also hier schirmen oder gleich auf differentielle >Kommunikation umsteigen, erhöht aber den Aufwand. Vielleicht erstmal einfach ne ordentliche Verkabelung + Beschaltung? >Das Clock-Signal des Controllers muß natürlich verstärkt werden, wegen >der hohen kapazitiven Last. Nö, die AVRs haben schon ordentlich Dampf. MFG Falk
Eine Kaskadierung dieser Shiftregister ist möglicherweise etwas sensibel, was das exakte Zeitverhalten von Takt und Daten angeht. Immerhin ändert sich der Kaskadeausgang mit der gleichen Taktflanke, aufgrund der das nächste Register den Eingang liest. Und da müssen setup/hold times eingehalten werden, was bei einer stark belasteten langen Taktleitung interessant werden könnte. Das Shiftregister '4094 hat einen Kaskadeausgang, der einen halben Takt verschoben ist, so dass solche Probleme nicht auftreten können.
@crazy horse >Und hier, je 40 LEDs, Platine ist 30cm lang, 12 Stk kamen Und was ist das Ganze dann? Ne LED Anzeige für Text? Oder ne Flugfeldbefeuerung? ;-) >gespeist. Die SR sind 74HCT4094. Angesteuert das Ganze von einem Mega8, >Leitungstreiber 74HC4050. ??? 4050 ist ein Level-Shifter. Der hat genauso viel (odersogar weniger) Treiberleistung wie ein AVR Ausgang. Oder hast du alle sechs Gatter parallel geschaltet? MFG Falk
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.