www.mikrocontroller.net

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


Autor: Phil Mustermann (8mm)
Datum:

Bewertung
0 lesenswert
nicht 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:
Youtube-Video "3x3x3 LED ATmega32 Laborboard AVR ATMEL"
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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Phil Mustermann (8mm)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfram Herzog (wherzog)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Phil Mustermann (8mm)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Wolfram Herzog (wherzog)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Phil,

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

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

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ein (reales) Bespiel, wie es geht:

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

Grüße Uwe

Autor: Phil Mustermann (8mm)
Datum:

Bewertung
0 lesenswert
nicht 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:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1600000
$baud = 9600

Config Portc = Output                                       '7/8 Spalten an PORT.C als Output
Config Porta.7 = Output                                     'die 8. Spalte an Port A als Output
Config Portd = Output                                       'Port mit den Ebenen als Output
'Portd.0 = 0                                                 'PortD,0 auf low (Ebene 1)
'Portd.1 = 0                                                 'PortD.1 auf low (Ebene 2)
'Portd.2 = 0                                                 'PortD.2 auf low (Ebene 3)
                                                            'nachfoldend: alle Spalten auf high
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1
Porta.7 = 1

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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Wolfram Herzog (wherzog)
Datum:

Bewertung
0 lesenswert
nicht 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_po...

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

Autor: Phil Mustermann (8mm)
Datum:

Bewertung
0 lesenswert
nicht 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.
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1600000
$baud = 9600

Config Portc = Output
Config Portb = Output

Dim Col As Byte
Dim Row As Byte

Do

  For Col = 0 To 7

    Config Porta = Input
    Portc = 0
    Portb = 0
    Portc.col = 1
    If Col = 7 Then
      Portb.7 = 1
    End If

    For Row = 0 To 2
       Config Porta = Input
       Ddra.row = 1

    Next

  Next

Loop

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.