Forum: Mikrocontroller und Digitale Elektronik TFT LCD Ansteuerung


von Dominic A. (neo123)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Ich brauche wieder einmal eure Hilfe. Ich versuche derzeit ein TFT 
Display 
anzusteuern(http://www.ebay.com/itm/2-4-inch-TFT-LCD-module-Display-with-touch-panel-SD-card-cage-240RGBx320-3v-/300798324584?pt=LH_DefaultDomain_0&hash=item4608fa2f68). 
Das Display soll einen ILI9325 kompatiblen Controller haben. Leider 
kriege ich es einfach nicht hin. Ich habe schon verschiedene 
Bibliotheken aus dem Internet versucht. Jedoch erfolglos. Den Verkäufer 
habe ich auch schon kontaktiert und nach einem Beispiel Code gefragt. 
Daraufhin hat er mir die Dateien aus dem Anhang gesendet. Diesen Code 
bekomme ich aber auch nicht zum laufen.

Ich verwende einen PIC18F54K20 mit dem internen Oszillator auf 8MHz. 
Mein aktueller Code befindet sich im Anhang.

Ich wäre sehr dankbar wenn sich jemand kurz die Zeit nehmen würde um mir 
zu helfen. Eventuell hat jemand sogar einen funktionierenden Code.

Grüsse

von Verwirrter Anfänger (Gast)


Lesenswert?

Ich schätze mal, dass das Display in Wirklichkeit einen S6D1121 
Controller hat. Der ist zwar grob mit dem ILI9325 kompatibel, aber ein 
paar Anpassungen braucht man.

Als Startpunkt würde ich diese Seite empfehlen:
http://www.elecfreaks.com/wiki/index.php?title=2.4%22_TFT_LCD:_TFT01-2.4

Hierbei würde ich auch kontrollieren, ob du im 16 Bit oder 8 Bit Modus 
bist.

Meine Erfahrungen mit 2 Boards von verschiedenen eBay Verkäufern:
- Beide waren S6D1121 Controller
- Beide waren default im 8-Bit Modus
- Beide passten grob zu der Platine vom obigen Link, das Layout war 
etwas anders, der Schaltplan war gleich.

Ich hab noch Code für das STM32F4 Discovery Board hier irgendwo 
rumfliegen, aber wenn die ElecFreaks Seite nicht passt, wird der wohl 
auch nicht funktionieren.

von ..,- (Gast)


Lesenswert?

Ging mir bei einem anderen Display ganz ähnlich ... sollte ein HX8347a 
drin sein ...war aber letztlich ein SSD1289 (oder so) drin.

Die Kennung der Displays kann man aber in der Regel unter R00h lesen ... 
ist aber schon ne Weile her ...

von Dominic A. (neo123)


Lesenswert?

Verwirrter Anfänger schrieb:
> Als Startpunkt würde ich diese Seite empfehlen:
> http://www.elecfreaks.com/wiki/index.php?title=2.4...

Vielen Dank für den Link. Leider aber bleibt mein Display auch bei 
diesem Code einfach nur weiss.


> Hierbei würde ich auch kontrollieren, ob du im 16 Bit oder 8 Bit Modus
> bist.

Wie kann man das überprüfen? Derzeit habe ich alle 16 Datenleitungen an 
den Mikrocontroller angeschlossen.

..,- schrieb:
> Die Kennung der Displays kann man aber in der Regel unter R00h lesen ...
> ist aber schon ne Weile her ...

Könntest du etwas genauer erklären wie man herausfindet welcher 
Controller auf dem Display verbaut ist?

Ich denke bei mir stimmt irgendetwas bei der Initialisierung nicht. Den 
das Display zeigt überhaupt gar nichts an und bleibt nur weiss. Ich 
denke wenn der Code für eine Schrift oder ein Rechteck falsch wäre, 
würde es irgendetwas anzeigen nur das falsche. Oder liege ich da falsch?

von Verwirrter Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

Dominic A. schrieb:
> Wie kann man das überprüfen? Derzeit habe ich alle 16 Datenleitungen an
> den Mikrocontroller angeschlossen.

Sieht dein Display auf der Rückseite so aus, wie das angehängte Foto? 
Wenn es wirklich exakt so aussieht, es die Wahrscheinlichkeit hoch, dass 
J3 den Modus auswählt. Wenn J3 nicht verbunden ist, dann ist es im 8-Bit 
Modus, sonst ist es im 16-Bit Modus.

Wenn dein Display anders aussieht, dann ist es wahrscheinlich am 
einfachsten, in beiden Varianten zu versuchen die ID auszulesen.

Dominic A. schrieb:
> Könntest du etwas genauer erklären wie man herausfindet welcher
> Controller auf dem Display verbaut ist?

Du musst versuchen das Register 0x00 auzulesen. Das Auslesen 
funktioniert nahezu analog zu dem Schreiben. Als erstes wird der Index 
gesetzt, so wie sonst auch. Danach werden die Daten eingelesen. Hierbei 
mus nWR high und nRD low sein, und der Port muss natürlich als Input 
konfiguriert sein.

von Dominic A. (neo123)


Angehängte Dateien:

Lesenswert?

Ja mein Display sieht exakt so aus. JP3 ist nicht verbunden somit ist es 
im 8-Bit Modus.

Das Auslesen habe ich soeben probiert mit folgenden Code:
1
    unsigned int Datahi, Datalo;
2
    LCD_CS = 0;
3
    LCD_RS = 0;
4
    LCD_RD = 1;
5
6
    DBhigh = 0x00;
7
    LCD_WR = 0;
8
    LCD_WR = 1;
9
10
    DBhigh = 0x00; // Index setzen
11
    LCD_WR = 0;
12
    LCD_WR = 1;
13
14
15
    LCD_RS = 1;
16
    PORTC = 0xFF; //DBhigh Input
17
18
    LCD_RD = 0;
19
    Datahi = DBhigh; //high byte read
20
    LCD_RD = 1;
21
    LCD_RD = 0;
22
    Datalo = DBhigh; //low byte read
23
24
    LCD_RD = 1;
25
    LCD_CS = 1;
26
    LCD_WR = 1;
27
    LCD_RD = 1;
28
    PORTC = 0x00; //DBhigh Output
29
    eeprom_write(0x00, Datalo);
30
    eeprom_write(0x01, Datahi);
Jedoch bleiben die Wert im EEPROM auf 0xFF. Ich habe versucht das 
Auslesen nach dem Diagramm auf Seite 49 vom Datenblatt des IL9325 zu 
programmieren.
Ist der Code falsch oder welchen Grund könnte es haben das das Auslesen 
nicht funktioniert?

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

PORTC = 0xFF; //DBhigh Input
.. schaltet den Datenport gewiss nicht auf Input

wenn du DBhigh = 0x00 zur Ausgabe verwendest, dann kann Datahi = DBhigh 
nicht zum Einlesen verwendet werden, da Ausgabe ja über PORTx und 
Eingabe über PINx läuft!

Sascha

von Dominic A. (neo123)


Lesenswert?

Sascha Weber schrieb:
> PORTC = 0xFF; //DBhigh Input
> .. schaltet den Datenport gewiss nicht auf Input

Ach ja klar das sollte TRISC sein.

> wenn du DBhigh = 0x00 zur Ausgabe verwendest, dann kann Datahi = DBhigh
> nicht zum Einlesen verwendet werden, da Ausgabe ja über PORTx und
> Eingabe über PINx läuft!

DBhigh ist folgendermassen definiert:
1
#define  DBhigh  PORTC  //High byte of data

Wie liest man den in eine Variable einen Port ein? Bisher habe ich es 
immer so gemacht.

Nach der Änderung von PORT auf TRIS lese ich nun bei Datahi sowie auch 
bei Datalo 0x00 aus.

von Sascha W. (sascha-w)


Lesenswert?

ooobs,

hab jetzt gerade noch mal oben gesehen das du ja einen PIC verwendest!
Ok dann stimmt aber wenigstens die Hälfte meines Posts (der sich auf AVR 
bezog).

Mach mal zwischen RD=low und Einlesen der Daten eine Kurze Pause, da der 
Displaycontroller erst die Daten anlegen muss.

Sascha

von Dominic A. (neo123)


Lesenswert?

Okay alles klar.

Selbst bei einem Delay von 5ms zwischen dem RD = 0 und dem Einlesen 
bekomme ich nur 0x00. Kann es sein das mein Display einfach defekt ist?

von Dominic A. (neo123)


Lesenswert?

Hat niemand mehr einen Tipp?

von Verwirrter Anfänger (Gast)


Lesenswert?

Ich kann nichts wirklich Falsches in deinem Code entdecken, aber Ich hab 
ihn jetzt auch nicht 100% mit meinem abgeglichen.

Wenn du Interesse hast, könnte ich nochmal meinen Code posten, 
allerdings ist der für den STM32F4, benutzt den FSMC (flexible static 
memory controller) und ist sehr unorganisiert und durcheinander.

Falls du im Raum Saarbrücken wohnst, könnte ich auch noch einen Test mit 
einer auf jeden Fall funktionierenden Schaltung / Display anbieten.

von Sascha W. (sascha-w)


Lesenswert?

Dominic A. schrieb:
> Hat niemand mehr einen Tipp?

vielleicht gibts bei dem Contoller im Register 0x0000 nichts zum 
auslesen beim ssd1289 z.B. ist das das IndexRegister und das hat nach 
Reset den Wert 0.
Lies halt mal 30 Register aus und speichere die Werte oder lass sie über 
UART (wenn du hast) ausgeben.

Sascha

von Dominic A. (neo123)


Lesenswert?

Habe ich nun gemacht:

Reg  Datahi  Datalo
0  0x00  0x00
1  0x01  0x01
2  0x02  0x02
3  0x03  0x03
4  0x04  0x04
5  0x05  0x05
6  0x06  0x06
7  0x07  0x07
8  0x08  0x08
9  0x09  0x09
10  0x10  0x10

Das geht dann so weiter.
Ich verstehe es nicht mehr. Scheinbar gibt er einfach den gesetzten 
Index zurück oder mein Code ist völlig falsch.

von ..,- (Gast)


Lesenswert?

Sascha Weber schrieb:
> vielleicht gibts bei dem Contoller im Register 0x0000 nichts zum
> auslesen beim ssd1289 z.B. ist das das IndexRegister und das hat nach
> Reset den Wert 0.

# SSD1289
# Device Code Read (R00h)
# If this register is read forcibly, 8989h is read.

Es ist bei vielen dieser Treiber das (R00h)-Register welches den 
Device-Code enthält ...

Controller   Device-ID
ILI9320      0x9320
ILI9325      0x9325
ILI9328      0x9328
ILI9331      0x9331
SSD1298      0x8999
SSD1289      0x8989
ST7781       0x7783
LGDP4531     0x4531
SPFD5408B    0x5408
R61505U      0x1505 0x0505
HX8347D      0x0047
HX8347A      0x0047
LGDP4535     0x4535
SSD2119      0x9919

außer beim HX8347A ... da sitzt es bei (R69h).

Deinen Code habe ich mir nicht angesehen ... aber meine Erfahrung hat 
gezeigt, dass man beim Initialisieren des Displays lieber nicht zu 
geizig mit Delays umgehen sollte.

Viel Erfolg

von Sascha W. (sascha-w)


Lesenswert?

Dominic A. schrieb:
> Habe ich nun gemacht:
>
> Reg  Datahi  Datalo
> 0  0x00  0x00
> 1  0x01  0x01
> 2  0x02  0x02
> 3  0x03  0x03
> 4  0x04  0x04
> 5  0x05  0x05
> 6  0x06  0x06
> 7  0x07  0x07
> 8  0x08  0x08
> 9  0x09  0x09
> 10  0x10  0x10
>
> Das geht dann so weiter.
> Ich verstehe es nicht mehr. Scheinbar gibt er einfach den gesetzten
> Index zurück oder mein Code ist völlig falsch.

das sieht so aus, als ob vom Display gar keine Daten kommen, weil die 
Leitungen noch auf Eingang stehen. Durch die Kapazitäten der Eingänge 
liest du den Wert den du zuvor ausgegeben hast. Ist deine RD-Leitung 
auch mit dem richtigen Portpin verbunden?

Sascha

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.