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
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
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
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)
@ 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
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?
@ 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
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...
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?
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
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!
Weil sie standardmäßig beim Startup schon auf 0 stehen, vielleicht.
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...
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?
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.