Moin,moin!
Die SD-Fkt. fopen/fseek funktionieren .
Die "Direction" des LCD (wahrscheinlich im *.h --wobei * hier LCD/GLCD
o.ä.) muss um 90grad gedreht werden.
Dann ist es noch gespiegelt. Dazu muss ich die *.init sehen in der *.c;
Der Typ des Display-Controller ist ebenfalls nötig --
hab ich auch schon Probiert mit dem gleichen ergebniss,
das Bild wird angezeigt mit streifen im bild drin
egal ob ich RGB565CONVERT() oder RGB888ToRGB565() es bleiben immer die
seltsamen streifen hier im bild 1
Beitrag "Re: STM32 24Bit Bmp nach 565RGB Format"
Steht das wirklich so in deinem Code?
f_read(&fsrc, buffer, (bmp.pic_w_l)*3, &br);
f_read(&fsrc, buffer, (bmp.pic_w_l), &br);
Mit dem zweiten f_read bügelst du über buffer drüber.
holger schrieb:> Steht das wirklich so in deinem Code?>> f_read(&fsrc, buffer, (bmp.pic_w_l)*3, &br);> f_read(&fsrc, buffer, (bmp.pic_w_l), &br);>> Mit dem zweiten f_read bügelst du über buffer drüber.
hatte ich wohl vergessen auszuklammern
So ists bei mir
-nach dem ebay-Bild steht da HY32D und google ergibt
http://www.hotmcu.com/32-touch-screen-tft-lcd-with-16-bit-parallel-interface-p-36.html
ein ILI9320 LCD-Controller;
jetzt in LCD_Init nach DeviceCode==0x9320 gesucht und
LCD_WriteReg(0x60,0x2700); /* Driver Output Control */
in
LCD_WriteReg(0x60,0xA700); /* Driver Output Control */
umgewandelt;
-probier mal !
vampire schrieb:> andreas schrieb:>> das Bild wird angezeigt mit streifen im bild drin>> zieh mal die Schutzfolie ab!
Hab ich gemacht es bleiben aber weiterhin die Strifen im Display
woran kann das denn nur liegen wenn ich die Original aplikation drauf
lade
sind keine Fehlstellen auf dem display
hallo,
Der Display controller ist ein SSD1289 Das Display sebst ist ein HY32C
Egal was ich ein stelle bei der #define DISP_ORIENTATION 0
bekomme ich das Display sebst nicht gedreht es bleibt immer in der
240x320 Position
DeviceCode = LCD_ReadReg(0x0000); /* ¶ÁÈ¡ÆÁID */
if(DeviceCode==0x9325 || DeviceCode==0x9328) /* ²»Í¬ÆÁÇý¶¯IC
³õÊŒ»¯²»Í¬ */
{
und
else if(DeviceCode==0x8989)
{
-- ich habe auchnoch ein SSD1289(sainsmart) auf meinem Board(Selbstbau);
Dies kann man aber nicht auslesen !!!
Daher hab ich LCD_ReadReg(0x0000) ausgeklammert.Würde ich Dir auch
empfehlen, denn dein Display ist doch fest verbaut(Kein Steckplatz?)
-obiges ausklammern(und die schliessenden Klammern)
Sowie die anderen Display-init raus;
Der Unterschied im Init-Ablauf ist wohl nur dies Register
-bei Dir:
LCD_WriteReg(0x0007,0x0133); LCD_Delay(5);
-bei mir:
LCD_WriteReg(0x0007,0x0233); delay_ms(1);
Ohne das gesammte Projekt vor mir zu haben, ist dies alles aber nur ein
planloses "Rumgestochere" --
andreas schrieb:> Hab ich gemacht es bleiben aber weiterhin die Strifen im Display> woran kann das denn nur liegen wenn ich die Original aplikation drauf> lade> sind keine Fehlstellen auf dem display
In deinem Bild sieht man recht deutlich, dass zb in dem grünen Blatt
rote Punkte enthalten sind.
Für mich sieht das danach aus, dass deine Bitkodierung hier
LCD_SetPoint(point.y,point.x ,RGB888ToRGB565(point.r,point.g,point.b));
nicht stimmt.
An deiner Stelle würde ich mir erst mal klar machen, und auch
ausprobieren, wie die Bits sein müssen. An welcher Stelle die einzelnen
Farbbits sitzen und wie sie gegeneinander im int verschoben sind.
Irgendwas geht da in deinen Funtionen / Makros schief, bzw. ist nicht
richtig.
Mit einem Bild eines Papagei kriegst du das aber nicht raus. Das muss
man systematisch mit Farbverläufen angehen. Sonst dauert das alles 5 mal
so lange als notwendig. Also nicht einfach nur ein Bild da drauf
klatschen, sondern
for( red = 0; red < 255; red ++)
Pixel mit RGB888ToRGB565( red, 0, 0 ) ausgeben
Das muss einen roten Farbkeil ergeben, andere Farbpixel dürfen nicht zu
sehen sein. Wenn doch: nachgehen in welchen red-WErten sie auftreten,
nachvollziehen wie RGB888ToRGB565 das in die 5 Pixel reinverschiebt und
mit dem Datenblatt vergleichen, ob das so richtig ist.
Selbiges mit den anderen Farben.
Damit kommt man dem recht schnell auf die Spur, wo welche Bits falsch
verschoben werden und an der falschen Stelle im 565-Ergebnis rauskommen.
Aus dem sichtbaren Bild und der Position der Pixel kannst du dann mehr
oder weniger die komplette Berechnungskette nachvollziehen.
Aber indem du ein Photo auf das Display klatscht, siehst genau gar
nichts, ausser das das Bild komisch aussieht. Fehlersuche beginnt immer
damit, dass man sich einen einfachen Testfall konstruiert, mit dem man
nachvollziehbar und immer gleich den ganzen Prozess von vorne bis hinten
systematisch durchleuchten kann. Je einfacher diese Test ist (auch in
den Zahlenwerten), desto besser. Ein fertiges Photo hat viel zu viel
"Unruhe" und "Unsystematik" in den Zahlenwerten, um für die Fehlersuche
auf unterster Bit-Ebene nützlich zu sein.
Hallo,
Ich habe noch ein Problem mit dem anzeigen vom BMPs aus
dem internen Flash.
Leider wird das pic nicht geladen
Vielleicht könnte mir da einer weiterhelfen.
Aufruf zum anzeigen:
LCD_DrawPicture(0,0,20,20, "RButtonA") ;
MFG
Hallo,
Beim auslesen der Bitmaps von sd karte dind erstmal die streifen im Bild
weg.
Allerdings wird das bild nur in blau und schwarztöne wiedergegeben.
Vielleicht könnte mir jemand weiterhelfen
mfg
>Ich habe noch ein Problem mit dem anzeigen vom BMPs aus>dem internen Flash.>Aufruf zum anzeigen:>LCD_DrawPicture(0,0,20,20, "RButtonA") ;
Wirklich sehr lustig. Du hast keine Ahnung von C.
Dein Flash kennt keine Dateien.
So wird da vieleicht ein Bild draus
LCD_DrawPicture(0,0,20,20, RButtonA);
Hast du mal auch nur einen Blick auf die Warnungen vom Compiler
geworfen?
So wenn ich die Bild grösse auf 100x100 Pixel setze dann stimmen alle
Farben
mit RGB888ToRGB565 .
An was kann denn die nur liegen das bmps gösser 100x100 nicht richtig
dargestellt werden
Hast du mal versucht, die Bildgröße punktweise zu ändern? Also 101, 102
etc.? Möglicherweise hat die Funktion ein Problem mit nicht durch 4/8/16
whatever teilbaren Abmessungen.
Hi andreas,
-bei BMP Files werden die Anzahl der Bytes pro Zeile
immer auf ein vielfaches von 4 "aufgerundet"
(es werden 0 bis 3 Füllbytes mit 0x00 eingefügt)
d.h wenn du ein Bild mit der X-Auflösung von z.B. 5 Pixel hast,
werden pro Zeile 16 Bytes gespeichert
5*3 Bytes für die Farbinformation der 5 Pixel = (15 Bytes)
1 Fülllbytes (mit 0x00)
bei einer Breite von 7 Pixel werden 24 Bytes gespeichert :
7*3 Bytes für die Farbinformation der 7 Pixel = (21 Bytes)
3 Fülllbytes (mit 0x00)
wahrscheinlich kommt daher dein Problem
ein Bild mit der Breite von 100 Pixel
besitzt keine Füllbytes (weil 100/4 ohne Rest teilbar ist)
Gruss Uwe
Hallo,
Wenn meine Auflösung bei 320 Pixel liegt ,dann hab ich doch gar kein
Rest wenn ich 320:4 = 80
oder liege ich da falsch.
Anbei noch 2 Pics.
display = so wirds auf dem Display angezeigt
orginal = so sollte es sein
mfg
> f_read(&fsrc, &buffer[0], (bmp.pic_w_l)*3, &br);
Wie gross ist buffer eigentlich?
Du liest da ja scheinbar eine komplette Zeile.
320 x 3 = 960 Bytes.
Das ist eindeutig ein Problem mit der Länge einer Zeile, denn es gibt
ein typisches, konstantes Treppenmuster, welches auftritt, wenn der
LCD-Controller die Daten mit einer anderen Zeilenlänge liest als sie im
Speicher stehen. Ergo schreibt jemand die Daten mit der falschen
Zeilenlänge in den Framebuffer.
>char buffer[1024];
Ok, reicht.
Wo ist dein kompletter Sourcecode?
Poste auch mal die Bitmapdatei.
Am weissen Balken sieht man eigentlich schon das
irgendwie ein Offset in der Reihenfolge der RGB Bytes ist.
Die kleinen Ausfransungen am Rand.
Hm, ich rate mal. Das Bild hat bei 320 Pixel Breite 5 Streifen, macht 64
Pixel / Streifen. Die Farben sind rot-blau-grün-weis-schwarz. Wenn man
genau hinsieht, gibt es einige Zeilen, wo das passt. In der nächsten
Zeile ist Blau plötzlich um 1/3 verkürzt. 1/3 von 64 Pixel sind ~21
Pixel.
Eine Zeile in 565 Kodierung hat 640 Byte, in 888 960 Byte
Ein Streifen also in 555 128 Byte bzw. in 888 192.
1/3 Streifen sind somit ~ 42 Byte, in 888 64.
Scheinbar werden pro Zeile 42 Bytes zu wenig geschrieben. ODER der
Controller ist intern auf eine größere Zeilenlänge programmiert, nur
dass nicht alles angezeigt wird. Dann muss ein Schreibroutone die
größere, virtuelle Zeilenlänge bei der Berechung der Anfangsadresse der
nächsten Zeile berücksichtigen.
holger schrieb:>>Das Bitmap ist auf der sd-Card gespeichert>> Dann schick mir deine SD Karte.
Ich lach mich schlapp. Mir wäre das schon lange zuviel wenn Ratschläge
permanent ignoriert werden...
>so bitte
Danke Andreas. Noch mal Entschuldigung für den rauhen Ton.
Dein Problem ist schon etwas komisch.
In deinem Foto sieht man das jede Zeile mit einem weissen Pixel anfängt.
Genau so wie in der Bitmap. Das spricht gegen einen Offset wie ich oder
auch Falk vermutet haben.
In der obersten Zeile passen die weissen Pixel auch noch.
Sie gehen über den (eigentlich) roten Balken.
Und dann wird es merkwürdig. Rot geht noch so, blau ist nicht wirklich
blau
sondern grün und grün passt gar nicht mehr so richtig und ist eher
braun.
Dann kommen noch die merkwürdigen Farbtreppen dazu. Sowas kommt
eigentlich
von einem falschen Offset beim schreiben der RGB Daten oder falcher
Einstellung des Displays.
Letzter Versuch:
Schreib deine Routine mal um:
Moment mal:
point.x = ty; //holger wieso eigentlich x zu y?
point.y = tx; //holger wieso eigentlich y zu x?
andreas schrieb:> Wenn meine Auflösung bei 320 Pixel liegt ,dann hab ich doch gar kein> Rest wenn ich 320:4 = 80
es kommt nicht auf die Breite von deinem Display an,
sondern auf die Breite von den BMP-Bild
hat das auch eine Breite von 320 Pixel ?
hier die Beschreibung aus der WIKI vom BMP-Format :
"Jede Bildzeile ist durch rechtsseitiges Auffüllen mit Nullen auf ein
ganzzahliges Vielfaches von 4 Bytes ausgerichtet. "
Gruss Uwe
statt dein Bild in der lcd.h zu drehen, hast Du den Cursor gedreht.
if(DeviceCode==0x8989)
{
LCD_WriteReg(0x004e,Ypos); /* Line */
LCD_WriteReg(0x004f,0x13f-Xpos); /* Row */
}
in LCD_SetCursor(uint16_t Xpos,uint16_t Ypos);
-deine Fkt. LCD_DrawPicture und LCD_SetPoint schreiben nun eine
Bildzeile (320 Pix ) auf 240 -->
dadurch die Artefarkte;
>"Jede Bildzeile ist durch rechtsseitiges Auffüllen mit Nullen auf ein>ganzzahliges Vielfaches von 4 Bytes ausgerichtet. "
Ok. dann sollte es eher so sein:
f_read(&fsrc, &buffer[0], (((bmp.pic_w_l)*3+3)/4)*4, &br);
Das alleine ändert aber nichts an Deinem Problem.
>statt dein Bild in der lcd.h zu drehen, hast Du den Cursor gedreht.
Was passiert denn, wenn Du's wieder änderst auf:
point.x = tx;
point.y = ty;
?
Hallo,
ich hatte ein ähnliches Problem allerdings mit einem AVR32.
Hier hatte ich das Endian vertauscht. Das tauscht bei 888 nur die
Farbenreihenfolge, bei 565 wirft es die Farben aber durcheinander. Ich
kenn jetzt den STM32 nicht, weiß auch nicht welches Endiansystem er
verwendet.
Außerdem hatte ich ähnliche Fehler da das Display hardwaretechnisch auf
18 bit codiert und meine Ausgabe mit dem Displaycontroller auf 24bit.
(Wie als wenn ein LVDS Kanal fehlt).
Ist die Front und Back Porch des Displays korrekt eingestellt oder ist
das dort fest eingegossen?
4 Byte Padding beim Bitmap lesen? Der BMP Header erscheint mir außerdem
etwas lang: sicher, dass dieser so in der Datei vorhanden ist? evtl. mal
mit Hex Editor reinschauen.
Außerdem stellt sich mir die Frage, warum die Bilder nicht direkt im 565
Format gespeichert werden. Das erhöht die Performance doch gewaltig.
Gruß
Phil
Wenn Du nicht weiterkommst, dann ersetzte mal
LCD_SetPoint(point.x+ point_x ,point.y + point_y
,RGB888ToRGB565(point.r,point.g,point.b));
durch
LCD_SetPoint(point.x+ point_x ,point.y + point_y
,RGB888ToRGB565(ty,0,0));
und später durch
LCD_SetPoint(point.x+ point_x ,point.y + point_y ,ty);
Hast Du dann einen gleichmäßigen Farbverlauf ? Oder sind die Striche
immer noch drin ?
SummerWilli schrieb:> Wenn Du nicht weiterkommst, dann ersetzte mal> LCD_SetPoint(point.x+ point_x ,point.y + point_y> ,RGB888ToRGB565(point.r,point.g,point.b));> durch> LCD_SetPoint(point.x+ point_x ,point.y + point_y> ,RGB888ToRGB565(ty,0,0));> und später durch> LCD_SetPoint(point.x+ point_x ,point.y + point_y ,ty);>> Hast Du dann einen gleichmäßigen Farbverlauf ? Oder sind die Striche> immer noch drin ?
Hiermit sind keine striche mehr drin
mfg
hiermit werd die BMP's bis 168x320 ohne Streifen angezeigt
es liegt denn an dieser Zeile
Das Funktioniert mit BMP's 168x320
f_read(&fsrc, &buffer, (((bmp.pic_w_l)*3+3)/4)*4, &br);
bmp.pic_w_l=168
168*3+3/4*4 = 507
Wie kann ich das umrechnen damit das auch mit 240x320
geht
...hier hast du mal dein testbild als C-source uint16 array landscape
korrekt im RGB565 format.
das sollte richtig angezeigt werden, wenn das address-window vorher
korrekt gesetzt ist auf 320x240, die orientierung stimmt und die
RGB-reihenfolge des display-controllers richtig konfiguriert wurde.
wenn du geschafft hast, dieses bild anzuzeigen kanst du ja mit eigener
888->565 konvertierung und filezugriff weitermachen, schritt für
schritt.
gutt lack, tom.
nun, auch ein (zugegeben unschöner) weg zur finalen lösung eines
scheinbaren, wohl eher trolligem, problems.
ick hau mich wech, so ist meine gut gemeinte hilfe doch noch etwas wert
;o)))).
meine oma hat immer gesagt: "Junge, wenn die Dummen fleissig werden,
dann wird es gefährlich !".
Eine Bitte an die Mods, bitte diesen thread löschen.
Danke + Gute Nacht an alle hilfsbereiten und engagierten Leute hier !
tom.
tom schrieb:> nun, auch ein (zugegeben unschöner) weg zur finalen lösung eines> scheinbaren, wohl eher trolligem, problems.> ick hau mich wech, so ist meine gut gemeinte hilfe doch noch etwas wert> ;o)))).>> meine oma hat immer gesagt: "Junge, wenn die Dummen fleissig werden,> dann wird es gefährlich !".>> Eine Bitte an die Mods, bitte diesen thread löschen.>> Danke + Gute Nacht an alle hilfsbereiten und engagierten Leute hier !>> tom.
Sorry das gefragt habe.
so das Anzeigen des BMP von
Beitrag "Re: STM32 24Bit Bmp nach 565RGB Format" Funktioniert
Tadellos nur bleibt immer noch das Problem
dasbeim Lesen von sd card immer diese streifen im Bild sind
andreas schrieb:> so das Anzeigen des BMP von> Beitrag "Re: STM32 24Bit Bmp nach 565RGB Format" Funktioniert> Tadellos nur bleibt immer noch das Problem> dasbeim Lesen von sd card immer diese streifen im Bild sind
Mit dem gleichen Problem kämpfe ich auch gerade.
Im Prinzip ist der von Andreas verwendete Code eine Variante von in
Chan's TJpgDec-Beispielprojekt enthaltenen load_bmp(); . Anders als die
ST-Beispiele läuft das richtig fix und ist besser strukturiert. Wenn
dieser Bug nicht wäre...
Mit einem einfarbigen Testbild sieht man sehr deutlich das manchmal
falsch gelesen wird. Die Anzahl der Streifen kann man drastisch
reduzieren wenn man buffer nennenswert erhöht. Hab ein externes 1MB SRAM
on board und in reinem Übermut mal buffer[524288] probiert - nun sind
nur noch 2-3 Streifen bei einem 800x480 großen Bitmap. Also bei jedem
Nachladen von buffer.
Eine andere Vermutung wäre ein nicht an DWORD ausgerichteter Zugriff von
buffer im SDIO Interface. Ist es aber nicht der Fall, habs überprüft.
Hat noch jemand dieses Problem?
Hi Torsten,
ich hab meine BMP-Funktionen nicht bis zum excess getestet
und auch eine Bildgrössen Begrenzung von 240x320 Pixel eingebaut
(weil mein Display nicht grösser ist)
aber Streifen hatte ich nie im Bild, wenn du willst,
schau doch mal den Code an und kopier dir die Teile raus
die du brauchst
das laden von einem 320x240 Bild mit 24bpp von SD-Karte dauert ca. 165ms
(ob das jetzt schnell oder langsam ist, musst du entscheiden)
Quellen gibt es hier :
http://mikrocontroller.bplaced.de
Hi Uwe,
Danke für den Hinweis, diese lib schaue ich mir gleich mal genauer an.
[OT]
Schade das Du meinen Bugreport fürs SDIO (Lib 13) noch nicht
berücksichtigt hast - es sind wirklich nur ne handvoll Zeilen die
eingepflegt werden müssen um Datenmüll auf der SD-Karte zu vermeiden.
Hi Torsten,
Also die SD-Card ist bei mir am SDIO-Interface angeschlossen, ich hab
damals das Beispiel
Verwendet was auf der CD zu dem Board dabei war funktionierte nur leider
nich Richtig.
Hab jetz eine andere Lib damit gehts wunderbar bis800x480.
Jetzt gehts.
Es lag doch am SDIO.
Und zwar am nicht richtig ausgerichteten Puffer den die DMA überhaupt
nicht leiden kann und dann stillschweigend die Bytes verwürfelt.
Das bedeutet, der von Andreas anfänglich gepostete Code sollte ohne
Änderungen funktionieren wenn man Anpassungen am SDIO vornimmt. Der von
ChaN tuts bei mir jetzt exzellent.
Die Sachen findet man bei ST im
"STM32F2-F4_Demonstration_Builder_V1.3.0". Die interressante Datei hab
ich einfach mal angehangen. Dort kann man sehen, was für ein riesen
Aufwand getrieben wird beim lesen/schreiben.