Forum: Mikrocontroller und Digitale Elektronik 3x3x3 LED Matrix - einzelne Ebenen ansteuern


von Phil M. (8mm)


Lesenswert?

Hi,

ich habe mir in den letzten Tagen ein Programmiergerät für einen 
ATMEGA32 gelötet. Das war das erstemal, dass ich irgendetwas mit 
Löten/Elektronik/LED/Schaltungen/µC zu tun hatte.
Bin deswegen sehr überrascht, dass alles (nach viiielen Anläufen und 
versuchen und Fehlern) wunderbar klappt!
Ich kann nun meinen AVR so programmieren, dass LEDs blinken.
Sprich ich weiß, wie ich einen Port als in/out definiere und wie ich 
einen pin auf 5V oder 0V schalte. Außerdem kann ich schalter mit 
einbeziehen.
Das Programm lade ich dann über avrdude-gui auf meinen AVR, da es mit 
BASCOM nicht klappt. "Could not identify chip with ID:FFFFFF"

Ich habe nun eine 3x3x3 grüne LED-Matrix gelötet, bei der ich die 
Kathoden in der Ebene miteinander verbunden habe und die Anoden in den 
Spalten.
Von den Anoden gehen 8 an den PortC meines AVR und einer an PORTA.
Die 3 Kathoden-Leitungen gehen einfach an GND an meinem Board.
Das Ganze sieht dann so aus:
http://www.youtube.com/watch?v=eq5Oux-I7qo
Hier sieht man mein Board, meinen "schiefen" Würfel und mein erstes 
Programm.

Ich will nun wissen, wie ich einzelne LEDs leuchten lassen kann.
Ich habe schon einiges gelesen von Multiplexing oder Schieberegistern.
Verstehe aber die praktische Anwendung dahinter nicht - sprich, wie ich 
das an meinem AVR realisiere.

Dass nur einzelne Spalten bei mir leuchten ist, logisch, da ja alle 3 
Ebenen auf einen GND-Punkt gehen.
Meine Logik sagt mir, dass ich nun die 3 Ebenen seperat an 3 
verschiedene GND-Punkte setzeb muss, und diese dann auch schlaten muss.
Wie ich das aber mache, weiß ich nicht.
Muss ich die GND auch an den µC anschließen?
Wenn ja, wie schlate ich das dann?

Wäre schön, wenn mir jmd helfen könnte.

mfg Phil

von Sebastian (Gast)


Lesenswert?

Ich bin selbst absoluter Anfänger deshalb würde ich auf meinen Tipp 
nicht viel geben.
Aber meiner Meinung nach musst du die 3 Kathoden auch an 
unterschiedliche Pins anschließen und diese dann zischen Ausgang/Eingang 
umschalten. Sicher bin ich nicht.
Zudem wäre noch der ein oder andere Widerstand von nöten. Frag mich 
nicht welche Größe :P

von Alexander L. (lippi2000)


Lesenswert?

Hier scheint doch noch einiges sehr unklar zu sein.

schau dir die Schaltung LED-Matrix nochmals an.

Mit den Transistoren Q9 bis Q13 wird die Spalte ausgewählt. D.h. die 
Kathoden der LEDs dieser ganze Spalte haben GND-Potentzial.
Wird nun Q1 geschalten (Zeilenwahl), so liegt an den Anoden der LED1-5 
5V an. Nun liegt aber nur eine Kathode dieser LEDs auch an GND und kann 
somit leuchten.

Also man kann nun jede einzelne spaltenweise bestimmte LEDs anschalten.
Nun kommt der eigentliche Sinn: Es werden sehr schnell alle Spalten 
nacheinander durchlaufen und entsprechend dazu bestimmte LEDs 
angeschaltet. Da dein Auge träge ist, kommt es dir vor als wären alle 
Spalten angeschalten. Man kann somit z.B. 9 LEDs mit 6 Signalleitungen 
schalten (3x3).

Nun zum Thema Schieberegister:

Dieses dient zur weiteren Einsparung von Signalleitungen. Beispielsweise 
kannst du bei einer LED-Matrix 4x32 einfach 4 Schieberegister 
hintereinander hängen und eine logische 1 durch alle register schieben, 
damit nacheinander alle Spalten aktiviert werden. Dafür benötigst du 
lediglich 2 Signalleitungen (CLK und IN). Jetzt hast du 128 LEDs (4x32) 
statt mit 36 Signalleitungen (Einfaches Multiplexen) mit 6 
Signalleitungen erledigt.

Und, Sinn erkannt???

Gruß Alexander

von Alexander L. (lippi2000)


Lesenswert?

Ach ja, wenn du 3x3x3 machen möchtest, dann muss einfach in der 
Schaltung "LED-Matrix" diese 3x aufgebaut werden und in jeder Schaltung 
ein Transistor, der die Transistoren Q9...Q13 zusammenfasst, ergänzt 
werden. Mit diesen 3 zus.Transistoren kannst du die Ebene auswählen.

Multiplexen würde ich hier nur die Ebenen. (3+3+3=9Signalleitungen)

von Falk B. (falk)


Lesenswert?

@ Alexander Liebhold (lippi2000)

>Multiplexen würde ich hier nur die Ebenen. (3+3+3=9Signalleitungen)

Dazu braucht man aber 3+9 Leitungen, da ja pro Ebene 9 LEDs vorhanden 
sind.

MFG
Falk

von Phil M. (8mm)


Lesenswert?

Okay, das Thema hier LED-Matrix habe ich verstanden.
auch, dass wenn ich die einzelnen transistoren auf GND schalte, und dazu 
einen Transistor der Zeile, leuchten die entsprechenden LEDs.

Dazu brauche ich aber 2 µC, oder?
Ich habe nämlich nur den ATMEGA32.
Oder kann ich das alles über den einen laufen lassen?

von Falk B. (falk)


Lesenswert?

@ Phil Mustermann (8mm)

>Dazu brauche ich aber 2 µC, oder?

Und warum das?

>Ich habe nämlich nur den ATMEGA32.

Und? Der hat 32 IOs. Reicht das nicht? Und er kann 16 Millionen Befehle 
pro Sekunde verarbeiten, das ist eine Menge!

>Oder kann ich das alles über den einen laufen lassen?

Sicher.

MFG
Falk

von Wolfram H. (wherzog)


Lesenswert?

Ich würde die ganze Sache einfach als 9*3 Matrix betrachten, die eben an 
zwei Stellen "gefaltet" wurde.
Damit wird dann die Ansteuerung auch wieder ganz einfach...

von Phil M. (8mm)


Lesenswert?

Ja also bei dem Beispiel sind ja 2 ICs verbaut.
Und die I/O Ports schalten doch zwischen 0V und 5V. oder?

Ich kann doch auf einen GND keine 5V geben, um ihn anzusteuern.
Versteh ich das ganze doch nicht?

von Wolfram H. (wherzog)


Lesenswert?

Hallo Phil,

schau dir auf der Matrix-Seite mal den folgenden Schaltplan an:
http://www.mikrocontroller.net/wikifiles/thumb/6/64/LED_Matrix_8x5.png/500px-LED_Matrix_8x5.png

Jetzt einfach statt der beiden Schieberegister die Anschlüsse der 
Transistoren  an zwei IO-Ports Deines MEGA anschließen und eine 
entsprechende Software zum Multiplexen der LEDS schreiben.

Das geht am besten interrupt-gesteuert - aber auf jeden Fall reicht dazu 
ein MEGA16 - oder sogar nur ein MEGA8....

Ansonsten muß ich sagen: Toll wie weit Du schon gekommen bist! Weiter 
so!

MfG
Wolfram

www.wherzog.de

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Hier ein (reales) Bespiel, wie es geht:

http://www.bralug.de/wiki/3D-LED-Display

Grüße Uwe

von Phil M. (8mm)


Lesenswert?

Ich habe mal einen Test gemacht.

Hier sieht man, wie mein Würfel angeschlossen ist:
http://img246.imageshack.us/img246/2276/abcd0011pr0.jpg

Alle Ports sind OUTPUT.
Die spalten (an PC0-7 und PA7) stehen auf HIGH (5v).
Die ebenen (an PD0-2) stehen auf LOW (0V).

Eigtl müsste alles leuchten - es leuchten aber nur die LEDs in der Ebene 
PD0.
Das verwundert mich sehr!
Schalte ich Spalten auf low, so gehen die entsprechenen LEDs in der 
Ebene PD0 aus.
Eigtl funktionierts, ich kann die LEDs einzeln ansteuern.
Nur halt in der Ebene PD0 und in den andern nicht.

Hier mein Code:
1
$regfile = "m32def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 1600000
6
$baud = 9600
7
8
Config Portc = Output                                       '7/8 Spalten an PORT.C als Output
9
Config Porta.7 = Output                                     'die 8. Spalte an Port A als Output
10
Config Portd = Output                                       'Port mit den Ebenen als Output
11
'Portd.0 = 0                                                 'PortD,0 auf low (Ebene 1)
12
'Portd.1 = 0                                                 'PortD.1 auf low (Ebene 2)
13
'Portd.2 = 0                                                 'PortD.2 auf low (Ebene 3)
14
                                                            'nachfoldend: alle Spalten auf high
15
Portc.0 = 1
16
Portc.1 = 1
17
Portc.2 = 1
18
Portc.3 = 1
19
Portc.4 = 1
20
Portc.5 = 1
21
Portc.6 = 1
22
Portc.7 = 1
23
Porta.7 = 1

Zeile 11, 12 und 13 bewirken nichts, egal, ob ich sie auskommentiere 
oder nicht!

von Simon K. (simon) Benutzerseite


Lesenswert?

Weil sie standardmäßig beim Startup schon auf 0 stehen, vielleicht.

von Wolfram H. (wherzog)


Lesenswert?

Wenn ich das Bild so anschaue frage ich mich, ob die LED wirklich als 
Matrix verschaltet sind?

Prüfe das ganze doch mal von Hand mit einem Vorwiderstand. Wenn alle 
LEDs korrekt mit +5V bzw. GND verbunden sind, müssen Sie ja auch 
leuchten. Wenn nicht, probier aus wie Du das von Hand hinbekommst. Dann 
kannst Du auch den Kontroller richtig programmieren....

Btw: Schau mal hier:
http://blog.makezine.com/archive/2007/09/make_a_pocket_led_cube_we.html

Da gibt es auch ein PDF mit vielen Infos...

von Phil M. (8mm)


Lesenswert?

Es sind selbstverständlich alle LEDs richtig verschaltet.
Es gibt 9 Spalten und 3 Ebenen - schalte ich die ebenen auf GND und die 
Spalten auf +5V dann leuchten alle LEDs.

ich bin nun schon ziemlich weit mit meinem code.
Ich multiplexe nun schon alle 27 LEDs - das heißt ich schalte sie in 
27ms ganz schnell nach einander an und aus.
Somit erhalte ich für das träge menschl. Auge ein Bild, in dem jede LED 
einzeln leuchtet.
1
$regfile = "m32def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 1600000
6
$baud = 9600
7
8
Config Portc = Output
9
Config Portb = Output
10
11
Dim Col As Byte
12
Dim Row As Byte
13
14
Do
15
16
  For Col = 0 To 7
17
18
    Config Porta = Input
19
    Portc = 0
20
    Portb = 0
21
    Portc.col = 1
22
    If Col = 7 Then
23
      Portb.7 = 1
24
    End If
25
26
    For Row = 0 To 2
27
       Config Porta = Input
28
       Ddra.row = 1
29
30
    Next
31
32
  Next
33
34
Loop

Mich interessiert nun, wie ich meinen Code erweitern muss, damit ich 
meine eigenen Animationen mit Multiplexing schreiben kann?!
Hat jmd eine Idee?

von Falk B. (falk)


Lesenswert?

@ Phil Mustermann (8mm)

>Mich interessiert nun, wie ich meinen Code erweitern muss, damit ich
>meine eigenen Animationen mit Multiplexing schreiben kann?!
>Hat jmd eine Idee?

du musst einen Timerinterrupt nutzen.

AVR-Tutorial: 7-Segment-Anzeige
Interrupt

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