Go Down

Topic: Laufschrift LED Matrix (Read 13997 times) previous topic - next topic

fl3xizzz

schön gemacht :-) läuft bei mir auch soweit.. kannst du mal bitte posten wie du die LEDs an den Max angeschlossen hast bei mir ist alles falsch rum :D

jurs


schön gemacht :-) läuft bei mir auch soweit.. kannst du mal bitte posten wie du die LEDs an den Max angeschlossen hast bei mir ist alles falsch rum :D


Ich habe selbst gar nichts angeschlossen, sondern fertig gekauft!
Beim billigsten China-Händler auf eBay, den ich für die Matrix finden konnte. Artikelnummer (190867212840).
Und wohl dem Händler, der den längsten Postweg hat: Am 06.12. bestellt und am 23.01. geliefert.
Schaltbild habe ich dafür nicht.

Was heißt "alles falsch rum"?
Läuft die Schrift bei Dir um 90, 180, 270 Grad gedreht? Und ggf. spiegelverkehrt?


fl3xizzz


jurs


spiegelverkert


Spiegelverkehrter Font zum Einsetzen statt des normalen Fonts im Quellcode:
Code: [Select]

unsigned char disp1[NUMCHARS][8]={
{0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, }, // 0
{0x8, 0xC, 0xA, 0x8, 0x8, 0x8, 0x8, 0x8, }, // 1
{0x7E, 0x40, 0x40, 0x7E, 0x2, 0x2, 0x2, 0x7E, }, // 2
{0x7C, 0x40, 0x40, 0x7C, 0x40, 0x40, 0x7C, 0x0, }, // 3
{0x10, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x10, 0x10, }, // 4
{0x3C, 0x4, 0x4, 0x3C, 0x20, 0x20, 0x3C, 0x0, }, // 5
{0x3C, 0x4, 0x4, 0x3C, 0x24, 0x24, 0x3C, 0x0, }, // 6
{0x7C, 0x44, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, }, // 7
{0x0, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x7C, }, // 8
{0x7C, 0x44, 0x44, 0x7C, 0x40, 0x40, 0x40, 0x7C, }, // 9
{0x10, 0x28, 0x44, 0x7C, 0x44, 0x44, 0x44, 0x44, }, // A
{0x3C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x3C, 0x0, }, // B
{0x3C, 0x2, 0x2, 0x2, 0x2, 0x2, 0x3C, 0x0, }, // C
{0x3E, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x0, }, // D
{0x3E, 0x2, 0x2, 0x3E, 0x2, 0x2, 0x2, 0x3E, }, // E
{0x3E, 0x2, 0x2, 0x3E, 0x2, 0x2, 0x2, 0x2, }, // F
{0x3C, 0x2, 0x2, 0x2, 0x2, 0x22, 0x22, 0x3C, }, // G
{0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22, 0x22, }, // H
{0x3E, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x3E, }, // I
{0x3C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0xC, }, // J
{0x0, 0x24, 0x14, 0xC, 0x4, 0xC, 0x14, 0x24, }, // K
{0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x3E, }, // L
{0x81, 0xC3, 0xA5, 0x99, 0x81, 0x81, 0x81, 0x81, }, // M
{0x0, 0x42, 0x46, 0x4A, 0x52, 0x62, 0x42, 0x0, }, // N
{0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, }, // O
{0x3C, 0x44, 0x44, 0x44, 0x3C, 0x4, 0x4, 0x4, }, // P
{0x38, 0x44, 0x44, 0x44, 0x44, 0x64, 0x44, 0xB8, }, // Q
{0x3C, 0x44, 0x44, 0x44, 0x3C, 0x24, 0x44, 0x84, }, // R
{0x0, 0x78, 0x4, 0x4, 0x7C, 0x40, 0x40, 0x3C, }, // S
{0x0, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, }, // T
{0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0x38, }, // U
{0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, }, // V
{0x0, 0x92, 0x92, 0x92, 0x92, 0x54, 0x38, 0x0, }, // W
{0x0, 0x82, 0x44, 0x28, 0x10, 0x28, 0x44, 0x82, }, // X
{0x82, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, }, // Y
{0x0, 0xFE, 0x40, 0x20, 0x10, 0x8, 0x4, 0xFE, }, // Z
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, // 
};

fl3xizzz

Deinen Code finde ich echt gut :-) für mich als Anfänger ist es schwierig sowas zu lesen aber ich habe mich schon mal da durch gearbeitet. Wo ich noch nicht so durch blicke ist das eigentliche verschieben.

Code: [Select]

    for (k=0;k<8;k++)
    {
      for (i=0;i<8;i++)
      {
        data[i]=((unsigned int)disp1[thischar][i]<<8 | disp1[nextchar][i]) >>8-k;
      }
      writeChar2Matrix(data);
      delay(50);
    }


Vom Aufbau hab ich es so halb verstanden. Du nimmst den geschobenen Buchstaben und packst ihn in ein Array mit 8 Plätzen und das wiederholst du halt 8x. Die Ausgabe und das Delay sind mir klar aber könntest du den Rest noch ein mal für Anfänger erklären?

jurs


Code: [Select]

    for (k=0;k<8;k++)
    {
      for (i=0;i<8;i++)
      {
        data[i]=((unsigned int)disp1[thischar][i]<<8 | disp1[nextchar][i]) >>8-k;
      }
      writeChar2Matrix(data);
      delay(50);
    }


Vom Aufbau hab ich es so halb verstanden. Du nimmst den geschobenen Buchstaben und packst ihn in ein Array mit 8 Plätzen und das wiederholst du halt 8x. Die Ausgabe und das Delay sind mir klar aber könntest du den Rest noch ein mal für Anfänger erklären?


Eigentlich habe ich es in Reply #1, #3 und #9 in diesem Thread schon dreimal erklärt.

Ein Byte hat 8 Bits, und immer 8 Bytes mal 8 Bits = 64 Bits stehen für die 64 LEDs auf dem Anzeigemodul.

Jeder Buchstabe besteht aus 8 Bytes a 8 Bits, und wenn man sich zwei Buchstaben nebeneinanderlegt bekommt man 8 words a 16 bits. Und aus diesem 8x16 Raster greift man sich dann jeweils ein 8x8 Raster heraus, als Übergang von einem Buchstaben auf den nächsten. Der so pro Phase neu berechnete "Übergangsbuchstabe", der auch wieder aus 8 Bytes a 8 Bits besteht, wird dann auf der LED-Matrix dargestellt.

fl3xizzz

ich meinte auch eigentlich, dass du mir die Zeilen mit den Behfehlen erklärst. Ich bin am basteln und probieren aber aber ich kriege einen letzten Fehler nicht weg. Er schiebt den Buchstabe von rechts nach links komplett rein bis er komplett zu sehen ist dann geht der Buchstabe aus und es dauert kurz und dann kommt der nächste. Also der Buchstabe steht auf der rechten seite komplett.

Code: [Select]
data[i]=((unsigned int)disp1[thischar][i]>>8 | disp1[nextchar][i]) <<8-k;
so habe ich es geändert.

jurs

#22
Jan 27, 2014, 06:01 pm Last Edit: Jan 27, 2014, 06:03 pm by jurs Reason: 1

Code: [Select]
data[i]=((unsigned int)disp1[thischar][i]>>8 | disp1[nextchar][i]) <<8-k;
so habe ich es geändert.


Warum geändert? Was möchtest Du bewirken? Damit löschst Du einen der beiden Buchstaben immer komplett aus!

Der Code auf der rechten Seite vom Gleichheitszeichen "(unsigned int) x<<8 | y" bedeutet:

Mache aus der 8-Bit Variablen x eine 16-Bit Variable (unsigned int) und schiebe die Bits um 8 Stellen nach links.
Aus der 8-Bit Variablen mit dem angenommenen Wert x== 0b10101010 würde zunächst
(unsigned int) x == 0b0000000010101010  (eine 16 Bit-Variable) und dann die Bits um 8 Stellen nach links geschoben
(unsigned int) x << 8 = 0b1010101000000000  (fehlende Stellen rechts werden beim Schieben mit 0 aufgefüllt)
dann wird eine bitweise Oder-Verknüpfung ("|") mit der Variablen y gemacht. y sei mal angenommen 0b00001111.
Code: [Select]

0b1010101000000000 |
0b0000000000001111 =
0b1010101000001111

Am Ende wird der Wert bei meinem Code um den Betrag 8-k nach rechts geschoben (">>8-k")
Für die Werte k=8 bis k=0 ergeben sich also verschiebungen von 0 bis 8 bits.
Und das niederwertigste Byte (die acht untersten Bits) werden dann als Daten dargestellt. Je nachdem, wie oft geschoben wird, ergibt sich für die LED-Zeile nacheinander das Muster:
Code: [Select]

1010101000001111
0101010100000111
0010101010000011
0001010101000001
0000101010100000
0000010101010000
0000001010101000
0000000101010100
0000000010101010
Wovon die 8 Bits an der rechten Seite als LED-Zeile nacheinander dargestellt werden
00001111
00000111
10000011
01000001
10100000
01010000
10101000
01010100
10101010

Wohlgemerkt, als zeitliche Abfolge ein und derselben LED-Zeile nacheinander. Das erfolgt natürlich immer für 8 LED-Zeilen a 8 Bits, also pro Schritt für insgesamt 64 LEDs.

Der von Dir geänderte Code, mit dem eine Byte-Variable um 8 Stellen nach rechts geschoben werden, z.B.
Code: [Select]
disp1[thischar][i]>>8 ist völlig sinnlos und könnte auch durch
Code: [Select]
disp1[thischar][i]=0 ersetzt werden. Denn wenn Du in einer 8-Bit Variablen achtmal rechts eine Stelle rausschiebst und links mit einer Null auffüllst, bestehen danach alle 8 Bits in jedem Fall nur aus Nullen. Also "alles aus".

fl3xizzz

Ahhh es hat glaube ich so langsam Klick gemacht bei mir :D

Aber ich will ja nicht sinnlos kopieren, ich will es ja verstehen. Danke schön noch mal :)
Werde es mal versuchen mit eigenem Code umzusetzen. Eine Frage habe ich aber noch, wie sieht das aus wenn ich nun einen dritten Buchstaben habe das wird mir aus deinem Code nicht ganz klar ich kann es mir vorstellen.... wäre nett wenn du mir das noch beantworten könntest.

:)

Go Up