Forum: Mikrocontroller und Digitale Elektronik Display an RA8835A (vgl. SED1335) flackert


von Oz z. (ozzy)


Lesenswert?

Moin,

ich probiere hier gerade ein Display (240x128) mit einem RA8835A 
Controller zum laufen zu bekommen. Dafür habe ich die lib von hier 
genommen: http://en.radzio.dxp.pl/sed1335/. Soweit funktioniert das 
auch, allerdings flackert der Bildschirm ganz schön, wenn ich Daten 
lese/schreibe. Im Datenblatt steht dazu folgendes:
"Display flicker may occur if there is more than one
consecutive access that cannot be ignored within a frame.
The microprocessor can minimize this either by performing
these accesses intermittently, or by continuously
checking the status flag (D6) and waiting for it to become
HIGH.

When CS, A0 and RD are LOW, D6 functions as the
display status indication output. It is HIGH during the
TV-mode vertical retrace period or the LCD-mode horizontal
retrace period, and LOW, during the period the
controller is writing to the display. By monitoring D6 and
writing to the data memory only during retrace periods,
the display can be updated without causing screen flicker."

Hat das jemand von Euch schon einmal gemacht???
Hier noch einmal die WriteData Funktion:
1
void RA8835A_WriteData(unsigned char dataToWrite)
2
{
3
  RA8835A_fWait();
4
5
  RA8835A_DATA_PORT = dataToWrite;
6
  RA8835A_DATA_DIR = 0xFF;
7
  RA8835A_CONTROL_PORT &= ~(RA8835A_CS | RA8835A_A0 | RA8835A_WR);
8
  asm("nop");
9
  RA8835A_CONTROL_PORT |= (RA8835A_CS | RA8835A_A0 | RA8835A_WR);
10
}
Wenn ich das so mache:
1
static void RA8835A_Wait( void )
2
{
3
  RA8835A_CONTROL_PORT &= ~(RA8835A_CS | RA8835A_A0 | RA8835A_RD);
4
  RA8835A_DATA_PORT = 0x00;
5
  RA8835A_DATA_DIR = 0x00;
6
7
  while(!(RA8835A_DATA_PIN & 0x40))
8
    ;
9
}
dann wird das läuft er da nie durch... Habt Ihr da eine Idee? Ist das 
eigentlich richtig, da den RD-Pin zu nehmen?

Viele Grüße
Ozzy

von Oz z. (ozzy)


Lesenswert?

Moin,

ich habe noch einmal ein Dokument hierzu gefunden:
http://www.raio.com.tw/Data/Datasheet/RA88%20Series/QA/RA8835_QA_V10.pdf
Auch mit der dort implementierten Methode flackert es allerdings noch 
ziemlich...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Oz zy schrieb:
> Wenn ich das so mache:
> static void RA8835A_Wait( void )
> ...
> ...
> }
> dann wird das läuft er da nie durch... Habt Ihr da eine Idee? Ist das
> eigentlich richtig, da den RD-Pin zu nehmen?

 Probiere es mal so:
1
static void RA8835A_Wait( void )
2
 {
3
   RA8835A_CONTROL_PORT &= ~(RA8835A_CS | RA8835A_A0 | RA8835A_RD);
4
   RA8835A_DATA_DIR = 0x00;
5
   RA8835A_DATA_PORT = 0xFF;   // Pullup einschalten !!!
6
 
7
   while(!(RA8835A_DATA_PIN & 0x40))
8
     ;
9
 }

> ich habe noch einmal ein Dokument hierzu gefunden:
> http://www.raio.com.tw/Data/Datasheet/RA88%20Series/QA/RA8835_QA_V10.pdf
> Auch mit der dort implementierten Methode flackert es allerdings noch
> ziemlich...

 So, wie ich das sehe sollte es umgekehrt sein. Warten auf Log.1, nicht
 auf Log.0, also:
1
void lcd_chkbusy(void)
2
{
3
unsigned char busy;
4
do {
5
busy = !(lcd_cmdread() & 0x40);  // So ??
6
}while(busy);
7
}

 Auf diese Weise wartest du in lcd_chkbusy() bis D6 auf Log.1 geht.
 Probieren.

von Oz z. (ozzy)


Lesenswert?

Moin,

danke für Deine Antwort. Also mit der RA8835A_Wait-Funktion von Dir 
kommt das Display gar nicht aus dem Reset raus...

Mit der unteren Funktion muss ich Dir recht geben. So habe ich es jetzt 
auch umgesetzt:
1
static unsigned char RA8835A_PollD6( void )
2
{
3
  unsigned char ret;
4
5
  RA8835A_DATA_DIR = 0x00;
6
  RA8835A_DATA_PORT = 0xFF;
7
  RA8835A_CONTROL_PORT &= ~(RA8835A_CS | RA8835A_A0 | RA8835A_RD);
8
  ret = RA8835A_DATA_PIN;
9
  RA8835A_CONTROL_PORT |= (RA8835A_CS | RA8835A_RD);
10
  return ret;
11
}
12
13
static void RA8835A_fWaitBusy( void )
14
{
15
  unsigned char busy;
16
17
  do
18
  {
19
    busy = !(RA8835A_PollD6() & 0x40);
20
  } while (busy);
21
}

allerdings ändert das nichts... Ich zeichne eine Echtzeitkurve mit 10Hz 
(vertikale Balken). In den Bereichen die an sind (als in der ganzen 
Diagrammfläche, nicht nur in dem direkten Umfeld, in dem ich schreibe), 
sehe ich immer wieder bytes dunkel aufblitzen, wenn ich schreibe. Schön 
sieht das nicht aus...

MfG, Ozzy

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Oz zy schrieb:
> (vertikale Balken). In den Bereichen die an sind (als in der ganzen
> Diagrammfläche, nicht nur in dem direkten Umfeld, in dem ich schreibe),
> sehe ich immer wieder bytes dunkel aufblitzen, wenn ich schreibe. Schön
> sieht das nicht aus...

 Interrupts aus.
 Ein Byte schreiben, 50-100ms warten, nächstes Byte schreiben.
 Wenn es immer noch aufblitzt, Fehler woanders suchen.

von Oz z. (ozzy)


Lesenswert?

Moin,

ich habe jetzt ewig rumprobiert, aber ich bekomme das Flackern einfach 
nicht weg! Ich habe jetzt mal alle Pixel angeschaltet und schreibe jede 
Sekunde ein Byte. Aber selbst dann sehe ich manchmal mehrere Bytes 
aufflackern. Habt Ihr da noch eine Idee???

von Oz z. (ozzy)


Lesenswert?

Ich habe mir noch einmal eine neue Version des Datenblatt geholt. Hier 
steht nun:

"The D6 status flag is HIGH for the tC/R period, and go Low at tTC/R - 
tC/R period where the RA8835A series is not reading the display memory. 
The microprocessor may use this period to update display memory without 
affecting the display, however it is recommended that the display be 
turned off when refreshing the whole display."

Also muss ich doch auf eine logische Null warten. Wenn ich das 
allerdings mache, dann passiert gar nichts mehr auf dem Display...

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.