LCD 128x64 Ram kaputt?

OP #2597668
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
}
Angehängte Dateien:

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