Zu doof zum Bits verschieben? [Gelöst!]
Moin.
Bin gerade dabei, ein Handy-Display an nem AVR zum laufen zu kriegen. Geht soweit auch fast.
Um ein Pixel darzustellen, werden 2 Byte = 16 Bit benötigt, wobei die Anzahl der Bits pro Farbe Rot:Grün:Blau = 5:6:5 ist.
Da die Eingabewerte aus dem 3-Byte-System kommen (also pro Farbe 0-255), habe ich eine Funktion, die die Werte entsprechend anpassen soll:
R, G1, G2, B1, ColorData1, ColorData2 jeweils Byte; SendData = Funktion zur Ausgabe der Daten.
Dabei soll das erste Byte (ColorData1) aus den 5 höherwertigsten roten Bits und den 3 höherwertigsten grünen Bits bestehen.
Das zweite Byte (ColorData2) soll aus den Grünbits 4-6 sowie den höherwertigsten blauen Bits bestehen.
Bei einem Testbild klappen die Farben Rot (Setpixel 255,0,0), Gelb (Setpixel 255,255,0) und grün (Setpixel 0,255,0) problemlos.
Nur blau geht irgendwo verloren. Wenn ich mit Setpixel 0,0,255 blau erzeugen möchte, erscheint der Bereich schwarz; gleiches mit weiss (255,255,255): erscheint als gelb.
Code:
Sub SETPIXEL(RED AS BYTE , GREEN AS BYTE , BLUE AS BYTE)
If ColorMode = MODE_16Bit Then
R = RED AND &b11111000
G1 = GREEN AND &B11100000
G2 = GREEN AND &B00000111
B1 = BLUE AND &B11111000
SHIFT G1 , right , 5
SHIFT G2 , left , 5
SHIFT B1 , right , 3
ColorData1 = R OR G1
ColorData2 = G2 OR B1
SendData ColorData1
SendData ColorData2
EndIf
End Sub
Schreibe ich statt "SendData ColorData2" gleich "SendData &B00011111" (also alle Blaubits auf 1), dann wird korrekt ein blauer Bereich erzeugt.
In dem Codeteil muss also irgendwo die Information für Blau verlorengehen. Nur find ich nicht wo...
Sieht jemand den Fehler?
MfG
Bitschieberei / Umweg gefunden
Also lt. Simulator wurden die Parameter davor ja auch übergeben... aber lt. Hardware dann doch nicht. Wo genau da dann was veroren ging, wird sich wohl nie herausstellen.
Soweit ich das in Bascom kenn, sind logisches und bitweises Und der gleiche Befehl (AND), je nach Kontext.
"x = 8 AND 4" liefert x = 0; aber es geht auch "IF x>2 AND x<10"
Beim Shift isses auch so, dass da die Bits verschoben werden, wobei dass dann halt nicht nur bei Byte-Variablen sondern auch z.B. Word geht.
(Anders als bei "Rotate" gehen bei "Shift" die rausgeschobenen Bits verloren)
Naja mit der Technik gehts jetzt; was halt jetzt noch ansteht, ist ne Optimierung, da der Bildaufbau mit 6 sec doch noch etwas lang dauert.
Lt. Datenblatt kann der Controller nen Clock-Schaltabstand von 60ns, in Bascom kann ich aber nur bis 10µs runter, noch kürzere Abstände kann das Display dann doch nicht mehr.
Angenommen ich würde nun ohne Pausen die Ports nacheinander direkt setzen, und dazu würde man nur einen Takt brauchen, dann würde ein Takt bzw. Schaltvorgang bei 8 MHz nur 125 ns dauern, sollte also ohne Pausen auch ausreichen. Aber erst ab Pausen von 10µs reagiert das Display darauf. (Befehl waitus 10 bzw. Sprung in ne Sub mit ein paar NOP drin)