Forum: Mikrocontroller und Digitale Elektronik Software für Led-Matrix


von Der F. (flins)


Lesenswert?

Hallo zusammen!

Ich hatte mir ja in der Bucht 500 Leds ersteigert (hatte hier schonmal 
wegen einem Zeichensatz geschrieben) und diese ("nur" 320=(8x5)x8 der 
500...) in einer Matrix verarbeitet. Habe meine alte Software etwas 
umgeschrieben zum Testen, allerdings gefällt mir diese nicht mehr. Diese 
Zeit-totschlagenden delay Funktionen finde ich doof, und somit wollte 
ich es mit Timern machen.

Gesteuert wird alles von einem Mega32-16 @16MHz. Nun habe ich aber noch 
nichts mit Interrupts gemacht, auch mit Timern nichts. Nichts ist 
übertrieben, ich habe mich letztens mal daran probiert, allerdings 
interruptete da gar nichts. (Mein Software-Versuch habe ich nicht mehr, 
vor lauter rumprogrammieren ist nichts mehr davon übrig) Könnte mir 
jemand evtl. ein Grundgerüst in C liefern, womöglich mit ein paar 
Kommentaren für den Lern-Effekt, das mir einfach eine ISR aufruft? Wäre 
super. Ich würde mich auch mit einem guten Tutorial zufrieden geben (Das 
AVR-GCC kenne ich schon... Allerdings bringt mich das nicht weiter.)

Vorgaben meinerseits( es sei denn, jemand hätte eine bessere Idee):
Aufruf der ISR (in der ich die jeweils nächste Spalte ausgeben will, 
nicht eure Aufgabe :-)) mit ca 1kHz = 25 Bilder\s x 40 Spalten.
Meine Berechnungen ergaben zB 16MHz \ Prescaler 64 \ 256 = 976Hz, was 
immerhin 24,4 Bilder Pro Sekunde ergeben würden. Meinnt ihr das reicht? 
oder sollte es eher mehr sein? Was aber ein Problem mit den Prescalern 
geben würde.
Ich habe allerdings auch mal etwas gehört von wegen, ähm, wie nannte man 
das nochmal,...Timer Compare Match? Da konnte man doch den Timer nur bis 
zu einer bestimmten Zahl zählen lassen bis er interuptet, wenn ich mich 
nicht täusche. Damit wären dann auch andere Wiederholrate möglich. 
Allerdings habe ich dazu noch nicht viel brauchbares gefunden. Scheinbar 
assemblern viele von euch.

Würde mich freuen, wenn mir da jemand weiterhelfen könnte. Jetzt wo ich 
vor den Klausuren an der FH noch etwas Luft habe, will ich das unbedingt 
noch zum Laufen bringen.

Danke schonmal für euer Hirnschmalz.

MfG

Dominic

PS: Mir ist gerade noch aufgefallen dass meine "/" Slashes als 
Kursiv-Format-Befehl interpretiert wurden, kann man das umgehen? Denn 
Backslashes sehen da irgendwie doof aus...

von Der F. (flins)


Lesenswert?

hochhol

von Matthias L. (Gast)


Lesenswert?

>("nur" 320=(8x5)x8 der 500...)
????

>Aufruf der ISR ... mit ca 1kHz = 25 Bilder\s x 40 Spalten.
Ok.

>16MHz \ Prescaler 64 \ 256 = 976Hz
Ok.

>immerhin 24,4 Bilder Pro Sekunde ergeben würden
40Spalten?

>Meinnt ihr das reicht?
Ja.

>Timer Compare Match? ... zu einer bestimmten Zahl zählen lassen
Würd ich nicht tun. Lass ihn einfach überlaufen. Da hast du gleich noch 
ne Zeitbasis (1/976)sek.

>Scheinbar assemblern viele von euch.
Ich nicht mehr. Ich bin auf C umgestiegen.

>Würde mich freuen, wenn mir da jemand weiterhelfen könnte.
Wie denn?

von Marcus W. (blizzi)


Lesenswert?

Matthias Lipinsky wrote:

>>Timer Compare Match? ... zu einer bestimmten Zahl zählen lassen
> Würd ich nicht tun. Lass ihn einfach überlaufen. Da hast du gleich noch
> ne Zeitbasis (1/976)sek.
Matthias:
Wieso würdest du das nicht tun? Auch mit einem definierten Compare Wert 
hat man eine definierte Zeitbasis.

Dominic:
Ja, das Compare Register löst einen Compare Match Interrupt aus, sobald 
der Wert erreicht wurde. Schau doch mal im Datenblatt nach, da sind 
Diagramme die zeigen wie die Timer zählen.
Ich lasse solche Sachen im CTC-Mode laufen. Da zählt er bis zum Compare, 
löst nen Interrupt aus und fängt wieder bei 0 an.

Hier ein Codeschnipsel vom ATmega2560 zur Initialisierung vom Timer:
(die Registernamen sind beim mega32 anders, aber vielleicht hilfts dir 
ja)
1
void init_timer(void)
2
{
3
   /* Prescaler 64 */
4
   TCCR0B |=  (1<<CS00);
5
   TCCR0B |=  (1<<CS01);
6
   TCCR0B &= ~(1<<CS02);
7
   /* CTC mode */
8
   TCCR0A &= ~(1<<WGM00);
9
   TCCR0A |=  (1<<WGM01);
10
   TCCR0B &= ~(1<<WGM02);
11
   /* Vergleichsregister setzen */
12
   OCR0A = 0xFA;
13
   /* Compare Interrupt enable */
14
   TCNT0 = 0x00;
15
   TCCR0A &= ~(1<<COM0A0);
16
   TCCR0A &= ~(1<<COM0A1);
17
   TIMSK0 |= (1<<OCIE0A);
18
}

Die ISR sieht dann ungefähr so aus:
1
ISR(TIMER0_COMPA_vect) {
2
  // Code den es ausführen soll
3
}

>>Scheinbar assemblern viele von euch.
> Ich nicht mehr. Ich bin auf C umgestiegen.
Ich verwende asm auch nur noch da wo unbedingt nötig, in C sind die 
Sachen einfach schneller geschrieben und besser zu warten.

von Falk B. (falk)


Lesenswert?

@ Dominic Mlinsky (flins)

>jemand evtl. ein Grundgerüst in C liefern, womöglich mit ein paar
>Kommentaren für den Lern-Effekt, das mir einfach eine ISR aufruft? Wäre

Interrupt

Ist ja wohl naheliegend? ;-)

>immerhin 24,4 Bilder Pro Sekunde ergeben würden. Meinnt ihr das reicht?

Ja. Aber eine 40:1 Mux kannst du vergessen. Siehe
LED-Matrix

MFG
Falk

von Peter D. (peda)


Lesenswert?

Dominic Mlinsky wrote:

> Diese
> Zeit-totschlagenden delay Funktionen finde ich doof, und somit wollte
> ich es mit Timern machen.

Doof ist garkein Ausdruck, die sinnlos vergeudete Zeit fehlt Dir 
schlichtweg für andere Tasks.


> Nichts ist
> übertrieben, ich habe mich letztens mal daran probiert, allerdings
> interruptete da gar nichts.

Wie wärs mit dem Beispielcode im Example-Ordner des GCC?


> Ich habe allerdings auch mal etwas gehört von wegen, ähm, wie nannte man
> das nochmal,...Timer Compare Match?

Vom Hörensagen kann man nicht effektiv programmieren.
Besser man liest das selber im Datenblatt nach.


> Allerdings habe ich dazu noch nicht viel brauchbares gefunden.

Wenn Dir was im Datenblatt noch unklar ist, frag ruhig.


> Scheinbar
> assemblern viele von euch.

Ich würde eher sagen, die wenigsten.


Peter

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.