mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Display-Probleme mit LPC2478


Autor: Star Keeper (starkeeper)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Omega G. (omega) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Star Keeper (starkeeper)
Datum:

Bewertung
0 lesenswert
nicht 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:
const u32 coltab[] = { 0x00FFFFFF, 0x0000FFFF, 0x00FFFF00, 0x0000FF00,
                       0x00FF00FF, 0x000000FF, 0x00FF0000, 0x00000000 };

...
// Farbbalken anzeigen
ptr = (u32 *)0xA0000000;
for(y = 0; y < 272; y++)
{
   for(x = 0; x < 480; x++)
   {
      *ptr = coltab[x/60];
      ptr++;
   }
}

Und hier der code um den LCD-Controller einzurichten:
void Lcd_Init(void)
{
   // Einschalten des LCD Controllers
   PCONP |= BIT(20);
   asm(" NOP");

   // LCD Controller für 24Bit TFT einrichten
   LCD_CTRL = 0x2A;  // TFT 24Bit, no grey scaler
   LCD_CFG  = 7;             // CCLK/8 = 9 Mhz
   LCD_POL  = (0x01 << 26)   // Bypass clock divider
           | ((480 - 1) << 16) // Clock per Line
           | (0x00 << 14)   // ENA aktiv low
           | (0x01 << 13)   // DATA falling edge
           | (0x01 << 12)   // HSYNC aktiv low
           | (0x01 << 11);  // VSYNC aktiv low
  LCD_TIMH = (1  << 24)     // Horizontal back porch (2)
           | (1  << 16)     // Horizontal front porch (2)
           | (40 << 8)      // Horizontal pulse width (41)
           | (((480 / 16) - 1) << 2);  // Pixels per Line
  LCD_TIMV = (2  << 24)     // Vertical back porch (3)
           | (2  << 16)     // Vertical front porch (3)
           | (10  << 10)     // Vertical pulse width (10)
           | (272 - 1);  // Vertical lines
  LCD_UPBASE = FRAMEBUF;
  LCD_LPBASE = 0;
  LCD_CTRL |= BIT(11) | BIT(0);
}

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

Autor: Omega G. (omega) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geb mal in den PINSEL Registern die Pins des Controllers dem 
Displaycontroller frei:
  PINSEL0 |= 0x00055500;
  PINSEL3 |= 0x05555500;
  PINSEL4 |= 0x050FFFFF;
  PINSEL9 |= 0x0A000000;
  PINSEL11 |= 0x0000000F;

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

Außerdem habe ich das TIMV Register anders:
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?

Autor: Star Keeper (starkeeper)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry den code wo die pins eingerichtet werden habe ich vergessen zu 
posten:
   // Pins einrichten
   PINSEL0 = 0x00055500; // -> LCD
   PINSEL1 = 0x00000000; // P0[31]
   PINSEL3 = 0x05555500; // -> LCD
   PINSEL4 = 0x550FFFFF; // P2[14],P2[15] -> EMC, LCD
   PINSEL5 = 0x55555555; // P2[16]-P2[31] -> EMC
   PINSEL6 = 0x55555555; // P3[00]-P3[15] -> EMC
   PINSEL7 = 0x55555555; // P3[16]-P3[31] -> EMC
   PINSEL8 = 0x55555555; // P4[00]-P4[15] -> EMC
   PINSEL9 = 0x5A555555; // P4[16]-P4[27],P4[30],P4[31] -> EMC, LCD
   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:
#define SDRAM_BASE_ADDR    0xA0000000
void vTestRam(void)
{
  unsigned int i;
  unsigned int temp;

  for (i = 0; i < 0x1000000; i += sizeof(unsigned int))
  {
    *(unsigned int*)(SDRAM_BASE_ADDR+i) = i;
  }

  for (i = 0; i < 0x1000000; i += sizeof(unsigned int))
  {
    temp = *(unsigned int*)(SDRAM_BASE_ADDR+i);
    if (temp != i)
    {
       DebugBreak();
    }
  }
}

Autor: Omega G. (omega) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Star Keeper (starkeeper)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Omega G. (omega) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Star Keeper (starkeeper)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Star Keeper (starkeeper)
Datum:

Bewertung
0 lesenswert
nicht 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.
   // Einschalten des LCD Controllers
   PCONP |= BIT(20);
   asm(" NOP");

   // LCD Controller für 24Bit TFT einrichten
   LCD_CTRL = 0x2A;              // TFT 24Bit, no grey scaler
   LCD_CFG  = 3;                 // CCLK/8 = 9 Mhz
   LCD_POL  = (0x01 << 26)       // Bypass clock divider
           | ((480 - 1) << 16)   // Clock per Line
           | (0x00 << 14)        // ENA aktiv low
           | (0x01 << 13)        // DATA falling edge
           | (0x01 << 12)        // HSYNC aktiv low
           | (0x01 << 11);       // VSYNC aktiv low
  LCD_TIMH = (1  << 24)          // Horizontal back porch (2)
           | (1  << 16)          // Horizontal front porch (2)
           | (40 << 8)           // Horizontal pulse width (41)
           | (((480 / 16) - 1) << 2);  // Pixels per Line
  LCD_TIMV = (1  << 24)          // Vertical back porch (3)
           | (1  << 16)          // Vertical front porch (3)
           | (9  << 10)          // Vertical pulse width (10)
           | (272 - 1);          // Vertical lines
  LCD_UPBASE = 0xA0000000;
  LCD_LPBASE = 0;
  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.

Autor: Star Keeper (starkeeper)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anhang vergessen..

Autor: Star Keeper (starkeeper)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.