Guten Abend zusammen, Da ich blutiger Anfänger im Bereich Multiplexing und ATmega bin (habe seit 4 Monaten Assembler in der Schule zusammen mit einem Nibobee), habe ich ein paar Fragen. Wir haben uns als Projekt ein "Tic-Tac-Toe"-Spiel (in C) ausgesucht, welches von einem ATmega16 gesteuert werden soll. Ddadurch, dass wir bei 33 Ein-/Ausgängen gelandet sind, war das einer zuviel und wir haben nun vor das Feld zu multiplexen (was ich schon immer interessant fand). Nun zu meinem Problem. Im Bereich LED-Matrix bin ich schon ziemlich fündig geworden, was mein Problem angeht. Ich habe z.B. erfahren, dass man eine Frequenz von ca. 100Hz pro LED/Spalte/Zeile (jenachdem) erreichen sollte. Bei unserem Spiel sollte also eine Frequenz von 300Hz reichen. Liege ich mit diesem Ansatz richtig? Des Weiteren stelle ich mir die Frage, wie ich das Multiplexen am Besten über die Bühne bekomme... Als erstes hatte ich vor eine Funktion aufzurufen, welche das Feld ausgibt. Das fand ich aber relativ hirnlos und habe an einen Timer gedacht. Den kann ich zeitlich auch besser "timen" und habe immer nach x Takten die Ausgabe an das Feld. Hab das zwar noch nie in C (eigtl. noch nie was) gemacht, aber die Herausforderung ist der Sinn dahinter. In dieser Funktion wird abwechselnd immer wieder eine Zeile nach der anderen eingeblendet 1 - 2 - 3 - 1 - 2 - 3 - 1 - [...]. Pro Interrupt jedoch immer nur eine Zeile. Des Weiteren frage ich mich, wieviel mA die LED (3mm) bei dieser Frequenz benötigt. Ich steig da nicht ganz durch, laut LED-Matrix würde ich jetzt sagen, dass wir pro LED 60mA (bei 20mA Standardangabe) benötigen, das würde für jede Zeile (Masse) 180mA (im Vollbetrieb) bedeuten. Meine Frage lautet nur, ob die andere Zeit, wo die LED nicht leuchtet, reicht um die LED wieder abzukühlen oder wir den Strom doch lieber auf <60mA drossen sollten. Mit großem Dank an alle Leser, Marco
Marco M. schrieb: > erreichen sollte. Bei unserem Spiel sollte also eine Frequenz von 300Hz > reichen. > > Liege ich mit diesem Ansatz richtig? Grundssätzlich: ja Aber bis jetzt ist das ja nur eine Zahl, eine Absichtserklärung. > Des Weiteren stelle ich mir die Frage, wie ich das Multiplexen am Besten > über die Bühne bekomme... So wie immer. Mit einem Timerinterrupt Bei jedem Timerinterrupt wird ausgeführt:
1 | bisher angezeigte Spalte abschalten |
2 | nächste Spalte bestimmen |
3 | die LEDs dieser Spalte einschalten |
4 | Ausgangspin für diese Spalte aktivieren |
> gedacht. Den kann ich zeitlich auch besser "timen" und habe immer nach x > Takten die Ausgabe an das Feld. Hab das zwar noch nie in C (eigtl. noch > nie was) gemacht, aber die Herausforderung ist der Sinn dahinter. Ist halb so schwer, wie es sich anhört. Wenn du weißt, wie ein Timer funktioniert und wie man eine ISR an den Timer bindet, ist das schon 70% der Miete (neben einer Hardware, die multiplexen erlaubt) > Des Weiteren frage ich mich, wieviel mA die LED (3mm) bei dieser > Frequenz benötigt. Ich steig da nicht ganz durch, laut LED-Matrix > würde ich jetzt sagen, dass wir pro LED 60mA (bei 20mA Standardangabe) > benötigen, das würde für jede Zeile (Masse) 180mA (im Vollbetrieb) > bedeuten. Ja, kommt hin. > Meine Frage lautet nur, ob die andere Zeit, wo die LED nicht leuchtet, > reicht um die LED wieder abzukühlen oder wir den Strom doch lieber auf > <60mA drossen sollten. Das passt prinzipiell schon. Persönlich benutze ich für meine LED allerdings auch keine 20mA, weil sie mir schlicht und ergreifend dann zu hell sind :-) Probiers einfach mal aus: verschalte eine LED auf 20mA und danach verschalte sie auf zb 15mA. Wenn du sie nebeneinenader hältst, sieht man, dass die eine dunkler ist. Wenn man sie aber nacheinander ansieht, ist der Unterschied normalerweise nur zu merken, wenn man weiß, dass die eine weniger Strom kriegt.
Heyho, danke für deine Antwort. Hat mir doch schon stark geholfen (: Waren meine Überlegungen und Recherchen ja doch alle "richtig". > Ist halb so schwer, wie es sich anhört. Wenn du weißt, wie ein Timer > funktioniert und wie man eine ISR an den Timer bindet, ist das schon 70% > der Miete (neben einer Hardware, die multiplexen erlaubt) Was genau meinst du mit ISR? In Assembler habe ich schon den Timer0 & Timer1 (mit Zusatz-Register) programmiert und genutzt, mit und ohne voreingestellten Registern. Damit der Timer nicht das volle Register (ab 00000000) nutzt, sondern z.B. erst ab "10111010". Meinst du dieses Verhalten mit ISR?
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.