Forum: Mikrocontroller und Digitale Elektronik Epson S1D13748 stellt sich tot


von Stampede (Gast)


Lesenswert?

Hallo,

ich möchte ein TFT mit einem Epson S1D13748 ansteuern. Ich nutze dazu 
Routinen, die ich auch für ein RAM (auch auf der Platine) verwende 
(diese funktionieren auch soweit). Mein Ozsi sagt mir, dass die Daten 
korrekt am Chip ankommen, der gibt aber keinen Ton von sich. Der 
Oszillator läuft, aber selbst die asynchronen Register liefern immer nur 
0x0000 zurück. Ich habe schon versucht die Powersave und PLL 
Controlregister zu beschreiben, leider bringt das aber auch nicht den 
gewünschten Erfolg.
Gibt es vielleicht einen Trick bei den Controllern, den ich übersehen 
habe ?


Grüße
Stampede

von Stampede (Gast)


Lesenswert?

push :)

Kennt sich da keiner mit aus?

von Stampede (Gast)


Lesenswert?

Monolog geht weiter:
Was ich auch nicht ganz verstehe: Wenn die asyncronen Register immer 
verfügbar sind, dann doch auch bevor ich die PLL etc. konfiguriert habe. 
Wenn dann da aber steht dass ich x Takte ein Signal anlegen muss, woher 
soll ich wissen, wie lange das ist ? Ich kann doch nicht auf gut Glück 
da mal was reinschreiben und hoffen, dass es geht. Wer hat sich sowas 
bloß ausgedacht?

von Benedikt K. (benedikt)


Lesenswert?

Stampede wrote:
> Was ich auch nicht ganz verstehe: Wenn die asyncronen Register immer
> verfügbar sind, dann doch auch bevor ich die PLL etc. konfiguriert habe.

Ja.

> Wenn dann da aber steht dass ich x Takte ein Signal anlegen muss, woher
> soll ich wissen, wie lange das ist ?

Wo steht das?

Passt der eingestellte Busmodus zum verwendeten?

von Stampede (Gast)


Lesenswert?

Hallo Benedikt,

schön, dass einer antwortet. Ich habe das Indirect 80 Interface gewählt, 
Datenformat Big Endian.
Das Interface sieht so aus wie auf Seite 44 des DB:
http://vdc.epson.com/index.php?option=com_docman&task=cat_view&gid=186&Itemid=99
Wenn man sich da beispielsweise t7 und t8 anschaut, weiß ich nicht wie 
lang die sein sollen. Habe den Controller mal so langsam gemacht wie mir 
möglich, da ist T(read low) über 1,5µs, die high time ist ca. 1µs. Das 
entspräche einem Takt von 1 MHz, eingestellt durch die PLL habe ich 
58MHz. Aber ob das gelingt weiß ich nicht, denn ich kriege ja kein 
Feedback über die Register. Als CLKI nehme einen Oszilator mit 8Mhz (der 
läuft auch). Nach dem aktivieren der PLL warte ich 1ms, aber bringt 
alles nichts. Die Leitungen gammeln alle auf low...

Ich sitze da schon den ganzen Tag vor und ich weiß einfach nicht mehr 
weiter >:(

von Stampede (Gast)


Lesenswert?

Mal noch der Code für die Leseroutine :
1
unsigned int ReadRegisterLCD(unsigned int Register)
2
{
3
  unsigned int data;
4
  PMPSetAddress(0x00);            // Dummy set
5
//  SetIndexRegisterLCD();
6
  LCD_RS = 0; LCD_AUX = 0;
7
  LCD_RS = 0; LCD_AUX = 0;
8
  LCD_CS = 0;                  //  
9
  LCD_CS = 0;                  // 
10
  PMPMasterWrite((Register<<1)|0x1);      // Adresse um ein nach links schieben, Bit0 gibt an, dass gelesen werden soll              
11
//  SetStatusRegisterLCD();
12
  LCD_RS = 1; LCD_AUX = 0;          // 
13
  LCD_RS = 1; LCD_AUX = 0;
14
  PMPMasterRead();              // Dummy Read
15
//  SetDataRegisterLCD();
16
  LCD_RS = 0; LCD_AUX = 1;          // 
17
  LCD_RS = 0; LCD_AUX = 1;
18
  data = PMPMasterRead();            // Read Data
19
  LCD_CS = 1;                  // 
20
  return  data;
21
}

von Benedikt K. (benedikt)


Lesenswert?

Stampede wrote:
> schön, dass einer antwortet. Ich habe das Indirect 80 Interface gewählt,
> Datenformat Big Endian.

Welchen µC verwendest du? Irgendwas von Motorola? Die meisten anderen 
haben nämlich Little Endian.

> Wenn man sich da beispielsweise t7 und t8 anschaut, weiß ich nicht wie
> lang die sein sollen.

Stimmt. Das Timing gilt wohl für die synchronen Register. Bei den 
Asynchronen dürfte das Timing nur durch irgendwelche Gatterlaufzeiten 
begrenzt sein, also um einiges unkritischer sein.
Die Datenblätter von Epson sind leider nicht so ganz perfekt...

Ich lese gerne das "REG[0002h] Product Information Register 1" aus, und 
verwende diese Info als Selbsttest des Busses.
Vorher muss das "Power Save Mode Enable" Bit gelöscht werden, aber das 
hast du ja schon drin.

von Stampede (Gast)


Lesenswert?

Ich nutze einen PIC32, dort das PMP Modul für die IO Zugriffe. Da bietet 
sich Big Endian und 80 INterface an.


>Ich lese gerne das "REG[0002h] Product Information Register 1" aus, und
>verwende diese Info als Selbsttest des Busses.

Genau das versuche ich ja verzweifelt. Aber da ist alles 0.

Vorher rufe ich das hier auf:
1
void InitializeLCD(void)
2
{
3
  LCD_CS_TRIS = 0;
4
  LCD_CS = 1;
5
  LCD_RS_TRIS = 0;
6
  LCD_VEN_TRIS = 0;
7
  LCD_VEN = 1;
8
  LCD_AUX_TRIS = 0;
9
  mPMPOpen(PMP_LCD_CONTROL, PMP_LCD_MODE, PMP_LCD_PORT, PMP_LCD_INTERRUPT);
10
  DelayMs(1);
11
  WriteRegisterLCD(REG0018_SYSTEM_CLOCK ,0x0000);  
12
  WriteRegisterLCD(REG000C_PLL_0,0x3B07);        // 0x§B:  PLL Teiler 08: Input devide by 3+1=4  
13
  WriteRegisterLCD(REG000E_PLL_1,0x0002);        // Given by datasheet
14
  WriteRegisterLCD(REG0010_PLL_2,0x0810);        // Given by datasheet
15
  WriteRegisterLCD(REG0012_PLL_3,0x0000);        // Enable PLL
16
  DelayMs(1);
17
  WriteRegisterLCD(REG0014_MISC_CONFIG,0x0000);    // 
18
  DelayMs(1);
19
20
}

Es scheint mir so, als würde das der Kontroller gar nicht reagieren. Der 
versucht an keiner Stelle mal einen Pin auf high zu ziehen. Das PMP 
Modul sollte richtig konfiguriert sein, schließlich läuft der RAM damit 
(mit Latches und allem drum und dran).
Hardware schon 10 Mal kontrolliert, ich kann einfach keinen Fehler 
finden...
Hast du noch ne Idee ?

Grüße
Stampede

von Benedikt K. (benedikt)


Lesenswert?

Stampede wrote:

> Hast du noch ne Idee ?

Ich sags mal so:
Nachdem ich die Hardwarefehler alle beseitigt hatte, und die Software 
das Bustiming richtige machte, und nachdem der Power Save Mode 
abgeschaltet war, lief bei mir bisher jeder Epson Contoller.

Bist du wirklich sicher, dass der PIC32 Big Endian auf dem externen Bus 
verwendet?

von Hans W. (stampede)


Angehängte Dateien:

Lesenswert?

Benedikt K. wrote:
> Stampede wrote:
>
>> Hast du noch ne Idee ?
>
> Ich sags mal so:
> Nachdem ich die Hardwarefehler alle beseitigt hatte, und die Software
> das Bustiming richtige machte, und nachdem der Power Save Mode
> abgeschaltet war, lief bei mir bisher jeder Epson Contoller.
>
> Bist du wirklich sicher, dass der PIC32 Big Endian auf dem externen Bus
> verwendet?


So, Datenformat litte endian, timing so lahm wie irgend geht, CNF alle 
low, Powersave sollte off sein (obwohl die asynchronen ja angeblich so 
gehen), aber gleiches Bild. Das Statusregister 2 bleibt 0, andere 
Register auch.

Hardware hab ich mal in den Anhang gepackt, sollte meines Erachtens auch 
ok sein. Ich weiß einfach nicht weiter .... oder übersehe ich einfach 
etwas ?

Ich werde morgen mal den 36 Kanal Logikanalyser auf der Arbeiten 
dranwerfen, vielleicht gibt das Aufschluss.

Gruß
Stampede

von Benedikt K. (benedikt)


Lesenswert?

Zitat aus dem Datenblatt:

After power-on, an active low hardware reset pulse, which is two 
external clock cycles
(CLKI) in length, must be input to the S1D13748B00 RESET# pin. All 
registers, including
the Clock Configuration registers (REG[000Eh] ~ REG[0018h]) are reset by 
a hardware
reset. After releasing the RESET# signal, the Clock Configuration 
registers are immediately
accessible.

Wenn ich davon ausgehe, dass der Quarzoszillator ein paar ms zum Starten 
braucht, denke ich nicht dass das RC Glied Reset solange auf Low hält.
Keine Ahnung ob es daran liegt, aber versuch mal Reset etwas länger bzw. 
später auf Low zu ziehen, damit der 13748 wirklich 2 Takte während Reset 
erhält.

von Gast (Gast)


Lesenswert?

Der R167 (deine Reset-Kombination) kommt mir etwas sehr groß vor. Kann 
es sein, dass der S1D nie aus dem Reset kommt?

von Hans W. (stampede)


Lesenswert?

So, es geht nun, der Kontroller spricht. Hatte einen durch eine zu hohe 
PLL Spannung zerschossen. Aber das Gerätsele geht weiter: Was muss in 
die Register 0x40 und 0x42 (LCD1 Horizontal Total Register und LCD1 
Horizontal Display Period Register) ? In das eine würde ich passen für 
640 Pixel beschreiben, aber das andere? Hat da jmd mal ne kurze 
Erklärung ?

Oder was soll das sein, Register 0x46: Horizontal Pulse Width in pixels 
? Pulseweite wird für mich in sek gemessen.... verstehe ich grad gar 
nicht...

Gruß
Stampede

von Benedikt K. (benedikt)


Lesenswert?

Hans W. schrieb:
> In das eine würde ich passen für 640 Pixel beschreiben,

Ja.

> aber das andere? Hat da jmd mal ne kurze Erklärung ?

Das ist die gesamte Bildbreite inkl. Zeilenrücklauf wie das bei CRTs 
hieß.
Bei 640x480 liegt der übliche Wert um die 800, genaueres sollte im 
Datenblatt vom TFT stehen.

> Oder was soll das sein, Register 0x46: Horizontal Pulse Width in pixels
> ? Pulseweite wird für mich in sek gemessen.... verstehe ich grad gar
> nicht...

Für den Controller sind Pixel die Zeitbasis. Bei 640x480 beträgt der 
Pixeltakt meist 25,1MHz. Ein Pixel entspricht daher etwa 40ns. Auch 
dieser Wert sollte im Datenblatt des TFTs zu finden sein.

von Hans W. (stampede)


Angehängte Dateien:

Lesenswert?

Aha, jetzt kommen wir der Sache langsam näher.
Auf der Seite 17 scheint mir die relevanten Informationen zu stehen.
Danke, das hilft mir schon mal weiter. Melde mich wenn ich nicht 
weiterkomme...

von Hans W. (stampede)


Lesenswert?

Das IC ist echt der Wahnsinn:
Das Statusregister (0x2) lässt sich korrekt auslesen, bei allen anderen 
(asyncronen) Registern kommt nur 0x0 raus, obwohl für den Defaultzustand 
was ganz anderes angegeben ist. Ich verstehe das Teil einfach nicht !

von Stampede (Gast)


Lesenswert?

Hallo,

ich muss diesen alten Thread nochmal aktivieren, es tut sich wieder was.
Die Kommunikation geht nun einwandfrei, der Chip sitzt nun auf einer 
neuen Platine.

Zum Problem:

Die Einstellungen für die Displaytakte sind mir einfach noch nicht ganz 
klar. Irgendetwas ist da auch nicht ok, denn es treten 2 Fehler auf:
1. Das Display flaktert in der linken Hälfte deutlich, rechts ist das 
nicht der Fall.
2. Die Backgroundfarbe lässt sich nicht korrekt einstellen. Wenn ich das 
entsprechende Register auf max. Rot setzte kommt so ein Blau raus, bei 
max. Blau so ein Rostbraun.

Das lässt mich darauf schließen, dass die Daten nicht richtig beim LCD 
ankommen (HSYNC falsch etc.)

Ich habe die Register wie folgt initialisiert:
1
   setReg(0x0040, (horTotal / 8) - 1);       // LCD1 Horizontal Total (FPLINE Period) Register
2
   setReg(0x0042, (DISP_HOR_RESOLUTION / 2) - 1);       // LCD1 Horizontal Display Period Register
3
   setReg(0x0044, 0x0009);       // LCD1 Horizontal Display Period Start Position Register
4
   setReg(0x0046, 0x001E);       // LCD1 Horizontal Pulse (FPLINE) Register
5
   setReg(0x0048, 0x0064);       // LCD1 Horizontal Pulse (FPLINE) Start Position Register
6
   setReg(0x004A, verTotal - 1);       // LCD1 Vertical Total (FPFRAME Period) Register   
7
   setReg(0x004C, DISP_VER_RESOLUTION - 1);       // LCD1 Vertical Display Period Register
8
   setReg(0x004E, 0x0000);       // LCD1 Vertical Display Period Start Position Register
9
   setReg(0x0050, 0x0003);       // LCD1 Vertical Pulse (FPFRAME) Register
10
   setReg(0x0052, 0x0000);       // LCD1 Vertical Pulse (FPFRAME) Start Position Registe

Im Detail:
Der Pixeltakt ist auf 27.5MHz eingestell, was laut DB des LCD ok ist
0x40: LCD1 Horizontal Total: horTotal = 844, laut DB typ 750 bis 850
0x42: LCD1 Horizontal Display Period Register: DISP_HOR_RESOLUTION = 640
0x44: LCD1 Horizontal Display Period Start Position Register: 9, da 
erlaubter Minimalwert ?
0x46: LCD1 Horizontal Pulse (FPLINE) Register: 0x1E = 30 Takte ?
0x48: LCD1 Horizontal Pulse (FPLINE) Start Position Register 0x64 = 144 
?? Stimmt das?? Takte ab gültigem Framebeginn?

0x4A: LCD1 Vertical Total (FPFRAME Period) Register: horTotal = 525
0x4C: LCD1 Vertical Display Period Register: DISP_VER_RESOLUTION = 480
0x4E: LCD1 Vertical Display Period Start Position Register: 0 ???
0x50: LCD1 Vertical Pulse (FPFRAME) Register: 6 ?
0x52: LCD1 Vertical Pulse (FPFRAME) Start Position Register: 0 ?

Bei den Werten ohne "?" denke ich mal, dass die stimmen. Aber bei den 
anderen? Kann mir da jmd helfen?+
Sonst sollten die Register passen, habe dem LCD entsprechend 24Bit RGB 
eingestellt.

Gruß
Stampede

von Stampede (Gast)


Lesenswert?

Hi,

das mit der Farbe hat sich nun erledigt, musste die controllerinterne 
LUT abschalten. Das Geflimmere ist aber immer noch vorhanden.

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.