Forum: Mikrocontroller und Digitale Elektronik LED Display mit 16x8 LED's


von AVRli (Gast)


Lesenswert?

Hallo,

ich möchte ganz gerne mit einem ATmega8 ein "Display" mit 16x8 LED's
realisieren. Jede LED soll "einzeln" ansteuerbar sein, damit man auch
einfache "Animationen" realisieren kann. Nun wird man doch dafür
nicht 128 Ausgänge benötigen!? :-/

Und an der Stelle bitte ich euch um Hilfe. Wie realisiert man sowas auf
einfache Weise? Wie groß ist der Aufwand wenn man das Display vergrößern
möchte?

Schöne Grüße, AVRli

von Rahul (Gast)


Lesenswert?

Das Zauberwort heisst "Multiplexing".
Man teilt die 128 LEDs in 8 Zeilen und 16 Spalten ein, und "klickert"
sie der Reihe nach durch.
Wenn man das mit einer genügend grossen Gewschwindigkeit macht, ergibt
das den Eindruck eines stehenden Bildes.
95% aller LED-Anzeigen arbeiten nach dem Prinzip. Wenn nicht sogar
mehr...

von Sascha Laue (Gast)


Lesenswert?

Du steuerst das Display im Zeilen-/Spaltenmultiplexbetrieb an. Dafür
benötigst du dann nur noch 24(16+8) Ausgänge.
Für ein zweites Display wären es dann dann 32 (16+8+8) usw.
Um die dann relativ hohen Ströme zu händeln, schaltest du einfach
geeignete Transistorschaltstufen hinter die Ausgänge.

Gruß Sascha

von Rahul (Gast)


Lesenswert?

wenn man die 16 Spalten mit einem 16-Bit-Adressdecoder versieht, spart
man nochmal Leitungen. Dafür braucht man dann nur noch 12 insgesamt. Es
ist IMHO sinnvoller, die Zeilen als Byte auszugeben, da man dann
bezüglich der Spalten flexibler ist. Wird das System um 16 Spalten
erweitert, braucht man nur noch einen Ausgang mehr...

von Chris (Gast)


Lesenswert?

Oder nimm einen passenden Chip dafür.

z.B. den MAX7219, der kann 64 LED ansteuern und ist kaskadierbar.

von AVRli (Gast)


Lesenswert?

Hallo an alle,

ich danke euch für die Antworten, nun ich muß gestehen das ich auf der
Hardwareschiene nun wirklich kein Ass bin. Ich behersche die Grundlagen
und das war es auch schon. Für mich ist das nen Hobby und ich möchte
eigendlich dabei dazu lernen. Das "Projekt" hier ist eine Spielerei
aber trotzdem interessant, für mich jedenfalls. :-)

Also wenn ich es richtig werte, finde ich die Lösung von Rahul sehr
interessant. Der ATmega8 würde mir diese 12 Ausgänge locker zur
Verfügung stellen. Bleibt nur noch eine Frage.

Was ist ein "16-Bit-Adressdecoder" ???

Hast Du vielleicht mal eine Chip-Bezeichnung damit ich mir das
Datenblatt mal laden kann um zu sehen was man damit machen kann?

Was das "Multiplexing" angeht habe ich das Prinzip verstanden, wie
ich es umsetze, werde ich sehen. In Assembler und den AVR's habe ich
schon viele kleine Sachen realisieren können, denke das diesmal erstmal
die Hardware mein Problem ist. :-)

Schöne Grüße, AVRli

von Jürgen Schuhmacher (Gast)


Lesenswert?

Bei großen Arrays ist es wichtig, daß die Refreshdauer beachtet wird,
sonst blinkt es. Am einfachsten ist es, Latches zu verwenden. Dort
hinein schreibt man ein 8Bit-Wort für jeweils 8 LEDS.

Hier sind enige Insprirationen:
7Segment statt 8 Leds mit EAGLE files:
http://home.arcor.de/juergen.schuhmacher/eaglesevensegboard.html

8x8 Matrix von LEDs:
http://www.geocities.com/Colosseum/Track/9393/images/bbledmatrix.jpg

von Peter D. (peda)


Lesenswert?

Das mit dem Adreßdekoder vergiß am besten gleich wieder.

1. ist das ein riesen Flatschen (24 Pin, breit).
2. ist 16-fach Multiplex bezüglich Helligkeit und Impulsströme schon
etwas kritisch.

Besser ist bis max 8-fach Multiplex.

Das ginge z.B. mit einem 74HC595 und 8 * BC368 für die 8 Zeilen
(Anoden) und 16 Widerständen für die Spalten (Katoden) direkt an den
µC.

Um Pins zu sparen, kann man die zweiten 8 Spalten über einen 74HC574
D-FF kaskadieren. Für das Laden des D-FF wird der 75HC595
dunkelgetastet /OE-Eingang.
Je weitere 8 Spalten dann weitere 8 Widerstände und ein 74HC574
anschließen.


Wenn Du es mit Hardware aber nicht so hast, ist der MAX7219 (für je 64
LEDs) am einfachsten.


Peter

von Rahul (Gast)


Lesenswert?

Adressdecoder, auch Demultiplexer genannt:
Die Dinger haben in diesem Fall 4 Adress-Eingänge und 16 Ausgänge.
Je nach Adresse sieht ein Ausgang anders aus alle der Rest.
Es gibt Adressdecoder die Low-Pegel liefern, aber auch welche, die
High-Pegel liefern.
Ein Vertreter ist der 74HC154.
Der besitzt auch noch einen Enable-Eingang, mit dem man die Dinger noch
kaskadieren kann.
Ich betreibe mit zwei 4514 (hat auch noch ein Latch) insgesamt 32
Lampen und brauche nur 6 Ausgänge (jeweils einen Enable-Eingang).
Ich hoffe, das klärt erst mal deine Fragen
Gruß Rahul

von AVRli (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle,

die sich meinem Problem angenommen haben.
Ich habe noch ein paar Fragen zum Verständniss. Ich möchte den
Hardwareaufwand auch so gering wie nur möglich halten und habe jetzt
ersteinmal einen Gang zurückgeschalten. Ich beschränke mich erstmal auf
8x8 LED's. Mit dem "Vergrößern" auf 8x64 oder mehr komme ich nicht
mit. Vielleicht ist es auch nicht sooo schwer, doch erstmal kleine
Brötchen backen. :-) Alle LED's sind diese LowCurrent LED's und wenn
man die LED-Reihen "durchklickert" leucheten doch immer nur maximal 8
somit ist man bei 16mA doch im grünen Bereich und kann auf Transistoren
verzichten oder?

Ich möchte einen ATmega nehmen, weil ich von den noch welche hier habe,
nur wenn ich das PORT B komplett verwenden möchte dann muß man die
PIN's 9 und 10 (PB6 und PB7) als I/O-Pin "anmelden". Und hier habe
ich noch eine Frage. Ich habe bis jetzt jede AVR Schaltung mit einem
Quarz betrieben und kann mir daher nur schlecht vorstellen woher der
Chip dann seinen Takt bekommen soll.

Wenn jemand eine einfache Lösung hat um das Display doch zu erweitern
würde ich mich über jeden Tip freuen.

Gruß AVRli...
(habe mal die Schaltung angehangen, so wie ich mir das vorstelle)

von Benedikt (Gast)


Lesenswert?

Wenn du die LEDs mit 2mA pro LED betreibst, und jede LED nur 1/8 der
Zeit an ist, fließt durch jede LED im Mittel nur 0,25mA.
Ist OK, aber nur in einem dunklen Raum....
Du solltest daher jede LED mit 16mA betreiben, so dass jede im Mittel
mit 2mA angesteuert wird.

von Chris (Gast)


Lesenswert?

> Ich habe bis jetzt jede AVR Schaltung mit einem
> Quarz betrieben und kann mir daher nur schlecht vorstellen woher
> der Chip dann seinen Takt bekommen soll.

Der ATmega hat einen integrierten RC-Oszillator, den du anstelle eines
Quarzes benutzen kannst. Bei fabrikneuen Chips ist der auch immer
aktiviert, du solltest damit also schon in Berührung gekommen sein.

Wenn du nicht gerade (z.B.) eine Uhr oder bauen oder eine schnelle
serielle Verbindung herstellen musst langt der allemal.

von Peter D. (peda)


Lesenswert?

> Ich habe bis jetzt jede AVR Schaltung mit einem
> Quarz betrieben und kann mir daher nur schlecht vorstellen woher
> der Chip dann seinen Takt bekommen soll.


Wenn Du nicht unbedingt die Pins brauchst, dann bleib dabei.
Bei den Großen werden die Pins eh nicht frei.
Und Du weißt dann wenigstens, daß die Frequenz stimmt.
Fürs Debuggen mit der UART kann das sehr nützlich sein.

Und das manche die UART ohne Quarz benutzen, ist noch lange kein
Beweis, daß es immer funktionieren muß. Funktionieren muß nämlich nur
das, was der Hersteller im Datenblatt ausdrücklich zusichert.

Nichts ist blöder, als wenn man 14 Tage lang einen Fehler sucht, nur
weil man 50 Eurocent an Hardware gespart hat.


Peter

von AVRli (Gast)


Lesenswert?

Hallo Leute,

nun habe ich es endlich geschafft mal anzufangen mit dem Projekt, ich
beschränke mich erstmal auf ein Matrix mit 8x8 LED's. ;-)

Am PortD habe ich nun die Zeilen und am PortC die Spalten
angeschlossen. Nun das "Programm" läuft auch schon, doch nicht so wie
ich es erwartet hätte. Wenn ich nun ein Muster darstellen möchte dann
sind die LED's die aus sein sollen nie ganz aus, sondern leuchten
immer noch ganz wenig.

Das Bild sollte nun erstmal eine Zickzacklinie von oben nach unten in
de ersten beiden Spalten sein. Nur richtig gut sieht es noch nicht
aus.

Was mache ich da falsch? Gruß AVRli, für jeden Tip dankbar...

MAIN_LOOP:
  ldi wrH,0b00000010
  out PORTB,wrH

  ldi wrH,0b11111110
  out PORTD,wrH
;-------------------------------------
  ldi wrH,0b00000001
  out PORTB,wrH

  ldi wrH,0b11111101
  out PORTD,wrH
;-------------------------------------
  ldi wrH,0b00000010
  out PORTB,wrH

  ldi wrH,0b11111011
  out PORTD,wrH
;-------------------------------------
  ldi wrH,0b00000001
  out PORTB,wrH

  ldi wrH,0b11110111
  out PORTD,wrH
;-------------------------------------
  ldi wrH,0b00000010
  out PORTB,wrH

  ldi wrH,0b11101111
  out PORTD,wrH
;-------------------------------------
  ldi wrH,0b00000001
  out PORTB,wrH

  ldi wrH,0b11011111
  out PORTD,wrH
;-------------------------------------
  ldi wrH,0b00000010
  out PORTB,wrH

  ldi wrH,0b10111111
  out PORTD,wrH
;-------------------------------------
  ldi wrH,0b00000001
  out PORTB,wrH

  ldi wrH,0b01111111
  out PORTD,wrH

  rjmp MAIN_LOOP

von Jan (Gast)


Lesenswert?

Darüber habe ich auch schon länger gegrübelt, aber eigentlich ist es
offensichtlich:
Du wechselst die Zeilen und Spalten-Einstellungen ja nacheinander, so
dass es zu Überschneidungen kommt, und zeitweise nicht das richtige
Signal an den Zeilen anliegt.
Also:
1. alle LED aus
2. Spalte wechseln
3. Zeile mit dem gewünschten Muster anschalten

von AVRli (Gast)


Lesenswert?

Danke Jan! ;-)

Ich war wirklich schon am zweifeln, wenn ich nun beide Ports vorher
ausschalte und dann die Zeile weiter schalte und anschließend das
Muster anlege, leuchten nur noch die LED's die es auch sollen. freu

Hat vielleicht noch jemand einen Tip wie man die LED's nun doch noch
ein wenig heller bekommt? Denn so richtig gut kann man das Muster nur
in einem dunklerem Zimmer erkennen. Reicht da wirklich schon eine
Ansteuerung mit Transistoren?

Ich danke, Gruß AVRli...

von peter dannegger (Gast)


Lesenswert?

Zum Multiplexen gehört fast untrennbar der Timerinterrupt.

Anders ist es nicht möglich unabhängig vom gerade laufenden Programm
eine konstante hohe Helligkeit zu erzielen.

In Deinem Beispiel ist die Frequenz viel zu hoch, da sie nur durch die
reine Laufzeit bestimmt wird. Und damit sind auch die Dunkelphasen
relativ lang.


Du legst dir z.B. im SRAM einen bereich von 8 Byte an und in einem
Timerinterrupt (z.B. 1ms) wird ein Byte an PORTB und der Wert für die
Zeile an PORTD ausgegeben. Im nächsten Interrupt das nächste usw.
Damit Du nun weißt, welches Byte gerade dran ist, nimmst Du noch ein
Byte als Zähler 0..7 und nach der 7 gehts wieder mit der 0 weiter.

Im Hauptprogramm lädst Du das gesamte darzustellende Bild in die 8
Bytes, nach einer Weile das nächste Bild usw.


Peter

von AVRli (Gast)


Lesenswert?

Hallo,

danke für die Hilfe, was würde ich ohne dieses Forum und ohne eure
Hilfe machen? ;-I Ich denke alles in die Ecke feuern... ;-)

@Peter
Soweit steht dann auch die Software. Ich habe die Ausgabe des Musters
in den TC0 Interrupt gelegt. Den TC1 Interrupt kann ich nun dafür
nehmen um Bilder zu "animieren". Wird bestimmt lustig. :-)

@All
Nur meine beiden letzten Spalten bleiben immer aus. Das dürfte wohl
daran liegen das da der Quarz noch dran ist. Da ich nicht unbedingt nen
Quarztakt brauche würde ich die beiden PIN's ganz gerne als I/O Pin
nutzen wollen. Das STK500 läst sich aber nur schwer überreden mir diese
an den EXPANSIONS Leiste zur Verfügung zu stellen. :-(

Eine Alternative wäre sicher die Ports neu aufzuteilen und mir die
ersten 6 Zeilen vom PortB und die zwei die dann noch fehlen vom PortC
nehmen. PortD dann zum anlegen vom 8Bit Muster.

Wie würdet ihr daran gehen?

Gruß AVRli, der nun schon ein "8x6" Matrix hat... freu

von AVRli (Gast)


Lesenswert?

Hi,

nun ich habe die Ports neu aufgeteilt und kann nun das gesamte 8x8
Matrix ansteuern. Es ist wirklich interessant zu sehen was für
Möglichkeiten man nun damit hat.

Ich danke allen die mir geholfen haben.

Das ganze ist in Assembler geschrieben, den Quelltext würde ich bei
Interesse auch der Allgemeinheit zur Verfügung stellen. Ist doch ein
interessanter Einstieg in Sachen AVR. ;-)

Muß ich dann noch was beachten?

Gruß AVRli...

von mad_mike (Gast)


Lesenswert?

Ich hab genau das bereits mal mit 16x16 leds gemacht. Ich hab mit 2
74hc4017 chips die zeilen gesteuert und direkt mit den ports die
spalten. Mit nem Atmega 8 und 16Mhz inkl. uart geht das einwandfrei.
Ich bastel nur noch grad an der software rum.

von AVRli (Gast)


Lesenswert?

Die Schaltung würde mich ganz ehrlich mal interessieren. Würdest Du sie
mal posten?

Gruß AVRli...

von mad_mike (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab da leider keinen Schaltplan kezeichnet, ich hab einfach drauf
los getüddelt ;) Ich kann aber mal die Software mit dranhängen. Bitte
nicht wegen dem dummen signal(SIG_UART_RECV) aufregen, das ist echt
dumm programmiert. Also die software is ungefähr so aufgebaut:
An nem atmega16 hängen an 4 io/s die dekaden Zähler ( 74hc4017 ) dran.
Die steuern die Zeilen, ( da war ich dumm, da ich die outputs des
4017er  nochmal invertieren musste ). Die Spalten werden direkt über 2
ports angesteuert ( wegen der Wiederholfrequenz, würd ich die spalten
an nem 4017 ansteuern, würd die in den boden sinken ). Dann empfängt
der seine daten über uart und zwar folgendermasen:
als erstes irgenein zeichen zum aktivieren.

dann gehts im folgenden prinzip weiter:

ZZTSSS

Z=Zeile, willst du Zeile eins, musst  du da 01 reinschreiben,
T= Teiler der Spalten, 1 = Ersten 8, 2=letzten acht.
SSS=Spalte des teilers, die werden binär angegeben, da man dann beim
anzeigen nicht lange mit schleifen rumfuchteln muss. Beispiel für SSS:
255, dann sind bei der jenigen zeile und teiler die ganzen leds an.

Okay, für Verbesserungen hab ich gern ein ohr offen.

mad_mike

von mad_mike (Gast)


Lesenswert?

achja, eins hab ich noch vergessen: Kommt über uart 'r' rein, setzt er
die ganzen variablen zurück, bekommt er c rein, cleant er die matrix.

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
Noch kein Account? Hier anmelden.