Falls es noch jemand interessiert: Ich habe jetzt in der Ausgabe alle (!) Delays raus genommen und das Display funktioniert immer noch problemlos. Betrieben wird das Teil mit einem Mega644@20MHz (wegen der 5V). Der komplette Refresh (288 Byte) dauert 9.5ms.
Das Display wurde mithilfe des Grafiktreibers (LCDGraphic) eingebunden, jedoch funktioniert der normale gDispRefresh nicht.
Die Datenübertragung hab ich ja oben schon gezeigt, der komplette Refresh sieht so aus:
Code
Const
Matrix : Array[0..23] of Integer =
( 0, 12, 1, 13, 24, 36, 25, 37,
48, 60, 49, 61, 72, 84, 73, 85,
96,108, 97,109,120,132,121,133);
Procedure chDispRefresh;
Var QC : Byte; // Quadranten-Counter
BC : Byte; // Block-Counter
Index : Integer; // GraphColArr-Index
IC : Integer; // Index-Versatz im Quadrant
Begin
For QC:=0 to 3 do
Case QC of // 4 Quadranten
0:Adr0:=0; Adr1:=0; IC:= 0;|
1:Adr0:=1; Adr1:=0; IC:=144;|
2:Adr0:=0; Adr1:=1; IC:= 2;|
3:Adr0:=1; Adr1:=1; IC:=146;|
EndCase;
For BC:=0 to 23 do
Index:=Matrix[BC]+IC;
If Even(BC)
then
SPI3K(GraphColArr[Index],
GraphColArr[Index+4],
GraphColArr[Index+8]);
else
SPI3K(Mirror8(GraphColArr[Index]),
Mirror8(GraphColArr[Index+4]),
Mirror8(GraphColArr[Index+8]));
EndIf;
EndFor;
EndFor;
Latch:=1;
Latch:=0;
End chDispRefresh;
Größe 32x24 RGB-Pixel. Ich habe ein Display mit 96x24 definiert, wobei X:0-31 für rot, 32-63 für grün und 64-95 für blau ist. D.h. wenn ich ein violettes Quadrat mit 32x24 Pixel zeichnen will, muß ich 2 Quadrate mit gDrawRect(0,0,31,23,$FF) und gDrawRect(0+64,0,31+64,23,$FF) zeichnen.
Ich habs mit der Definition von 3 ViewPorts (je einen für rot, grün und blau) versucht, aber da hat sich das ganze seltsam verhalten. Nicht die Ausgabe aufs Display, sondern die Zeichenfunktionen. Vielleicht kann mich ja einer erhellen?
Grob sah das so aus:
Code
Define
LCDGraphic = 96, 24, 8; { x-pix, y-pix, accesswidth }
LCDgraphMode = readonly, iData;
DefCharSet = 'Graphchars.pchr';
GViewports = 4, iData; { logical ViewPorts, scalings }
...
gOpenView(1, 0,0,31,23);
gOpenView(2,32,0,63,23);
gOpenView(3,64,0,95,23);
...
gSwitchView(1);
gDrawRect(0,0,31,23,$FF);
gSwitchView(2);
gDrawRect(0,0,31,23,$FF);
gSwitchView(3);
gDrawRect(0,0,31,23,$FF);
Mein Gedanke war, daß wenn ich den ViewPort umschalte, kann ich mit normalen Koordinaten X:0..31 und Y:0..23 arbeiten, jedoch wurde das ganze Bild gestaucht und verzogen. Muß man zwingend auch gScaleView machen?
Gruss
Harry
PS.: Diese Module nennen sich anscheinend
Lighthouse-Module und waren bei Shows/TV/Bühnentechnik im Einsatz und haben wohl auch schon ein paar Jahre aufm Buckel. Ich habe meines hier via PWM (Auflösung 100 Punkte) gedimmt und betreibe es hier mit einem PWM-Wert von 1-2. Bei 20 oder größer ist die Helligkeit nicht auszuhalten
. Das zugehörige Netzteil ist für 3 Module ausgelegt und liefert 5V/50A!
Hab jetzt auf Hardware-PWM umgestellt mit 8Bit Auflösung
. Jetzt sieht man beim hell/dunkel stellen keinerlei flackern mehr. Frequenz (gemessen) 305Hz.
PS, die 2.: Auch mit einem XMega @ 64MHz läuft das Modul ohne Delays. Pegelanpassung 5V mit 2 74ABT245. Hab jetzt 3 Module zu einem 32x72-Pixel-RGB-LED-Display zusammen geschaltet. Das definierte Grafikdisplay hat 96x72 Pixel und wie gehabt ist X(0..31) rot, X(32..63) grün und X(64..95) blau. Muß mal schaun, ob ich das mit den ViewPorts noch hin bekomme.