Forum: Mikrocontroller und Digitale Elektronik LCD 128x64 Ram kaputt?


von Joachim .. (joachim_01)


Angehängte Dateien:

Lesenswert?

LCD 128x64 Ram kaputt?

Hi,
bekanntermaßen sind die 128x64 KS0108 in der Senkrechten in sogenannte 
Pages zu je 64Bytes organisiert.
Um einen Pixel zu setzen muß man:
- die Page anwählen
- Das Byte lesen
- den Pixel in das Byte UND-verknüpfen
- das Byte wieder zurückschreiben
Ich verwende die GLCD Bibliothek von Apetech.

An etwa 5% aller Speicherstellen lese ich, nachdem alle Pixel des 
Displays eindeutig auf 0 (oder 1) gesetzt werden, Fehler zurück. Der 
Fehler ist reproduzierbar.
Ich resete das Display nach jedem Neustart (was aber auf das RAM 
eigentlich ohnehin keinen Einfluß hat). Lese ich in Wahrheit ein 
Shadow-RAM das sich von dem physikalischen "Pixel-RAM" unterscheidet? 
Ich hatte das Ding seit Jahren in der Bastelkiste liegen, es wäre das 
erste mal, daß Bytes durch irgendeinen äusseren Einfluß (elektrostat. 
Aufladung) umkippen...

Das Bild zeigt eine waagerechte Linie, die senkrechten Pixel sind 
mutmaßlich zurückgelesene RAM-Fehler. Die letzte zurückgelesene 
fehlerhafte Zelle hat den Inhalt 255.

An der Leseroutine liegt's eher nicht, die macht nen gesunden Eindruck.
1
uint8_t ks0108DoReadData(uint8_t first) {  
2
  uint8_t data;
3
  volatile uint8_t i;
4
  unsigned char chip = 0;  //Debug
5
  
6
  if(ks0108Coord.x < 64) 
7
    {
8
     LCD_CMD_PORT.Ks0108E1 = 1;          
9
     chip = 0;
10
    } 
11
  
12
  else if(ks0108Coord.x >= 64) 
13
    {
14
     LCD_CMD_PORT.Ks0108E2 = 1;          
15
     chip = 1;
16
      }
17
18
  if(ks0108Coord.x == 64) 
19
    {                      
20
     ks0108WriteCommand(LCD_SET_ADD,1);  // wuff wuff
21
    }
22
  
23
  //set port to input
24
  initPortDataInKs108();
25
  LCD_CMD_PORT.D_I = 1;     //Debug   // D/I = 1
26
  LCD_CMD_PORT.R_W = 1;     //Debug   // R/W = 1
27
  //sendcmd (LCD_CMD_PORT);
28
29
  PORTH |= (1<<PortD_I);
30
  PORTB |= (1<<PortR_W);
31
  if (chip == 0)  PORTB |= (1<<PortKs0108E1); //ok
32
  if (chip == 1)  PORTB |= (1<<PortKs0108E2); //ok
33
34
  ks0108Enable(chip);
35
36
  //lies Daten von 8 einzelnen Portleitungen, 
37
  //zusammengefasst zu enem Byte:
38
  data = getPortData();
39
40
  LCD_READ = data;    //Debug
41
  ks0108GotoXY(ks0108Coord.x, ks0108Coord.y);  
42
  if(ks0108Inverted)  data = ~data;
43
  
44
  return data;
45
46
}

von holger (Gast)


Lesenswert?

Versuch testweise mal deine CPU langsamer zu takten.
Solche Fehler entstehen wenn man das Display zu schnell ansteuert.

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.