Forum: Mikrocontroller und Digitale Elektronik ILI9341 mit RGB-Interface rotieren


von Franco Reggolo (Gast)


Lesenswert?

Hallo zusammen,

ich soll die Firmware für ein Projekt mit einem STM32 und einem 320x240 
Display schreiben. Das Display hat einen ILI9341-Controller, der per 
RGB-Interface seine Pixeldaten bekommt.

Das funktioniert auch einwandfrei, wenn ich das Display hochkant (also 
240x320) konfiguriere. Aber im Projekt soll es Querformat (also 320x240) 
haben.

Jetzt kann ich zwar über MADCTL die Anzeige um 90° drehen, aber ich 
bekomm es nicht hin, dass der ILI9431 mehr als 240 Pixel pro Zeile 
annimmt. Ich sehe mit dem Oszi, dass ich 320 Pixel pro HSYNC sende, aber 
egal, was ich anstelle, der ILI9431 zeigt nur 240 davon an. Die 
restlichen 80 Pixel sind leer (weiß).

Wenn ich die Bildaten per SPI ins RAM des ILI9341 schreibe, kann ich das 
ganze Bild korrekt ausfüllen, nur per RGB-Interface geht es nicht. Es 
scheint fast, als würde der ILI9341 im RGB-Interface pro HSYNC nur 240 
Pixel akzeptieren und die restlichen einfach ignorieren.

Hat jemand Rat?

Danke und bleibt gesund

Mod: Titel korrigiert.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich habe mal den Titel korrigiert, Du hattest 3 und 4 in ILI9341 
vertauscht.

Zum Thema: Soviel ich weiß, geht das mit dem Rotate so nicht. Du musst 
das tatsächlich in Software machen. Das Problem: Du kannst die 
Schreibrichtung nicht ändern, die bleibt immer gleich.

Genau Deine Problembeschreibung hatte ich zufällig vor ein paar Tagen 
hier in einem älteren Forumsthread gelesen.

Ich glaube, es war dieser hier:

Beitrag "STM32F407 Black und No-Arduino"

Hier konnte "grundschueler" im Landscape-Format auch nur 240x240 
beschreiben. Kann aber auch sein, dass sein Problem gelöst wurde. So 
richtig klar geht das aus dem Thread nicht hervor.

Allerdings wurden ihm ein paar wichtige Tipps gegeben, was zu beachten 
ist.

: Bearbeitet durch Moderator
von Bernd (Gast)


Lesenswert?

Bei mir hat damals das hier funktionert:
1
// define width and height (depends on rotation)
2
#if ( ILI9341_ROTATE == 0) || ( ILI9341_ROTATE == 180)
3
    #define ILI9341_WIDTH 240
4
    #define ILI9341_HEIGHT 320
5
#endif
6
#if ( ILI9341_ROTATE == 90) || ( ILI9341_ROTATE == 270)
7
    #define ILI9341_WIDTH 320
8
    #define ILI9341_HEIGHT 240
9
#endif
10
11
...
12
13
    // change orientation
14
    // and set color order
15
    ili9341_command( MEMORY_ACCESS_CONTROL);
16
    #if ILI9341_ROTATE == 0
17
        ili9341_data( MEMORY_ACCESS_CONTROL_BGR | MEMORY_ACCESS_CONTROL_MX);
18
    #endif
19
    #if ILI9341_ROTATE == 90
20
        ili9341_data( MEMORY_ACCESS_CONTROL_BGR | MEMORY_ACCESS_CONTROL_MV);
21
    #endif
22
    #if ILI9341_ROTATE == 180
23
        ili9341_data( MEMORY_ACCESS_CONTROL_BGR | MEMORY_ACCESS_CONTROL_MY);
24
    #endif
25
    #if ILI9341_ROTATE == 270
26
        ili9341_data( MEMORY_ACCESS_CONTROL_BGR | MEMORY_ACCESS_CONTROL_MY | MEMORY_ACCESS_CONTROL_MX | MEMORY_ACCESS_CONTROL_MV);
27
    #endif

von Arduinoquäler (Gast)


Lesenswert?

Frank M. schrieb:
> Hier konnte "grundschueler" im Landscape-Format auch nur 240x240
> beschreiben.

Prinzipell geht das schon (mit SPI), aber der TO spricht ja vom
RGB Interface wo es nicht funktionieren soll.

Ich vermute jedoch dass seine SPI- und RGB- Implementierung nicht
ganz die gleiche ist.

von Franco Roggelo (Gast)


Lesenswert?

Frank M. schrieb:
> Ich habe mal den Titel korrigiert, Du hattest 3 und 4 in ILI9341
> vertauscht.

Oh, danke!

>
> Zum Thema: Soviel ich weiß, geht das mit dem Rotate so nicht. Du musst
> das tatsächlich in Software machen.

Hab ich jetzt auch gemacht, war einfacher als ich zuerst befürchtet 
hatte.

Ich habe noch das hier gefunden:
https://forum.littlevgl.com/t/littlevgl-stm32f429-ili9341-rotate-landscape-solved/1606

Hab's aber noch nicht näher angeschaut.

von Sascha P. (spy007)


Lesenswert?

Hallo, wenn das Thema auch schon älter ist, im Web taucht ständig die 
Frage auf, ob man den Display mit dem ILI9341 von Portrait (240x320) auf 
Landscape (320x240) umstellen kann.
Es bezieht sich allerdings auf das RGB Interface, welches mit 
Pixelclock, HSync, VSync und DE (data enable) arbeitet.
Die Antwort ist nein.
Bei der Seite, durch obigen Link, wird eine Auflösung von 320x320 
gefahren. Gut dann sind genügend Zeilen in der Ausgabe vorhanden und der 
Display ignoriert vermutlich die weiteren Pixel in der Zeile. Nur ist 
das halt unnötiger Speicher im Framebuffer.

Habe das alles ausprobiert um für mein eigens Projekt den besten Weg zu 
finden.
SPI ist viel zu langsam und beim 8080 16 Bit BUS Interface muss auf den 
Tearing Effekt geachtet werden. Die Lösung über einen Video Controller 
zu gehen ist meines Erachtens die beste. Gerade mit den STM32xxx 
Controller sollte das kein Problem sein. Dann kann man doch das Bild um 
90 Grad drehen per Software oder Video DMA.

Gruß Sascha

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sascha P. schrieb:
> Hallo, wenn das Thema auch schon älter ist, im Web taucht ständig die
> Frage auf, ob man den Display mit dem ILI9341 von Portrait (240x320) auf
> Landscape (320x240) umstellen kann.

Beim ILI9341 mit FSMC-Bus geht das, siehe 
https://www.mikrocontroller.net/articles/STECCY#Display bzw. 
https://www.mikrocontroller.net/wikifiles/8/88/Steccy-ili9341.png

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.