Forum: Mikrocontroller und Digitale Elektronik Timingdiagram verständnis Problem


von C. H. (hedie)


Angehängte Dateien:

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

von Wolfgang (Gast)


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)

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


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

von C. H. (hedie)


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

von g457 (Gast)


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

von C. H. (hedie)


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
  }

von g457 (Gast)


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
}

von C. H. (hedie)


Lesenswert?

Vielen Dank für deinen Code :)

Es ist nun einfach weiss egal was ich am Datenport anlege....

Ich finde das sehr merkwürdig....

Ich konnte in der Zwischenzeit ein Datenblatt auftreiben

http://109.75.110.149/211-0.pdf


Es scheint so, als hätte sich im Timingdiagram etwas geändert im 
vergleich zu meinen Bildern

von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

So

Ich habe nun mal den LA angehängt...

Meiner Meinung nach, müsste das Display nun die Daten korrekt anzeigen!

Tut es jedoch nicht :(

Sieht jemand einen fehler?

von g457 (Gast)


Lesenswert?

Das Timing von CL1 ist falsch, schau nochmals in Datenplatt in die 
Abbildung in 8.1.

von C. H. (hedie)


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?

von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

So ich habe mir nochmals das Datenblatt angesehen und habe es nun meiner 
Meinung nach exakt nach dem Abschnitt 8.1 gemacht.

Anbei Bilder vom Start (FLM high) und ende (FLM Low) einer Zeile

Was haltet ihr davon?

Ist dieses Timing konform nach diesem Datenblatt? (Seite 13)

http://109.75.110.149/211-0.pdf

Danke schonmal

von g457 (Gast)


Lesenswert?

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

von C. H. (hedie)


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

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.