Forum: Mikrocontroller und Digitale Elektronik Multiplexing - Tic-Tac-Toe - 3x3-Feld - wie richtige Zeitdauer finden?


von Marco M. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Marco M. (Gast)


Lesenswert?

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?

von isr (Gast)


Lesenswert?

Marco M. schrieb:
> Was genau meinst du mit ISR?
Interrupt Service Routine

von Marco M. (Gast)


Lesenswert?

Alles klar, Danke !

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
Noch kein Account? Hier anmelden.