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