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
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...
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
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...
Oder nimm einen passenden Chip dafür. z.B. den MAX7219, der kann 64 LED ansteuern und ist kaskadierbar.
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
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
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
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
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)
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.
> 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.
> 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
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
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
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...
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
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
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...
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.
Die Schaltung würde mich ganz ehrlich mal interessieren. Würdest Du sie mal posten? Gruß AVRli...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.