Display an RA8835A (vgl. SED1335) flackert

OP #3851466
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
(Firma: Vescomp) #3852032
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.
OP #3852140
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
(Firma: Vescomp) #3852270
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.
OP #3869128
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???
OP #3869143
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...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.