Hi Programmierer,
Ich will ja einen Schwenktexter bauen, ihr wisst schon, einen Leuchtstab, der beim hin und her schwenken einen Text 'in die Luft' malt. Ein Teil einer Propelleruhr sozusagen. Die Erzeugung der Leuchtpunkte sollen APA102 Leds machen. cdn.sparkfun.com/datasheets/Components/LED/APA102C.pdf
Der ganz grobe Ablauf: In einem Bildspeicher steht der Text drin 12x16er font, also ein Byte für die oberen 8 der 16 Leds, ein byte für die unteren 8 der 16 Leds, die übereinander angeordnet sind. Die Anzahl der bytes im Bildspeicher entspricht der Spaltenanzahl, die in einem Schwenk angezeigt werden kann. Um einen Buchstaben anzuzeigen werden also nacheinander 24 bytes des Bildspeichers in Leuchtpunkte umgesetzt. Ich finde das jetzt schwierig zu beschreiben, wenn Fragen auftauchen, nachhaken!
Gut. Für die Ansteuerung einer APA102 sind 4 bytes notwendig, die durch die Led 'durchgeschoben werden, ähnlich wie bei den WS2812 Leds.
APA102-bytes.PNG
Im 'Global' steckt die Helligkeit, die ist bei mir max=&B11111, sodass das erste byte immer &HFF ist. Bei den Farben sollen bei mir auch nur die hellsten, also &HFF oder &F00 drin stehen.
In welcher Farbe ein Text dargestellt wird, ist in einem Farbspeicher abgelegt, der für jede Spalte des Bildspeichers ein byte enthält. Ist dessen byte.0=1 gesetzt, wird die Spalte in rot dargestellt, byte.1=1 in grün, byte.2=1 in blau und daraus folgt für byte=3 eine Darstellung in gelb (rot+grün gleichzeitig). 7 Farben + schwarz sind so möglich.
Ich nähere mich der Fragestellung. Um eine Spalte jetzt zum Leuchten zu bringen, sehe ich im Farbspeicher unter der Spaltennummer nach und weiß, welches bytes der Farbbytes der Leds &HFF enthalten muss, wenn diese gemäß dem Bildspeicher zu leuchten hat.
Jetzt die Frage, wie komme ich am einfachsten von dem bit, was über Leuchten/Nichtleuchten entscheidet zu dem byte &HFF/&F00, das ich an die Led sende. Momentan bin ich soweit:
Alles anzeigen
Das wäre jetzt die isr, die für jede Spalte aufgerufen wird. Es sind 19 Leds insgesamt, nur 16 werden für die Textdarstellung verwendet.
Ihr seht, um von einem bit aus dem Bildspeicher zu einem byte für die Ausgabe zu kommen, multipliziere ich mit 255. Das braucht mächtig Zeit. Wäre vielleicht hier nicht das Problem, aber schön schaut sowas nicht aus, eher dilettantisch. Wie könnte man es schöner/besser machen?
Ich will ja einen Schwenktexter bauen, ihr wisst schon, einen Leuchtstab, der beim hin und her schwenken einen Text 'in die Luft' malt. Ein Teil einer Propelleruhr sozusagen. Die Erzeugung der Leuchtpunkte sollen APA102 Leds machen. cdn.sparkfun.com/datasheets/Components/LED/APA102C.pdf
Der ganz grobe Ablauf: In einem Bildspeicher steht der Text drin 12x16er font, also ein Byte für die oberen 8 der 16 Leds, ein byte für die unteren 8 der 16 Leds, die übereinander angeordnet sind. Die Anzahl der bytes im Bildspeicher entspricht der Spaltenanzahl, die in einem Schwenk angezeigt werden kann. Um einen Buchstaben anzuzeigen werden also nacheinander 24 bytes des Bildspeichers in Leuchtpunkte umgesetzt. Ich finde das jetzt schwierig zu beschreiben, wenn Fragen auftauchen, nachhaken!
Gut. Für die Ansteuerung einer APA102 sind 4 bytes notwendig, die durch die Led 'durchgeschoben werden, ähnlich wie bei den WS2812 Leds.
APA102-bytes.PNG
Im 'Global' steckt die Helligkeit, die ist bei mir max=&B11111, sodass das erste byte immer &HFF ist. Bei den Farben sollen bei mir auch nur die hellsten, also &HFF oder &F00 drin stehen.
In welcher Farbe ein Text dargestellt wird, ist in einem Farbspeicher abgelegt, der für jede Spalte des Bildspeichers ein byte enthält. Ist dessen byte.0=1 gesetzt, wird die Spalte in rot dargestellt, byte.1=1 in grün, byte.2=1 in blau und daraus folgt für byte=3 eine Darstellung in gelb (rot+grün gleichzeitig). 7 Farben + schwarz sind so möglich.
Ich nähere mich der Fragestellung. Um eine Spalte jetzt zum Leuchten zu bringen, sehe ich im Farbspeicher unter der Spaltennummer nach und weiß, welches bytes der Farbbytes der Leds &HFF enthalten muss, wenn diese gemäß dem Bildspeicher zu leuchten hat.
Jetzt die Frage, wie komme ich am einfachsten von dem bit, was über Leuchten/Nichtleuchten entscheidet zu dem byte &HFF/&F00, das ich an die Led sende. Momentan bin ich soweit:
BASCOM-Quellcode
- Anzeige: 'laden und anzeigen einer Spalte
- '19.Led
- Ausgabe(6) = Farbe_19(3)
- Ausgabe(7) = Farbe_19(2)
- Ausgabe(8) = Farbe_19(1)
- '18.Led
- Ausgabe(10) = Farbe_18(3)
- Ausgabe(11) = Farbe_18(2)
- Ausgabe(12) = Farbe_18(1)
- Bild = Bildspeicher_high(speicher_spalte)
- R = Spalten_farbe(speicher_spalte).0 * 255 : G = Spalten_farbe(speicher_spalte).1 * 255 : B = Spalten_farbe(speicher_spalte).2 * 255
- '17.Led
- Bi = Bild.7
- Ausgabe(14) = B * Bi
- Ausgabe(15) = G * Bi
- Ausgabe(16) = R * Bi
- '16.Led
- Bi = Bild.6
- Ausgabe(18) = B * Bi
- Ausgabe(19) = G * Bi
- Ausgabe(20) = R * Bi
- '15.Led
- Bi = Bild.5
- Ausgabe(22) = B * Bi
- Ausgabe(23) = G * Bi
- Ausgabe(24) = R * Bi
- '14.Led
- Bi = Bild.4
- Ausgabe(26) = B * Bi
- Ausgabe(27) = G * Bi
- Ausgabe(28) = R * Bi
- '13.Led
- Bi = Bild.3
- Ausgabe(30) = B * Bi
- Ausgabe(31) = G * Bi
- Ausgabe(32) = R * Bi
- '12.Led
- Bi = Bild.2
- Ausgabe(34) = B * Bi
- Ausgabe(35) = G * Bi
- Ausgabe(36) = R * Bi
- '11.Led
- Bi = Bild.1
- Ausgabe(38) = B * Bi
- Ausgabe(39) = G * Bi
- Ausgabe(40) = R * Bi
- '10.Led
- Bi = Bild.0
- Ausgabe(42) = B * Bi
- Ausgabe(43) = G * Bi
- Ausgabe(44) = R * Bi
- Bild = Bildspeicher_low(speicher_spalte)
- '09.Led
- Bi = Bild.7
- Ausgabe(46) = B * Bi
- Ausgabe(47) = G * Bi
- Ausgabe(48) = R * Bi
- '08.Led
- Bi = Bild.6
- Ausgabe(50) = B * Bi
- Ausgabe(51) = G * Bi
- Ausgabe(52) = R * Bi
- '07.Led
- Bi = Bild.5
- Ausgabe(54) = B * Bi
- Ausgabe(55) = G * Bi
- Ausgabe(56) = R * Bi
- '06.Led
- Bi = Bild.4
- Ausgabe(58) = B * Bi
- Ausgabe(59) = G * Bi
- Ausgabe(60) = R * Bi
- '05.Led
- Bi = Bild.3
- Ausgabe(62) = B * Bi
- Ausgabe(63) = G * Bi
- Ausgabe(64) = R * Bi
- '04.Led
- Bi = Bild.2
- Ausgabe(66) = B * Bi
- Ausgabe(67) = G * Bi
- Ausgabe(68) = R * Bi
- '03.Led
- Bi = Bild.1
- Ausgabe(70) = B * Bi
- Ausgabe(71) = G * Bi
- Ausgabe(72) = R * Bi
- '02.Led
- Bi = Bild.0
- Ausgabe(74) = B * Bi
- Ausgabe(75) = G * Bi
- Ausgabe(76) = R * Bi
- '01.Led
- Ausgabe(78) = Farbe_1(3)
- Ausgabe(79) = Farbe_1(2)
- Ausgabe(80) = Farbe_1(1)
- Spiout Ausgabe(1) , 84 'bytes werden an die Leds gesendet
- Incr Speicher_spalte
- If Speicher_spalte > Spalten_schwenk Then
- Speicher_spalte = Spalten_schwenk 'max Spalten des Bildspeichers werden angezeigt
- Comp = 0
- End If
- ' Comp = Comp + 1_sp
- ' Compare1a = Comp 'nächster compare-Wert
- Return
Ihr seht, um von einem bit aus dem Bildspeicher zu einem byte für die Ausgabe zu kommen, multipliziere ich mit 255. Das braucht mächtig Zeit. Wäre vielleicht hier nicht das Problem, aber schön schaut sowas nicht aus, eher dilettantisch. Wie könnte man es schöner/besser machen?
Raum für Notizen
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------