Forum: Mikrocontroller und Digitale Elektronik Display-Probleme mit LPC2478


von Star K. (starkeeper)


Angehängte Dateien:

Lesenswert?

Hi,
ich versuche seit längerem eine selbst gemachte Platine mit einem 
LPC2478 in Betrieb zu nehmen. Auf der Platine sind ein externes DRAM, 
ein LVDS Transmitter und auf einer weiteren Platine sind ein LVDS 
Receiver plus ein TFT Display mit 480x272 Pixeln Auflösung.

Mein problem ist nun, dass ich auf dem Display kein vernünftiges Bild 
zustande kriege. Es sind immer nur Teile zu sehen, es sind Streifen im 
Bild und das Bild verändert sich mit der Zeit (siehe Bilder). Woran kann 
das liegen? Ist der Fehler eher in der Hardware oder der Software zu 
suchen?

Bei Bedarf würde ich noch mal meinen Code posten.

Das Display soll eigentlich mehrere bunte Streifen anzeigen, die sind ja 
auch Ansatzweise erkennbar. Aber die Farben stimmen überhaupt nicht.

von Omega G. (omega) Benutzerseite


Lesenswert?

Was sollte denn in dem Bild korrekterweise angezeigt werden?

Ich habe ziemlich ähnliche Hardware in Betrieb, ich hoffe ich kann dir 
helfen. Zeig doch mal deine Initialisierung des Displaycontrollers.

Dein Problem sieht auf den ersten Blick eher nach einem Hardwareproblem 
aus, evtl. macht ein LVDS Pin kein Kontakt, oder aber du hast bei der 
Initialisierung vergessen ein Pin dem Displaycontroller zuzuweisen.

von Star K. (starkeeper)


Lesenswert?

Öhm ja den Testcode hab ich glaube ich sogar aus einem deiner Posts :-)
Das sollen 8 Farbbalken sein in den Farben weiß, türkis, gelb, grün, 
lila, blau, rot und schwarz. Was als erstes Auffällt, ist dass die 
Farbbalken die man sieht, nicht die Reihenfolge haben wie sie sein 
sollte.

Hier mal der Code um die Balken zu zeichnen:
1
const u32 coltab[] = { 0x00FFFFFF, 0x0000FFFF, 0x00FFFF00, 0x0000FF00,
2
                       0x00FF00FF, 0x000000FF, 0x00FF0000, 0x00000000 };
3
4
...
5
// Farbbalken anzeigen
6
ptr = (u32 *)0xA0000000;
7
for(y = 0; y < 272; y++)
8
{
9
   for(x = 0; x < 480; x++)
10
   {
11
      *ptr = coltab[x/60];
12
      ptr++;
13
   }
14
}

Und hier der code um den LCD-Controller einzurichten:
1
void Lcd_Init(void)
2
{
3
   // Einschalten des LCD Controllers
4
   PCONP |= BIT(20);
5
   asm(" NOP");
6
7
   // LCD Controller für 24Bit TFT einrichten
8
   LCD_CTRL = 0x2A;  // TFT 24Bit, no grey scaler
9
   LCD_CFG  = 7;             // CCLK/8 = 9 Mhz
10
   LCD_POL  = (0x01 << 26)   // Bypass clock divider
11
           | ((480 - 1) << 16) // Clock per Line
12
           | (0x00 << 14)   // ENA aktiv low
13
           | (0x01 << 13)   // DATA falling edge
14
           | (0x01 << 12)   // HSYNC aktiv low
15
           | (0x01 << 11);  // VSYNC aktiv low
16
  LCD_TIMH = (1  << 24)     // Horizontal back porch (2)
17
           | (1  << 16)     // Horizontal front porch (2)
18
           | (40 << 8)      // Horizontal pulse width (41)
19
           | (((480 / 16) - 1) << 2);  // Pixels per Line
20
  LCD_TIMV = (2  << 24)     // Vertical back porch (3)
21
           | (2  << 16)     // Vertical front porch (3)
22
           | (10  << 10)     // Vertical pulse width (10)
23
           | (272 - 1);  // Vertical lines
24
  LCD_UPBASE = FRAMEBUF;
25
  LCD_LPBASE = 0;
26
  LCD_CTRL |= BIT(11) | BIT(0);
27
}

Das Display habe ich mit 24Bit angebunden, der Controller soll bei 27MHz 
laufen.

von Omega G. (omega) Benutzerseite


Lesenswert?

Geb mal in den PINSEL Registern die Pins des Controllers dem 
Displaycontroller frei:
1
  PINSEL0 |= 0x00055500;
2
  PINSEL3 |= 0x05555500;
3
  PINSEL4 |= 0x050FFFFF;
4
  PINSEL9 |= 0x0A000000;
5
  PINSEL11 |= 0x0000000F;

 | (0x01 << 13)   // DATA falling edge
habe ich so:
 | (0x00 << 13)   // DATA falling edge

Außerdem habe ich das TIMV Register anders:
1
LCD_TIMV = (1 << 24)|(1 << 16)|(9 << 10)|(272-1);

Damit die Taktung stimmt sollte der LPC aber mit 72 MHz laufen 
(Tippfehler?)


Edit: Das SDRAM läuft korrekt?

von Star K. (starkeeper)


Angehängte Dateien:

Lesenswert?

Sorry den code wo die pins eingerichtet werden habe ich vergessen zu 
posten:
1
   // Pins einrichten
2
   PINSEL0 = 0x00055500; // -> LCD
3
   PINSEL1 = 0x00000000; // P0[31]
4
   PINSEL3 = 0x05555500; // -> LCD
5
   PINSEL4 = 0x550FFFFF; // P2[14],P2[15] -> EMC, LCD
6
   PINSEL5 = 0x55555555; // P2[16]-P2[31] -> EMC
7
   PINSEL6 = 0x55555555; // P3[00]-P3[15] -> EMC
8
   PINSEL7 = 0x55555555; // P3[16]-P3[31] -> EMC
9
   PINSEL8 = 0x55555555; // P4[00]-P4[15] -> EMC
10
   PINSEL9 = 0x5A555555; // P4[16]-P4[27],P4[30],P4[31] -> EMC, LCD
11
   PINSEL11 = 0x0000000F; // -> LCD (LCDPWR, 24Bit TFT)

Und ja es war ein Tippfehler, der Controller soll bei 72MHz laufen.

Ich habe meine Konfiguration mal angepasst, sodass das TIMV-register 
genauso wie deins initialisiert wird. Auch die DATA falling-edge habe 
ich so eingestellt wie bei dir. Das brachte aber noch nicht den 
Durchbruch. Das Bild zeigt die Veränderung, die Farben sind nun anders, 
stimmen aber noch immer nicht mit dem gewünschten überein.

Zum Testen des RAM habe ich diesen Code verwendet:
1
#define SDRAM_BASE_ADDR    0xA0000000
2
void vTestRam(void)
3
{
4
  unsigned int i;
5
  unsigned int temp;
6
7
  for (i = 0; i < 0x1000000; i += sizeof(unsigned int))
8
  {
9
    *(unsigned int*)(SDRAM_BASE_ADDR+i) = i;
10
  }
11
12
  for (i = 0; i < 0x1000000; i += sizeof(unsigned int))
13
  {
14
    temp = *(unsigned int*)(SDRAM_BASE_ADDR+i);
15
    if (temp != i)
16
    {
17
       DebugBreak();
18
    }
19
  }
20
}

von Omega G. (omega) Benutzerseite


Lesenswert?

Prüfe doch bitte mal ob die Signale: DCLK, HYSNC, VSYNC am Display alle 
korrekt anliegen. Spannungspegel, Frequenz.

Wie sieht dein Hardware Aufbau aus?

von Star K. (starkeeper)


Angehängte Dateien:

Lesenswert?

Also das Messen wird schwierig, ich habe kein Oszi hier. Aber ich kann 
ja mal messen, ob der Kontakt überhaupt da ist. Oder mit dem 
Logik-Analyzer schauen ob die Signale ausgegeben werden.

Anbei mal meine Beschaltung des Displays.

von Omega G. (omega) Benutzerseite


Lesenswert?

Überbrücke mal die Widerstände R10 und R11 beim LVDS Transmitter, die 
haben da eigentlich nichts verloren.

Ansonsten dürfte SHTDN beim Receiver ein Eingang sein, kein Ausgang. 
Aber das ist erstmal nebensächlich.

von Star K. (starkeeper)


Lesenswert?

Also ich habe die Widerstände überbrückt, das hat aber keinen 
Unterschied gebracht.
Der SHTDN ist ein Eingang am Receiver und am Display ist ein ähnlicher 
Eingang DISP. Beide werden über den LCDPWR-Pin des LPC2478 gesteuert. 
Den Bin habe ich über eine Steckerleiste mit den LVDS-Signalen auf die 
Platine geführt, siehe SV3.

Ich habe mal versucht das Display einfarbig grün zu malen. Dabei wird 
immer nur das halbe Display bemalt, die andere hälfte bleibt weiß. Der 
Grünton stimmt, hat allerdings weiße Streifen drin die sich verändern. 
Dann habe ich versucht eine hälfte grün die andere rot zu malen. 
Ergebnis war eine hälfte in einer Mischfarbe, die andere bleibt weiß. 
Ein sehr merkwürdiges Verhalten?

Wie würde sich denn ein falsch konfigurierter oder zu langsammer RAM 
bemerkbar machen?

von Star K. (starkeeper)


Lesenswert?

Also ich habe nun nochmals mit dem Settings des LCD-Controller gespielt 
und konnte das Ergebnis verbessern (siehe Bild). Ereicht habe ich das 
durch reduzieren des LCD panel clock prescaler, der steht nun auf 4.
1
   // Einschalten des LCD Controllers
2
   PCONP |= BIT(20);
3
   asm(" NOP");
4
5
   // LCD Controller für 24Bit TFT einrichten
6
   LCD_CTRL = 0x2A;              // TFT 24Bit, no grey scaler
7
   LCD_CFG  = 3;                 // CCLK/8 = 9 Mhz
8
   LCD_POL  = (0x01 << 26)       // Bypass clock divider
9
           | ((480 - 1) << 16)   // Clock per Line
10
           | (0x00 << 14)        // ENA aktiv low
11
           | (0x01 << 13)        // DATA falling edge
12
           | (0x01 << 12)        // HSYNC aktiv low
13
           | (0x01 << 11);       // VSYNC aktiv low
14
  LCD_TIMH = (1  << 24)          // Horizontal back porch (2)
15
           | (1  << 16)          // Horizontal front porch (2)
16
           | (40 << 8)           // Horizontal pulse width (41)
17
           | (((480 / 16) - 1) << 2);  // Pixels per Line
18
  LCD_TIMV = (1  << 24)          // Vertical back porch (3)
19
           | (1  << 16)          // Vertical front porch (3)
20
           | (9  << 10)          // Vertical pulse width (10)
21
           | (272 - 1);          // Vertical lines
22
  LCD_UPBASE = 0xA0000000;
23
  LCD_LPBASE = 0;
24
  LCD_CTRL |= BIT(11) | BIT(0);

Allerdings läuft mein System jetzt nicht mehr stabil, ich kann es mit 
den Settings nicht debuggen, ich weiß also nicht ob es sich resettet 
oder sonst was anstellt. Ich hab bisher auch keine Ahnung woran das 
liegen kann.

Auch passen die Settings noch nicht wirklich, da zum einen noch weiße 
Streifen durch das Display laufen und zum anderen sitzt nicht jeder 
Pixel in jeder Zeile an der richtigen Stelle. Das erkennt man an den 
übergängen von einer Farbe zur nächsten, dort sind manche Pixel um einen 
oder zwei Pixel verschoben, wobei sich das ständig ändert.

von Star K. (starkeeper)


Angehängte Dateien:

Lesenswert?

Anhang vergessen..

von Star K. (starkeeper)


Lesenswert?

Hat noch jemand eine zündende Idee was mein Problem sein könnte? Die 
Anzeige habe ich noch immer nicht komplett hin bekommen. Es werden noch 
immer die weißen Streifen angezeigt.
Die Einstellungen für den Display-Controller sind momentan so wie sie 
sollten, außer der Displayclock, den musste ich auf 18MHz einstellen 
also das doppelte vom normalen. Grundsätzlich scheint hier etwas nicht 
zu stimmen.

Dann habe ich noch festgestellt, dass bei jeder UART Übertragung ein 
kurzes Flimmern auf dem Display entsteht. Das kann ich mir ebenfalls 
nicht erklären, da die Leitungen von Display und UART nicht annähernd 
beieinander liegen. Hier muss der Fehler auch im Controller liegen.

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.