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 | }
|