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
ConfigPortc=Output'7/8SpaltenanPORT.CalsOutput
9
ConfigPorta.7=Output'die8.SpalteanPortAalsOutput
10
ConfigPortd=Output'PortmitdenEbenenalsOutput
11
'Portd.0=0'PortD,0auflow(Ebene1)
12
'Portd.1=0'PortD.1auflow(Ebene2)
13
'Portd.2=0'PortD.2auflow(Ebene3)
14
'nachfoldend:alleSpaltenaufhigh
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!
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
ConfigPortc=Output
9
ConfigPortb=Output
10
11
DimColAsByte
12
DimRowAsByte
13
14
Do
15
16
ForCol=0To7
17
18
ConfigPorta=Input
19
Portc=0
20
Portb=0
21
Portc.col=1
22
IfCol=7Then
23
Portb.7=1
24
EndIf
25
26
ForRow=0To2
27
ConfigPorta=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-AnzeigeInterrupt
MfG
Falk
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.