Forum: Mikrocontroller und Digitale Elektronik Display mit SSD1289 füllt nicht den gesamten Bereich


von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich habe hier ein 3.2Zoll TFT mit SSD1289 Controller.
Inzwischen habe ich diverse Initialisierungen im Internet gefunden uns 
ausprobiert.

Leider scheint irgendwo der Fehler zu sein.
Denn ich kann nie den Gesamten Displaybereich beschreiben.

Anbei ein Foto!

Hat jemand eine Idee, woran dies liegen könnte oder hatte jemand 
schonmal das selbe Problem?

Das Display wird mit 3.3V versorgt und hängt an einem STM32
Der Display Port ist 1:1 mit PortC verbunden.
Die Steuerleitungen sind anderweitig verteilt.

Mein Code ist ebenfalls im Anhang...

Hier noch jener Code-Teil mit welchem ich die Farben ausgebe:
1
LCD_ResetDevice();
2
3
  LCD_SetCursor(0,0);
4
  LCD_WriteCommand(0x22);
5
    while(1)
6
    {
7
      LCD_WriteData(0xE534);
8
    }

Mir ist bewusst, dass man normalerweise nach 240*320 Pixel stoppt.
Aber wenn nichtmal der gesammte bereich mit "while(1)" beschrieben wird,
dann stimmt ja was nicht.

von Purzel H. (hacky)


Lesenswert?

Das ganze Display hat entweder mehrere Chipselects, oder mehrere 
Adressen. Ich tippe auf letzteres. Steht im Datenblatt. Also nicht 
einfach planlos initialisierungen runterladen, sondern Datenblatt 
studieren. Das ganze Datenblatt vom Hersteller, nicht das abgespeckte 
von einem Trittbrettfahrer.

zB mehrere
  LCD_SetCursor();
und/oder mehrere
  LCD_WriteCommand();

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Danke für deinen Hinweis!
Anbei das Datenblatt!


Mir scheint es so, dass das GRAM durchgehend adressiert ist.

von Holger K. (holgerkraehe)


Lesenswert?

Ich habe jetzt die Verdrahtung 2 mal geprüft, ausgeläutet und optisch 
kontrolliert.

Es stimmt alles!

Ich habe den Code von hier getestet:
http://forum.arduino.cc/index.php?topic=183302.0

Ich habe das exakt identische Display!


Doch es funktioniert einfach nicht korrekt.

Wenn ich die Orientation ändere, dann wird der fehlende Balken 
beschrieben
dafür halt jener gegenüber nicht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Holger Krähenbühl schrieb:
> Anbei ein Foto!
Was sieht man darauf und was sollte man stattdessen sehen?

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

mein Display läuft schon eine Weile, von daher kenne ich inzwischen 
nicht mehr jedes Register - anbei mal mein Init, sollte aber soweit ich 
sehe auch mit deinem gehen.
1
  .dw  0x00 , 0x0001    ;Start Oscillation
2
  .dw  0x03 , 0x6664    ;A8A4    ;Power Contol
3
  .dw  0x0c , 0x0000
4
  .dw  0x0d , 0x080C
5
  .dw  0x0e , 0x2B00
6
  .dw  0x1e , 0x00B0
7
  .dw  0x01 , 0x2B3F    ;Driver output Control    2b3f
8
  .dw  0x02 , 0x0600
9
  .dw  0x10 , 0x0000
10
  .dw  0x11 , 0x6050    ;Entry Mode  6050
11
  .dw  0x05 , 0x0000    ;Compare register
12
  .dw  0x06 , 0x0001
13
  .dw  0x16 , 0xEF1C    ;Horizontal Porch
14
  .dw  0x17 , 0x0003    ;Vertical Porch
15
  .dw  0x07 , 0x0233    ;Display Control
16
  .dw  0x0b , 0x0000    ;Frame cycle control  5312
17
  .dw  0x0f , 0x0000    ;Gate Scan Position
18
  .dw  0x41 , 0x0000    ;Vertical scroll
19
  .dw  0x42 , 0x0000
20
  .dw  0x48 , 0x0000    ;Start Position screen driving
21
  .dw  0x49 , 0x013F    ;End Position  319
22
  .dw  0x4a , 0x0000
23
  .dw  0x4b , 0x0000
24
  .dw  0x44 , 0xEF00    ;Source Ramm adresse 239 to 0
25
  .dw  0x45 , 0x0000    ;Vertical Start
26
  .dw  0x46 , 0x013F    ;Vertical end
27
  .dw  0x30 , 0x0707    ;Gamma contol
28
  .dw  0x31 , 0x0204
29
  .dw  0x32 , 0x0204
30
  .dw  0x33 , 0x0502
31
  .dw  0x34 , 0x0507
32
  .dw  0x35 , 0x0204
33
  .dw  0x36 , 0x0204
34
  .dw  0x37 , 0x0502
35
  .dw  0x3a , 0x0302
36
  .dw  0x3b , 0x0302
37
  .dw  0x23 , 0x0000
38
  .dw  0x24 , 0x0000
39
  .dw  0x25 , 0x8000
40
  .dw  0x4f , 0x0000
41
  .dw  0x4e , 0x0000

Zum Füllen mal noch angemerkt - das Display lässt auch eine Einstellung 
des "Arbeitsbereichs" zu (0x44 & 0x46), so das Ausgaben in das 
Displayram auch nur auf den Bereich Auswirkung haben. (0xef00 & 0x013f) 
selektieren aber den kompletten Bereich.

Sascha

von Holger K. (holgerkraehe)


Lesenswert?

Lothar Miller schrieb:
> Holger Krähenbühl schrieb:
>> Anbei ein Foto!
> Was sieht man darauf und was sollte man stattdessen sehen?

Es sollte alles weiss sein.
Man sieht oben den nicht beschrieben Balken...

Weshalb dieser nicht beschrieben wird ist das Rätsel...

Sascha Weber schrieb:
> mein Display läuft schon eine Weile, von daher kenne ich inzwischen
> nicht mehr jedes Register - anbei mal mein Init,

Vielen Dank!

Habe ich mal übernommen. Leider das selbe ergebnis!
Nun ist einfach die Füllrichtung anderst. Aber der fehlende Balken 
bleibt.

Wie füllst du dein Display?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Holger Krähenbühl schrieb:
> Mir ist bewusst, dass man normalerweise nach 240*320 Pixel stoppt.
Und was passiert, wenn du, sagen wir mal nach einem viertel der Pixel 
stoppst? Oder nach der Hälfte?

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Lothar Miller schrieb:
> Und was passiert, wenn du, sagen wir mal nach einem viertel der Pixel
> stoppst? Oder nach der Hälfte?

Sehr merkwürdig...

Hier mein Code zum Bild:
1
void LCD_Address_Set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
2
{
3
  LCD_Write_Com_Data(0x0044,(x2<<8)+x1);
4
  LCD_Write_Com_Data(0x0045,y1);
5
  LCD_Write_Com_Data(0x0046,y2);
6
  LCD_Write_Com_Data(0x004e,x1);
7
  LCD_Write_Com_Data(0x004f,y1);
8
    LCD_Write_Com(0x0022);
9
10
}
11
12
13
14
15
  LCD_Address_Set(0,0,239,319);
16
17
  while(uiCounter != 500)
18
  {
19
    LCD_Write_Data(0x0000);
20
    uiCounter++;
21
  }
22
23
  uiCounter = 0;
24
25
  LCD_Address_Set(0,0,239,319);
26
  while(uiCounter != 500)
27
  {
28
    LCD_Write_Data(0xFFFF);
29
    uiCounter++;
30
  }
31
while(1);

Meiner Meinung nach, müsste auf dem Display 500Pixel erscheinen.
Zuerst in Weiss, dann dieselbe Fläche in schwarz.

Beim Durchsteppen fiel mir auf, dass ich zweimal
1
LCD_Write_Data(0xFFFF);
 senden muss, damit ein Pixel eingefärbt wird.

Zudem beginnt das Pixel bei der linken äussersten Spalte und wechselt 
dann
auf die rechte Spalte und füllt dann von rechts nach links auf.

Im Anhang ein Bild!

Die Initialisierung entspricht nun jener von Sascha welche hier zuvor 
gepostet wurde!

von Sascha W. (sascha-w)


Lesenswert?

Holger Krähenbühl schrieb:
> Wie füllst du dein Display?
320*240 (76800) mal den Farbwert ausgeben

zeig mal den Code deiner LCD_Write_Data

wie schnell läuft dein Controller?

Sascha

von Holger Krähenbühl (holgerkraehe) (Gast)


Lesenswert?

Sascha Weber schrieb:
> Holger Krähenbühl schrieb:
>> Wie füllst du dein Display?
> 320*240 (76800) mal den Farbwert ausgeben
>
> zeig mal den Code deiner LCD_Write_Data
>
> wie schnell läuft dein Controller?
>
> Sascha

Hallo Sascha
Leider habe ich den Code nicht mehr zur Hand.
Werde deisen morgen früh hier posten...

Danke für eure Unterstützung!

von Holger K. (holgerkraehe)


Lesenswert?

Guten Morgen zusammen

Der Controller läuft momentan mit 8MHz
Man kann beim Bildaufbau zusehen...


Hier nun der Code:
1
void LCD_Write_Com(int Data)
2
{
3
  Clr_Rs;
4
  Clr_Cs;
5
  GPIOC->ODR = Data;
6
  Clr_nWr;
7
  Set_nWr;
8
  Set_Cs;
9
}
10
11
void LCD_Write_Data(int Data)
12
{
13
  Set_Rs;
14
  Clr_Cs;
15
  GPIOC->ODR = Data;
16
  Clr_nWr;
17
  Set_nWr;
18
  Set_Cs;
19
}

von Holger K. (holgerkraehe)


Lesenswert?

Problem gelöst!!!

Sehr sehr ärgerlich!
Mein Board war falsch beschriftet...
Ich habe sehr wohl DB13 mit PC13 verbunden.
Die Verbindung konnte ich auch ausläuten...

Nur war der mit PC13 angeschriebene Pin nicht PC13 sondern VBAT.
PC13 war nebendran.

Nun läuft das ganze wie gewünscht!!!

Vielen Dank :)

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.