Hallo, bin gerade dabei eine LED Matrixanzeige zu basteln, momentan ist
noch die Planungsphase :). Das ganze soll mit einem AVR betrieben
werden. Hab hier im Forum schon etwas geschnökert und auch google ein
wenig gequält und bin dabei auf diese
http://home.wanadoo.nl/electro1/avr/scroll5.htm Seite gestoßen. Das
Konzept gefällt mir ganz gut und es lässt sich einfach realisieren.
Lediglich den Zeilentreiber (74HC259) würd ich ggf. auch gegen ein
Schieberegister austauschen.
Bei dieser Schaltung hab ich nur eine kleine Verständnisfrage, in die
Schieberegister für die Spalten muß man doch eigentlich nur einmal eine
1 schieben, 1x durchlaufen lassen (also 39 x 0) und dann wieder eine 1
rein... usw., außer man möchte z.B. daß jedes Display das gleich
anzeigt, dann müßten einmal 1, dann vier mal 0, dann wieder 1, 4x0...
usw. alternativ mit anderen Abständen. Enstprechend in der Spalte wo
sich gerade der H Pegel befindet, müssen die dazugehörigen Zeilen
geschaltet werden.
Will man in der letzten Anzeige etwas anzeigen, muß die benötigte 1 also
erst mal bis dort hin geschoben werden.
Habe ich das soweit korrekt geschnallt?
Noch ein paar Fragen, der Sinn des Speicherregisters im HC595 erschließt
sich mir nicht ganz für diesen Fall. Wozu braucht man das?
Gibt es ein äquivalentes Schieberegister wo man die Schieberichtung
ändern kann?
MfG BC
Die Zeilen werden gemultiplext, und nicht die Spalten! In die
595er-Kette wird das reingeschoben, was in der nächsten Zeile angezeigt
werden soll. Dann wird die Zeile weitergeschaltet und die 595er geben
den seriell reingeschobenen Wert aus. Dann werden die 595er wieder
gelatcht und während die Zeile leuchtet, werden die Bits für die nächste
Zeile in die 595er geschoben. Usw... Andernfalls hätte man leichte
Probleme mit Einschaltzeiten von 1/40 für jede Spalte.
Alles klar, der 74HC259 wird hier also lediglich als 1 zu 8 decoder
missbraucht und hochgezählt.
In die Schieberegister werden also 40 BIT geschoben, dann für eine
bestimmte Zeit angezeigt, in dieser Zeit werden die nächsten 40 BIT
geschoben, der HC259 wird um 1 erhöht, rutscht um 1 Zeile höher / tiefer
und zeigt dort die nächsten 40 BIT an, während die nächsten 40 BIT
geschoben werden.
Nun richtig?
Die andere Methode würde auch funktionieren, allerdings wäre der
Rechenaufwand sicherlich höher.
MfG BC
Browncoat wrote:
> Alles klar, der 74HC259 wird hier also lediglich als 1 zu 8 decoder> missbraucht und hochgezählt.>> In die Schieberegister werden also 40 BIT geschoben, dann für eine> bestimmte Zeit angezeigt, in dieser Zeit werden die nächsten 40 BIT> geschoben, der HC259 wird um 1 erhöht, rutscht um 1 Zeile höher / tiefer> und zeigt dort die nächsten 40 BIT an, während die nächsten 40 BIT> geschoben werden.>> Nun richtig?
Sieht besser aus...
> Die andere Methode würde auch funktionieren, allerdings wäre der> Rechenaufwand sicherlich höher.
Das hat zunächst nichts mit dem Rechenaufwand zu tun, sondern damit,
dass jeder Matrixpunkt nur noch 1/40 der Zeit leuchten würde. Um die
gleiche Leuchtstärke wie im "normalen" Leuchtbetrieb zu erreichen,
müsstest Du den 40-fachen Strom durch die LEDs schicken und außerdem
eine sehr hohe Aktualisierungsrate wählen, um kein Flimmern zu haben.
Mit der vorgestellten Methode hingegen brauchts nur den 7-fachen Strom,
was die LEDs noch (kurzzeitig) abkönnen sollten. Außerdem muss die
Aktualisierungsrate nicht so hoch sein.
Richtig.
Ich denke aber, der Rechenaufwand wäre geringer, wenn das ganze
Spaltenweise (und nicht wie hier zeilenweise) ausgegeben würde..
Welche andere Methode meinst du?
@ Johannes M:
Ich meine mit Rechenaufwand eher die SOftwareseite:
Für die Hardware/Stromstärken.. sind deine Ausführungen vollkommen
korrekt.
Ich denke aber das es sinnvoller ist, das Array in derSoftware
spaltenweise zu führen, da die Informationen so einfacher eingeschrieben
werden können.
zB. viele kleine Bitmaps für die Zahlen 0..9, jede Bitmap ist 5Byte groß
(idealerweise wohl eher 8) und beinhaltet die anzuzeigende Information
für Spalte 0,1,2,3,4 damit die ensprechende Ziffer dargestellt wird.
Soll diese jetzt angezeigt werden, so muss diese nur in das
Array[welches von 0..39 geht) kopiert werden, etwa so:
array[ y+0 ] = ziffernvorrat[ x*5 + 0];
array[ y+1 ] = ziffernvorrat[ x*5 + 1];
array[ y+2 ] = ziffernvorrat[ x*5 + 2];
array[ y+3 ] = ziffernvorrat[ x*5 + 3];
array[ y+4 ] = ziffernvorrat[ x*5 + 4];
x: anzuzeigende Ziffer, y: Spalte ab der die Ziffer angezeigt werden
soll.
Das ist wohl einiges einfacher und Rechenzeitsparender als ein
aufwändiges Kopieren in die entsprechenden Bits jeder 40bit großen
Zeile...
Hinweis:
Man kann die geänderte Spalten/Zeilen Geometrie
auch beim raustakten auf die Schieberegister
berücksichtigen.
Ist softwaremässig gar nicht mal so wild.
@ Matthias (Gast)
>Ich meine mit Rechenaufwand eher die SOftwareseite:>zB. viele kleine Bitmaps für die Zahlen 0..9, jede Bitmap ist 5Byte groß>(idealerweise wohl eher 8) und beinhaltet die anzuzeigende Information
5, Du hast ja nur 5 Spalten pro Anzeige. Und mal 5 rechnen geht schnell,
ist x 4 + x 1.
>Das ist wohl einiges einfacher und Rechenzeitsparender als ein>aufwändiges Kopieren in die entsprechenden Bits jeder 40bit großen>Zeile...
Ja. Das ist besser. Aber das hat nicht direkt was damit zu tun, wie die
LEDs angesteuert werden. Du kannst mit deinem Speicheraufbau das Display
in der jetzigen Form gut ansteuern. Du musst nur in jedem
Zeilendurchlauf jeweils das 0te ,1te ,2te ,3te ,4te ,5te ,6te Bit
kopieren und ins Schieberegister schieben. Mit ner Bitmaske sehr einfach
und schnell.
Den 259 würde ich nicht weglassen, der spart sinnvoll Pins.
MfG
Falk