Timingdiagram verständnis Problem

OP #2500764
Lesenswert?

Guten Tag zusammen

Ich versuche derzeit ein Display anzusteuern...

Leider habe ich nicht das gesamte Datenblatt zur Verfügung sondern nur 
das Timingdiagramm und die Pinbelegung.

Mein Problem ist nun, das ich nicht so ganz verstehe, wann ich welche 
Signale anlegen muss.

Besonders beim Bild Timing_1 verstehe ich nicht was das (reduction) 
bedeuten soll.

Zudem Sieht man bei Reduction meiner meinung nach ein anderes Timing als 
im oberen bereich.

Mir ist zudem nicht ganz klar, wozu das Latch signal da ist.

Ich habe nun mal folgenden Code:
1
  DISP_HI();
2
  while(1)
3
  {
4
    while(uiSpaltenCounter != 120)
5
    {
6
      CL2_HI();
7
      DelayuS(200);
8
      CL2_LO();
9
      DelayuS(200);
10
      uiSpaltenCounter++;
11
    }
12
    uiSpaltenCounter=0;
13
    FLM_LO();
14
    CL1_HI();
15
    DelayuS(200);
16
    FLM_HI();
17
    CL1_LO();
18
    DelayuS(200);
19
  }
20
}

Zur Beschreibung:

CL2 ist der Data Input Clock
CL1 ist das input data Latch signal
FLM ist das Scan start up signal (was bedeutet das genau? wo finde ich 
informationen darüber? )

Auflösung ist 320x240
Jeweils 1bit pro Farbe also R = 1bit G = 1bt B = 1bit
Somit 120bytes für eine Zeile

Das Display füllt sich mit diesem Code einfach gelb auf. Die Daten 
welche am Datenbus liegen, werden ignoriert.

Ich hoffe jemand kann mir ein paar Tipps geben :)

Danke
Angehängte Dateien:
Gast #2500771
Lesenswert?

Claudio Hediger schrieb:
> Besonders beim Bild Timing_1 verstehe ich nicht was das (reduction)
> bedeuten soll.

Die unteren beiden mit "reduction" bezeichneten traces sind in grober 
Zeitauflösung dargestellt. Alle vier darüber dargestellten Signale sind 
aus dem Zeitfenster um den ersten FLM-Pulse (vertikal gestrichelten 
Linien, Pfeil)
(Firma: Nisch-Aufzüge) Persönliche Seite #2500789
Lesenswert?

Latch sehe ich hier zwar nicht, ist aber ein Signal welches der 
zwischenspeicherung von Daten oder Adressen dient, wenn diese im 
multiplexverfahren übertragen werden. z.b nacheinander addrhigh, 
addrlow.

Oder im Nibblemode high- und low nibble. Das Latch übernimmt dann die 
erste hälfte des datums, schiebt es in die High zelle und bewahrt es 
dort auf bis der (halbierte)Bus die zweite Hälfte des Datums auf den 
selben Leitungen liefert wie die erste Hälfte.

Multiplexverfahren werden eingesetzt um die Zahl diskreter leitungen zu 
reduzieren allerdinggs erfordert das einen höheren aufwand an anderer 
stelle, nämlich der zeit und syncronisation.

Namaste
OP #2500843
Lesenswert?

Danke für eure Antworten...


Ich habe den Code nun angepasst...

Doch leider funktioniert das display immer noch nicht richtig...
Es bleibt gelb....

Im Timing_2 bild ist das FLM Signal nur kurzzeitig low im Timing_1 Bild 
ist es jedoch mal low dann wieder high immer abwechslungsweise...

Was ist nun korrekt?

Hier der code:
1
  DISP_HI();
2
  while(1)
3
  {
4
    CL1_LO();
5
    while(uiSpaltenCounter != 119)
6
    {
7
      CL2_HI();
8
      DelayuS(100);
9
      if(uiToggle == 1) FLM_HI();
10
      else FLM_LO();
11
      CL2_LO();
12
      DelayuS(100);
13
      uiSpaltenCounter++;
14
    }
15
    uiSpaltenCounter=0;
16
    CL2_HI();
17
    DelayuS(100);
18
    CL1_HI();
19
    CL2_LO();
20
    DelayuS(100);
21
    CL1_LO();
22
    if(uiToggle == 1) uiToggle = 0;
23
    else uiToggle = 1;
24
    GPIO_SetBits(GPIOC,ucValue);
25
    ucValue++;
26

27
    //DelaymS(500);
28

29
  }
30
}


Danke
Gast #2500866
Lesenswert?

Du hast im wesentlichen drei Takte: FLM ist der FirstLineMarker. Der ist 
normalerweise(tm) in der ersten Zeile gesetzt, entspricht also der 
Bildwiederholdfrequenz. Load/CL1 zeigt das Zeilen∗ende∗ an, entspricht 
also der Zeilenfrequenz. Latch/CL2 ist die Übernahme der Pixeldaten, 
sozusagen der Pixeldatentakt.

Wie man dem Timingdiagramm entnehmen kann musst Du FLM im ersten 
Pixelblock der ersten Zeile setzen und im ersten Pixelblock der zweiten 
Zeile wieder löschen.

Bei mir sieht das bei einem ansteuerungsähnlichen Display etwa so aus:
1
void WDH3224_draw_next_line(void)
2
{
3
    // check/set FLM
4
    if (g_ui8WDH3224_current_line == 0)
5
        WDH3224_FRAME_SET_HIGH();
6

7
    gram_set_readmode();
8
    gram_set_address_high(g_ui8WDH3224_current_line);
9

10
    // ..unrolled.. a bit.. make gcc do the rest!
11
    uint8_t x;
12
    GRAM_ADDRESS_SET(0);
13
    for (x = 1; x < WDH3224_SIZE_X /4; x++)
14
    {
15
        WDH3224_CLOCK_SET_HIGH();
16
        WDH3224_CLOCK_SET_LOW();
17
        GRAM_ADDRESS_SET(x);
18
    }
19

20
    WDH3224_CLOCK_SET_HIGH();
21
    WDH3224_LOAD_SET_HIGH();
22
    WDH3224_CLOCK_SET_LOW();
23
    WDH3224_LOAD_SET_LOW();
24

25
    // clear FLM (note: always clear FLM.. avoids one 'if' statement)
26
    WDH3224_FRAME_SET_LOW();
27

28
    g_ui8WDH3224_current_line++;
29
    if (g_ui8WDH3224_current_line == WDH3224_SIZE_Y)
30
    {
31
        g_ui8WDH3224_current_line = 0;
32
    }
33
}

Beachte insbesondere das Setzen/Löschen von FLM (hier: 'FRAME') und 
CL1/LOAD mit dem Pixeltakt CL1/LATCH (hier: CLOCK)

HTH
OP #2500889
Lesenswert?

Vielen Dank für deine Antwort


Habe nun den Code angepasst

Aber es scheint immer noch nicht zu klappen :(
1
while(1)
2
  {
3
    ucWert++;
4
    GPIO_SetBits(GPIOC,ucWert); //Display Daten ausgeben
5
    FLM_HI();
6
    while(uiSpaltenCounter != 120) //120bytes = 320 RGB Pixel
7
    {
8
      CL2_HI();
9
     // DelayuS(1);
10
      CL2_LO();
11
    //  DelayuS(1);
12
      uiSpaltenCounter++;
13
    }
14
    CL1_HI();
15
    //DelayuS(1);
16
    CL1_LO();
17
    //DelayuS(1);
18
    uiSpaltenCounter=0;
19
    FLM_LO();
20
   // DelayuS(1);
21

22

23
    while(uiZeilenCounter != 239) //Erste zeile wurde bereits gesendet
24
    {
25
      uiZeilenCounter++;
26
      while(uiSpaltenCounter != 120)
27
      {
28
        CL2_HI();
29
       // DelayuS(1);
30
        CL2_LO();
31
       // DelayuS(1);
32
        uiSpaltenCounter++;
33
      }
34
      CL1_HI();
35
     // DelayuS(1);
36
      CL1_LO();
37
     // DelayuS(1);
38
      uiSpaltenCounter=0;
39
    }
40
    uiZeilenCounter = 0;
41
  }
Gast #2500905
Lesenswert?

..probiers mal mit sowas in der Richtung - Delays musst Du ggf. noch 
einbauen, bei mir läuft obiger Code auf einem 16MHz-m32, da 'passt das'.
1
while(1)
2
{
3
    for (uiZeilenCounter = 0; uiZeilenCounter < 240; uiZeilenCounter++)
4
    {
5
        if (uiZeilenCounter == 0)
6
            FLM_HI();
7

8
        ucWert++;
9
        GPIO_SetBits(GPIOC,ucWert); //Display Daten ausgeben
10

11
        for (uiSpaltenCounter = 1; uiSpaltenCounter < 120; uiSpaltenCounter++)
12
        {
13
            CL2_HI();
14
            CL2_LO();
15

16
            ucWert++;
17
            GPIO_SetBits(GPIOC,ucWert); //Display Daten ausgeben
18
        }
19

20
        CL2_HI();
21
        CL1_HI();
22
        CL2_LO();
23
        CL1_LO();  
24

25
        FLM_LO();
26
    }
27
}
OP #2501315
Lesenswert?

g457 schrieb:
> Das Timing von CL1 ist falsch, schau nochmals in Datenplatt in die
> Abbildung in 8.1.

Danke für den Hinweis!

Ich finde das Diagram bei 8.1 sowieso merkwürdig.

Weshalb geht dort FLM kurzzeitig auf High?
FLM ist doch während der ersten Zeile nach dem 1. Pixelclock immer High.
Bis die Zeile fertig ist oder?
OP #2509082
Lesenswert?

g457 schrieb:
> FLM muss nach CL1 fallen (t_FLH >= 50ns). Und es erscheint mir reichlich
> früh dass Du FLM schon setzt wenn CL1 noch von der letzten Zeile gesetzt
> ist.
>
> HTH

Danke :)

Du hast recht, FLM muss nach CL1 fallen aber laut Spezifikation steigt 
FLM bevor CL1 gefallen ist. Oder sehe ich da was falsch? 8.1 im 
Datenblatt Seite 13...

Derzeit flimmert das Display mit Weissen streifen..

Die farben werden eingelesen :) Aber es flimmert... wenn ich schneller 
werde, ist das flimmern weg aber der kontrast so gut wie null

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren