Forum: Mikrocontroller und Digitale Elektronik KS0713 Display.seltsames Problem


von Holm T. (Gast)


Lesenswert?

Ein Freund hat mir so ca. 10 LCD Displays aus irgendwelchen alten 
Kreditkartengeräten angeschleppt und ich mache mich gerade dabei häßlich 
die Dinger zur vernünftiger Funktion zu überreden.

Die Teile scheinen relativ alt zu sein, die Bildfläche sieht grünlich 
aus und die haben eine grüne LED Hintergrundbeleuchtung. Bezeichnung ist 
WD-H12067-6YLYa auf der Platine und manchmal WD-HD12069 auf der 
Rückseite des Displayglases.
Anschluß erfolgt über einen 18 poligen Flexleiter, 2 davon die LED. Der 
Controller ist lt. einer russischen Webseite ein KS0713TB-03 der sich 
wohl identisch zu einem ST7565 anfaßt. der Controller befindet sich als 
silbriger Quader auf dem Flexleiter der Platine zum Displayglas.

https://www.crystalfontz.com/controllers/Samsung/KS0713/233/

Lt. der oben erwähnten Webseite hat der Controller ein Pin mit dem er 
sich vom parallelen 8080 Interface Mode auf SPI umschalten läßt. Ich 
habe die Verdrahtung der Basisplatine eines Displays dahingehend 
geändert und ich bekomme auch mittlerweile ein "Bild". So weit so gut.

Es gibt zum Display selbst offensichtlich kein Datenblatt, es handelt 
sich wohl um was Kundenspezifisches von Wintek. Das Displayglas hat eine 
Auflösung von wohl 128x64 ..wobei das wohl nicht ganz stimmt, das ist 
mein Problem.

Das Datenblatt zum KS0713 (bzw. ST7565) gibt eine Organisation des 
Displaydatenspeichers von 65x132 Byte an, das Ding hat also Reserven.
Dieser Datenbereich ist in 8 Pages zu 128 Byte aufgeteilt und eine 9 
Page die nur jeweils 1Bit zu enthalten scheint..ist mir noch nicht ganz 
klar.
Das Display wird von oben links nach unten rechts beschrieben, wobei ein 
Byte jeweils eine senkrechte Spalte darstellt:
1
Y
2
|012345 Bit 0
3
|012345 Bit 1
4
|012345 Bit 2
5
|012345 Bit 3
6
|012345 Bit 4 ---> Bytes
7
|012345 Bit 5
8
|012345 Bit 6
9
v012345 Bit 7
10
-------------> X

Mein Problem an der Sache ist, dass ich mehr angezeigt bekomme als ich 
möchte, es scheint links neben der 0. Spalte noch eine -1. Spalte zu 
geben, die blöderweise mit irgend einem Bitmuster gefüllt ist. Bei dem 
Display das ich konkret am Wickel habe ist das wohl 0x07, d.h. ich 
bekomme untereinander pro 8-Pixel Zeile jeweils links 3 eingeschaltete 
Pixel und 5 abgeschaltete angezeigt und an diesem Mist beiße ich mir 
gerade die Zähne aus.

Die Routine die das Display löschen soll habe ich schon ein paar mal 
nach diversen Varianten geändert, z.Z. sieht die so aus:
1
 void clear_screen(void) {
2
3
 uint8_t column = 0;
4
 uint8_t page = 0;
5
6
 st7565_command(0x40);  // START_LINE
7
8
 for(page = 0; page < 9; page++)
9
 {
10
        for(column = 0; column < 132; column++)
11
                st7565_data(0x00);
12
13
        st7565_command(0x0);    // COLUMN_ADDRESS_LOW
14
        st7565_command(0x10);   // COLUMN_ADDRESS_HIGH
15
        st7565_command(0xb0 | (0x0f & page)); // Page Address
16
 }
17
}

Das ist im Prinzip das was irgendwelche anderen Leute auch machen, meist 
nur mit 129 Byte pro Zeile. Klar habe ich da auch schon experimentiert.

Ist Jemandem schon mal so ein blödes Display über den Weg gelaufen?
Ich habe jetzt nur Eines der 10 Stück auf SPI umgemodelt, liegt auch 
daran
das ich das als fliegende Verdrahtung an einer MSP430 Platine dran habe 
die sich hier gerade herumtrieb und sich der 0,5er Pitch der 
Flexleiterbuchse so ungern mit Drähten frei fliegend verlängern läßt. Es 
ist natürlich möglich das genau dieses Display einen irgendwie defekten 
Controller hat, ich glaube aber nicht recht dran...

Jemand ne Idee?

Gruß,

Holm

von Crazy Harry (crazy_h)


Lesenswert?

Kannst du mal ein Foto der Displaydarstellung wie von dir beschrieben 
posten?

.... und schreib lauter $AA in die ersten 128 Bytes des Bildspeichers

: Bearbeitet durch User
von Holm T. (Gast)


Angehängte Dateien:

Lesenswert?

Crazy H. schrieb:
> Kannst du mal ein Foto der Displaydarstellung wie von dir beschrieben
> posten?
>
> .... und schreib lauter $AA in die ersten 128 Bytes des Bildspeichers

Kann ich, auch wenn Du mit Sicherheit nichts erkennen wirst..
Auf der Anzeige sind nur die Pixel die eigentlich nicht da sein sollten, 
der restliche Bildinhalt ist gelöscht, wird aber wenn ich was anzeigen 
will auch fehlerfrei angezeigt. Ich bilde mir ein das hängt mit der 
Verdrahtung des Glases und dem Kontroletti zusammen, siehe Seite 19 und 
20 im PDF. Spielen an  dem Parameter Display Start Line (Kommando 0x40 
hat aber bis jetzt nix geändert...

Gruß,

Holm

von Holm T. (Gast)


Angehängte Dateien:

Lesenswert?

Bittesehr...

Muß jetzt leider weg, habe heute Hochzeitstag...

BTW: Tut mir leid, die alte Sony mach sonst Nahaufnahmen ganz hybsch, 
aber mit diesem Display hat sie auch ein Problem.

Gruß,

Holm

von Crazy Harry (crazy_h)


Lesenswert?

Arbeitest du im Display oder hast du einen Teil des RAMs des uC als 
Bildspeicher reserviert und schickst das per Refresh zum LCD?

Controller mit 132x65 Pixel gibt es öfter: SED1530, der von dir erwähnte 
ST7565R, .....

Mach mal eine Doppelschleife.

For A:=0 to 7 do
  Pageadresse 0..7 setzen
  For B:=0 to 127
    0 raus schicken
    Endfor B
  Endfor A

Dann muss das Display leer sein.
Sorry ich progge nicht C ;-)

Harry

von Crazy Harry (crazy_h)


Lesenswert?

Holm T. schrieb:
> Bittesehr...
>
> Muß jetzt leider weg, habe heute Hochzeitstag...
>
> BTW: Tut mir leid, die alte Sony mach sonst Nahaufnahmen ganz hybsch,
> aber mit diesem Display hat sie auch ein Problem.
>
> Gruß,
>
> Holm

Seh ich das richtig, daß das 4 aneinander liegende Linien ohne 
Zwischenraum sind? Du hast %10101010 geschickt? Sieht aus wie 
%11110000????

Glückwunsch :-)

: Bearbeitet durch User
von Holm T. (Gast)


Lesenswert?

Crazy H. schrieb:
> Holm T. schrieb:
>> Bittesehr...
>>
>> Muß jetzt leider weg, habe heute Hochzeitstag...
>>
>> BTW: Tut mir leid, die alte Sony mach sonst Nahaufnahmen ganz hybsch,
>> aber mit diesem Display hat sie auch ein Problem.
>>
>> Gruß,
>>
>> Holm
>
> Seh ich das richtig, daß das 4 aneinander liegende Linien ohne
> Zwischenraum sind? Du hast %10101010 geschickt? Sieht aus wie
> %11110000????
>
> Glückwunsch :-)

Nein. Das sind 4 Linien mit Zwischenräumen a 1px..
Ich habe das was momentan läuft aus einer Arduino Library gebastelt, 
dazu gehört so ein Adafruit Image (bitmap), das kommt völlig korrekt, 
(nach Anpassung der Pagemap) nur eben links daneben die gestrichelte 
senkrechte Linie...
>For A:=0 to 7 do
>  Pageadresse 0..7 setzen
>  For B:=0 to 127
>    0 raus schicken
>    Endfor B
>  Endfor A
>
>Dann muss das Display leer sein.
>Sorry ich progge nicht C ;-)

vergleiche mal:

for(page = 0; page < 9; page++)
 {
        for(column = 0; column < 132; column++)
                st7565_data(0x00);

        st7565_command(0x0);    // COLUMN_ADDRESS_LOW
        st7565_command(0x10);   // COLUMN_ADDRESS_HIGH
        st7565_command(0xb0 | (0x0f & page)); // Page Address
 }
}

Das ist exakt das Selbe, nur das die Pageadresse am Ende erhöht wird und 
man sich das ständige setzten der Column Adresse eigentlich kneifen 
kann, da der Controller die intern nach jedem schreiben selbständig 
erhöht.
Aber das macht keinen Unterschied.

Das Display ist auch leer, der Uart-Debug Mittschnitt erzählt auch das 
alle Bytes 0 gesendet werden, aber das was angezeigt wird entspricht dem 
auf dem ersten Bild.

Es liegt nicht am Programm, das liegt irgendwie an der vergriesgnadelten 
Adressierung der LCD Spalten durch den Kontroller selbst. Ich weiß aber 
absolut Nichts über das LCD Glas und kann zwischen Kontroller und Glas 
nichts messen, Guck mal auf Seite 20 im verlinkten PDF, ich vermute das 
die erste angezeigte Spalte ganz unten im der Tabelle die "COMS" ist, 
allerdings läßt die sich durch löschen der Page 9 (0..8) nicht 
beeindrucken. Die Reden im Datenblatt davon das die COMS für Icons 
gedacht wäre, ich denke die meinen feste LCD Symbole wie z.B. ein 
Batterie Symbol oder Sowas...

Mein Problem ist also das das Bit 0 des ersten Bytes nicht etwa das 
Pixel in Spalte 0 Zeile 0 einschaltet, sondern das in Spalte 1 Zeile 0 
und ich finde nicht wo die Spalte 0 dran klemmt...

BTW: danke.  geht gleich los, Essen gehen..

Gruß,

Holm

von Crazy Harry (crazy_h)


Lesenswert?

Also das versteh ich nicht: st7565_command(0xb0 | (0x0f & page));

Bei mir würde das
ST7565_command($b0+Page);
heißen.

Pro Zeile nur 128 Werte (oder weniger) raus schicken. Das am Anfang 
könnte durch den Autoincrement sein, der dir was in die nächste Zeile 
schickt.

Harry

[Edit]Ach das bedeutet $b0 or ($0f and page) ?

: Bearbeitet durch User
von Holm T. (Gast)


Lesenswert?

Crazy H. schrieb:
> Also das versteh ich nicht: st7565_command(0xb0 | (0x0f & page));
>
> Bei mir würde das
> ST7565_command($b0+Page);
> heißen.
>
> Pro Zeile nur 128 Werte (oder weniger) raus schicken. Das am Anfang
> könnte durch den Autoincrement sein, der dir was in die nächste Zeile
> schickt.
>
> Harry
>
> [Edit]Ach das bedeutet $b0 or ($0f and page) ?

st7565_command(0xb0 | (0x0f & page)); // Page Address

Genau, nach Deiner Notation ($0f AND Pageno) OR $B0
d.h. der Lowteil von Pageno mit $b0 verknüpft.

page++ macht ein Autoinkrement nach der Referenzierung, ++page würde das 
vorher erledigen.

Gruß,

Holm

von Olaf (Gast)


Lesenswert?

> Ist Jemandem schon mal so ein blödes Display über den Weg gelaufen?

Ich hab schon mal ein Display mit einem KS0713 programmiert. (genauso 
wie mindestens zehn andere LCD-Controller). Leider ist das auch schon so 
10Jahre her, ich kann mich aber an nichts ungewoehnliches erinnern. 
Datenblatt lesen, keinen halbgaren Internetcode anderer Leute verwenden, 
coden und geht.

Das einzige was mir damals aufgefallen ist, wenn man die Teile falsch 
initialisiert kann man sie kaputt machen. Ich hab eins das bei einem 
Programmierfehler sehr merkwuerdig defekte Elektrolyse-Pixel bekommen 
hat.

Wenn ich raten soll wuerde ich sagen deine Initialisierung stimmt nicht. 
Irgendein Register fuer den Anfang des darzustellenden Bildschirminhalts 
ist noch nicht korrekt gesetzt.

Olaf

von Holm T. (Gast)


Lesenswert?

Olaf schrieb:
>> Ist Jemandem schon mal so ein blödes Display über den Weg gelaufen?
>
> Ich hab schon mal ein Display mit einem KS0713 programmiert. (genauso
> wie mindestens zehn andere LCD-Controller). Leider ist das auch schon so
> 10Jahre her, ich kann mich aber an nichts ungewoehnliches erinnern.
> Datenblatt lesen, keinen halbgaren Internetcode anderer Leute verwenden,
> coden und geht.

Es ist ja nicht so das ich das DB nicht gelesen hätte, mir fehlen nur 
halt die Informationen über das Display selbst, d.h. wie das LCD genau 
aufgebaut ist und wie es am Controller angeschlossen ist.
Es gibt da z.B. unterschiedliche Duty Cycle Modi oder auch Spannugnen 
fürs LCD.

Ich habe natürlich die gesamte Initialisierung in anderen Quellen 
nachgesehen und an den Parametern gedreht und ausprobiert. Der Effekt 
bleibt aber der Selbe.
>
> Das einzige was mir damals aufgefallen ist, wenn man die Teile falsch
> initialisiert kann man sie kaputt machen. Ich hab eins das bei einem
> Programmierfehler sehr merkwuerdig defekte Elektrolyse-Pixel bekommen
> hat.
>
> Wenn ich raten soll wuerde ich sagen deine Initialisierung stimmt nicht.
> Irgendein Register fuer den Anfang des darzustellenden Bildschirminhalts
> ist noch nicht korrekt gesetzt.
>
> Olaf

Diese Daten werden oben in der Löschroutine gesetzt (2x 4 Bit Adresse),
das komische ist nur das die Spalte 0 nicht auf Spalte 0 liegt, sondern 
auf 1. Von so einer Ummodelei ist nirgends im DB was zu lesen.
Ich vermute das die entsprechende Spalte am konkreten LCD woanders 
angeschlossen ist, das erklärt aber nicht, warum sie sich durch löschen 
des gesamten(!) internen Displayspeichers nicht ausschalten läßt.

Ich werde nachher mal ein 2. Display checken. Evtl. isses ja kaputt, 
komisch bleibt halt nur das ein defekter Spaltentreiber die Vertauschung 
nicht erklärt.

Gruß,

Holm

von Olaf (Gast)


Lesenswert?

> angeschlossen ist, das erklärt aber nicht, warum sie sich durch löschen
> des gesamten(!) internen Displayspeichers nicht ausschalten läßt.

Ich hab das Datenblatt nicht im Kopf, aber loesche mal mit

  for(column = 0; column < 136; column++)

Ich hab schon Displays mit 128x64Pixel gesehen die das gebraucht haben.

> Ich werde nachher mal ein 2. Display checken. Evtl. isses ja kaputt,
> komisch bleibt halt nur das ein defekter Spaltentreiber die Vertauschung
> nicht erklärt.

Das glaube ich nicht.

Ansonsten ignoriere dein Problem erstmal, schreib eine Routine die ein 
Pixel setzt und mal dann mal ein Kreuz von 0,0 nach 127,63 und 127,0 
nach 0,63. Da tritt bei manchen LCDs der Aha-Effekt ein wenn man sieht 
das die Anordnung der Pixel doch ganz anders ist als man gedacht hat.

Olaf

von Holm T. (Gast)


Angehängte Dateien:

Lesenswert?

Ich verarsche Euch doch nicht...
1
                clear_buffer(buffer);
2
                clear_screen();
3
                setpixel(buffer,2,2+i,1);
4
                write_buffer(buffer);
5
                setpixel(buffer,0,2+i,0);
6
                write_buffer(buffer);
7
                i+=8;
8
                if(i>63)
9
                {
10
                        i=0;
11
                }
12
                delay_ms(3000);
13
                for(uint8_t i=0; i<128; i++)
14
                {
15
                        buffer[i]=0xaa;
16
                }
17
                write_buffer(buffer);
18
                delay_ms(3000);
19
                clear_screen();
20
                clear_buffer(buffer);
21
                write_buffer(buffer);
22
                drawline(buffer,0,0,127,63,1);
23
                drawline(buffer,0,63,127,0,1);
24
                write_buffer(buffer);
25
                delay_ms(5000);

Der einzelne Punkt auf pixel3.jpg ist Absicht (siehe Code)

BTW: clear_screen löscht hier (lt. Anweisung) 136 Character/Zeile,
kein Unterschied.

Oben auch noch mal der fragliche Ausschnitt aus dem DB, hier vom 
ST7565R.
Abhängig vom Duty Cycle gibts hier eine Vertauschung der Zeilen, aber 
keine der Spalten. Wenn ich in den Displayram mit der Adresse 0x00 auf 
Page 0 schreibe wird ja auch der Buchstabe oder die Grafik korrekt 
dargestellt, nur eben nicht ab Spalte 0 sondern ab Spalte 1 und mir ist 
völlig schleierhaft woher der Inhalt der Spalte 0 kommt.

Update: Neues Display, neues Glück....oder doch nicht?
Ich habe ein 2. Display da angenäht..absolut identisches Ergebnis, auch 
dieses Bitmuster links ist gleich..war ja von vornherein klar.

Euch gehen auch die Ideen aus?


Gruß,

Holm

von Crazy Harry (crazy_h)


Lesenswert?

Wenn du nur 0en schickst (sonst nichts) und das Display gelöscht ist, 
sind dann die Pixel links immer noch da?

von Holm T. (Gast)


Lesenswert?

Ja. Die ändern sich nie. interessant ist, das wenn ich das Display auf 
Reverse Darstellung umschalte, dann auch die Zwischenräume dieser Spalte 
schwarz werden.

Gruß,
Holm

von Micha (Gast)


Lesenswert?

Holm,

was passiert denn, wenn du das Display einfach nur mit Spannung 
versorgst ohne irgendeine Kommunikation zuzulassen.

Mal nur eine Page beschreiben, was passiert da?

von Olaf (Gast)


Lesenswert?

> Ja. Die ändern sich nie. interessant ist, das wenn ich das Display auf
> Reverse Darstellung umschalte, dann auch die Zwischenräume dieser Spalte
> schwarz werden.

Das zeigt doch ziemlich klar das du es noch nicht geschafft hast die 
richtige Speicherstelle zum loeschen zu finden. :-)

Olaf

von Olaf (Gast)


Lesenswert?

Was mich wundert ist das dein Streifen sehr gleichmaessig aussieht!
Das sieht nicht nach rauschen nach dem einschalten aus.
Kann es sein da du noch einen Bug in deinem C-code hast?

Olaf

von Strichel-Linie (Gast)


Lesenswert?

Wenn's gar nicht wegzubekommen ist: Gib als Erstes den Text:

Bei Bedarf an der Perforation abbrechen

aus.

Dann denken die Leute, es muß so sein.

Nicht hauen
Ich konnte nicht an mich halten...
;)

von Micha (Gast)


Lesenswert?

Schreib uns doch mal bitte den Inhalt von:

st7565_command und st7565_data

Am Ende wird durch einen Fehler dort drin vielleicht die Spaltenadresse 
schon eher inkrementiert als dir lieb ist.

von Holm T. (Gast)


Lesenswert?

:-)

An das mit der Perforation habe ich auch schon gedacht..Problem: ich 
selber bin wohl der einzige Anwender...
Ich finde aber doof das Du Strichel-Linie heißt, ich rede lieber mit 
Menschen...
1
 st7565_command(0xA2);  // <- Bias 1/9 (A3 -> 1/7)
2
 st7565_command(0xA0);  // <- ADC Direction L-R
3
 st7565_command(0xC0);  // <- SHL Direction 0-64
4
 st7565_command(0x25);  // <- Voltage ref
5
 st7565_command(0x81);  // <- Volume mode
6
 st7565_command(0x20);  // <- Volume set
7
 st7565_command(0x00);  // <- This probably isn't required here - it's set below
8
 st7565_command(0x2E);  // <- Booster on, Regulator on, Follower off
9
// st7565_command(0xF8);  // <- Booster ratio
10
// st7565_command(0x03);  // <- Booster ratio
11
 st7565_command(0x2F);  // <- + Follower on
12
 st7565_command(0xE3);  // <- NOP
13
 st7565_command(START_LINE);  // <- Initial display line
14
 st7565_command(0xA6);  // <- Normal display (reverse A7)
15
 st7565_command(0xAF);  // <- turn display on
16
 st7565_command(0xA5);  // <- all Points on
17
 delay_ms(1000);
18
 st7565_command(0xA4);  // <- all Points normal
19
20
 st7565_command(0xB0);  // <- page address = 0
21
 st7565_command(0x10);  // <- column address high = 0
22
 st7565_command(0x00);  // <- column address low = 0
23
}

..enthält mehr als die ursprüngliche Version..
1
#if 0
2
  // LCD bias select
3
  st7565_command(CMD_SET_BIAS_9);
4
  // ADC select
5
  st7565_command(CMD_SET_ADC_RVERSE);
6
  // SHL select
7
  st7565_command(CMD_SET_COM_NORMAL);
8
  // Initial display line
9
  st7565_command(CMD_SET_DISP_START_LINE);
10
11
  // turn on voltage converter (VC=1, VR=0, VF=0)
12
  st7565_command(CMD_SET_POWER_CONTROL | 0x4);
13
  // wait for 50% rising
14
  delay_ms(50);
15
16
  // turn on voltage regulator (VC=1, VR=1, VF=0)
17
  st7565_command(CMD_SET_POWER_CONTROL | 0x6);
18
  // wait >=50ms
19
  delay_ms(50);
20
21
  // turn on voltage follower (VC=1, VR=1, VF=1)
22
  st7565_command(CMD_SET_POWER_CONTROL | 0x7);
23
  // wait
24
  delay_ms(10);
25
26
  // set lcd operating voltage (regulator resistor, ref voltage resistor)
27
  //st7565_command(CMD_SET_RESISTOR_RATIO | 0x6);
28
  st7565_command(CMD_SET_RESISTOR_RATIO | 0x5);
29
#endif

ohne Unterschied, ich experimentiere ja..
1
void st7565_command(uint8_t c) {
2
  A0_LOW;
3
  asm volatile("nop");
4
  usart0out(c);
5
}
6
7
void st7565_data(uint8_t c) {
8
  A0_HIG;
9
  asm volatile("nop");
10
  usart0out(c);
11
}
12
void st7565_set_brightness(uint8_t val) {
13
    st7565_command(CMD_SET_VOLUME_FIRST);
14
    st7565_command(CMD_SET_VOLUME_SECOND | (val & 0x3f));
15
}
16
17
18
void write_buffer(uint8_t *buffer) {
19
  uint8_t c, p;
20
21
  for(p = 0; p < 8; p++) {
22
23
    st7565_command(CMD_SET_PAGE | pagemap[p]);                  // 0xB0 | pagemap[p]
24
    st7565_command(CMD_SET_COLUMN_LOWER | (0x0 & 0xf));         // 0x00 | ...
25
    st7565_command(CMD_SET_COLUMN_UPPER | ((0x0 >> 4) & 0xf));  // 0x10 | ...
26
    st7565_command(CMD_RMW);                                    // 0xe0 | Cancel Set Modify-Read
27
   
28
    for(c = 0; c < 128; c++)
29
    {
30
        st7565_data(buffer[(128*p)+c]); // write buffer out
31
    }
32
  }
33
}

Man muß den ganzen Spannungsversorgungskram im Display erst einschalten, 
was ausgeben ohne zu initialisieren funzt also nicht.
START_LINE oben ist definiert mit 0x40, das ist also die Adresse 0.
Das ich nicht die richtige Stelle zum beschreiben gefunden habe ist 
naheliegend ..allerdings habe ich Alles beschrieben was der Chip an 
Display RAM zu bieten hat, mehr gibts lt. Datenblatt leider nicht.

Gruß,

Holm

von Dieter F. (Gast)


Lesenswert?

Holm T. schrieb:

>  for(page = 0; page < 9; page++)
>  {
>         for(column = 0; column < 132; column++)
>                 st7565_data(0x00);
>
>         st7565_command(0x0);    // COLUMN_ADDRESS_LOW
>         st7565_command(0x10);   // COLUMN_ADDRESS_HIGH
>         st7565_command(0xb0 | (0x0f & page)); // Page Address
>  }
> }

Drehe es doch bitte mal um:
1
for(page = 0; page < 9; page++)
2
 {
3
        st7565_command(0xb0 | (0x0f & page)); // Page Address
4
        st7565_command(0x00);                 // COLUMN_ADDRESS_LOW
5
        st7565_command(0x10);                 // COLUMN_ADDRESS_HIGH
6
7
        for(column = 0; column < 132; column++)
8
                st7565_data(0x00);
9
 }

und zeige mal Deine st7565_command() und st7565_data() Funktionen.

von Micha (Gast)


Lesenswert?

Kannst ja spaßenshalber mal aus dem NOP ein längeres delay machen, falls 
bei der ersten Spalte das vielleicht nicht immer definiert ist

von Holm T. (Gast)


Lesenswert?

Dieter F. schrieb:
[..]
>
> Drehe es doch bitte mal um:
>
1
> for(page = 0; page < 9; page++)
2
>  {
3
>         st7565_command(0xb0 | (0x0f & page)); // Page Address
4
>         st7565_command(0x00);                 // COLUMN_ADDRESS_LOW
5
>         st7565_command(0x10);                 // COLUM
6
7
[c]
8
#if 0
9
 for(page = 0; page < 9; page++)
10
 {
11
        usart1Puts("Page:");
12
        usart1Putx(page);
13
        usart1Puts("\r\n");
14
        for(column = 0; column < 128; column++)
15
        {
16
                st7565_data(0x00);
17
18
        }
19
20
        st7565_command(0x0);    // COLUMN_ADDRESS_LOW
21
        st7565_command(0x10);   // COLUMN_ADDRESS_HIGH
22
        st7565_command(0xb0 | (0x0f & page)); // Page Address
23
 }
24
#else
25
for(page = 0; page < 9; page++)
26
 {
27
        st7565_command(0xb0 | (0x0f & page)); // Page Address
28
        st7565_command(0x00);                 // COLUMN_ADDRESS_LOW
29
        st7565_command(0x10);                 // COLUMN_ADDRESS_HIGH
30
31
        for(column = 0; column < 132; column++)
32
                st7565_data(0x00);
33
 }
34
#endif
35
}

..die Fotos willst Du jetzt nicht sehen.... das Selbe in Grün.
Ich hatte das auch in einer vorhergehenden Variante so. Die Column 
Adressen werden bereits bei der Initialisierung gesetzt so das der 
Counter auf 0 steht bevor was ausgegeben wird.

> und zeige mal Deine st7565_command() und st7565_data() Funktionen.

Die stehen oben schon da, das ist ne Ausgabe an den USART im SPI Mode, 
vorher wird das A0 Pin zur Unterscheidung von Control und Daten 
entsprechend gesetzt.

Es liegt auch nicht an der Initialisierung, ich hatte die indessen auf 
das Notwendigste beschränkt, ohne überhaupt irgendwelche Daten 
auszugeben, sieht genauso aus wie nach clear_screen(), mit Abreißkante.


Gruß,

Holm

von Micha (Gast)


Lesenswert?

Habe gerade noch ne andere Routine gefunden, die schreiben erst ein FF 
hin, warum auch immer:
1
void write_buffer(uint8_t *buffer) {
2
  uint8_t c, p;
3
4
  for(p = 0; p < 8; p++) {
5
    st7565_command(CMD_SET_PAGE | pagemap[p]);
6
    st7565_command(CMD_SET_COLUMN_LOWER | (0x0 & 0xf));
7
    st7565_command(CMD_SET_COLUMN_UPPER | ((0x0 >> 4) & 0xf));
8
    st7565_command(CMD_RMW);
9
    st7565_data(0xff);
10
 
11
    for(c = 0; c < 128; c++) {
12
      st7565_data(buffer[(128*p)+c]);
13
    }
14
  }
15
}//write_buffer

von Holm T. (Gast)


Lesenswert?

Micha schrieb:
> Kannst ja spaßenshalber mal aus dem NOP ein längeres delay machen, falls
> bei der ersten Spalte das vielleicht nicht immer definiert ist

Das nop war auch nur ein Test, geht ohne ganz genauso wie in Zeitlupe...

:-|

Gruß,

Holm

von Micha (Gast)


Lesenswert?

Habe auch noch ne andere Stelle gefunden, dort heißt das dann einfach
col + ST7565_STARTBYTES

ST7565_STARTBYTES ist hier mit 1 definiert.

von Holm T. (Gast)


Lesenswert?

Micha schrieb:
> Habe gerade noch ne andere Routine gefunden, die schreiben erst ein FF
> hin, warum auch immer:
>
>
1
> void write_buffer(uint8_t *buffer) {
2
>   uint8_t c, p;
3
> 
4
>   for(p = 0; p < 8; p++) {
5
>     st7565_command(CMD_SET_PAGE | pagemap[p]);
6
>     st7565_command(CMD_SET_COLUMN_LOWER | (0x0 & 0xf));
7
>     st7565_command(CMD_SET_COLUMN_UPPER | ((0x0 >> 4) & 0xf));
8
>     st7565_command(CMD_RMW);
9
>     st7565_data(0xff);
10
> 
11
>     for(c = 0; c < 128; c++) {
12
>       st7565_data(buffer[(128*p)+c]);
13
>     }
14
>   }
15
> }//write_buffer
16
>

Das kann ich Dir sagen denn es scheint sich um genau die Quelle zu 
handeln (adafruit) die ich in der Mache hatte. Dieses 0xff erzeugt in 
Spalte 0 eine senkrechte schwarze Linie..da hat sich wohl Jemand 
gewundert was die blöden Striche links machen..

..ich habe aber gerade was gefunden bei extrem langsamen Zeichnen.
Das LCD wird von unten nach oben gelöscht, und während des Löschens 
ändern sich die kurzen aus 3 Punkten bestehenden Striche in einzelene 
Dots. Beim nächsten Beschreiben sind die Striche wieder da..
Ich schaue mir das jetzt genauer an.

Gruß,
Holm

von Micha (Gast)


Lesenswert?

Holm T. schrieb:
> ..ich habe aber gerade was gefunden bei extrem langsamen Zeichnen.

Habe ich doch gleich gesagt, dass da ein Delay rein muss... wenn auch 
nur zur Fehlersuche ;-)

von Micha (Gast)


Lesenswert?

ABer schau mal hier:
1
        st7565_command(CMD_SET_COLUMN_LOWER | ((col+ST7565_STARTBYTES) & 0xf));
2
        st7565_command(CMD_SET_COLUMN_UPPER | (((col+ST7565_STARTBYTES) >> 4) & 0x0F));
3
        st7565_command(CMD_RMW);
4
 
5
        for(; col <= maxcol; col++) {
6
            st7565_data(st7565_buffer[(128*p)+col]);
7
        }

Dort scheint es auch eine Spalte mehr zu geben (eben diese Konstante 
ST7565_STARTBYTES)

https://os.mbed.com/users/masato/code/st7565LCD/docs/29ff79184a05/st7565LCD_8cpp_source.html

von Dieter F. (Gast)


Lesenswert?

Holm T. schrieb:
> for(page = 0; page < 9; page++)

Mach mal bitte aus der 9 eine 8 :-)

von Holm T. (Gast)


Angehängte Dateien:

Lesenswert?

hier erst mal der Effekt:
http://www.tiffe.de/images/display-vid.mpg ..14MB..lädt noch einen 
Moment, habe hier nur 6Mbits/s

@Micha: ..es könnte sein, dass Du fast Recht hast:

#ifdef ST7567
#define ST7565_STARTBYTES 0
const uint8_t pagemap[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
#else
#define ST7565_STARTBYTES 1
const uint8_t pagemap[] = { 3, 2, 1, 0, 7, 6, 5, 4 };
#endif

Ich habe in der Arduino Bibliothek die ursprüngliche Pagemap von

const uint8_t pagemap[] = { 3, 2, 1, 0, 7, 6, 5, 4 };

auf

const uint8_t pagemap[] = { 7, 6, 5, 4, 3, 2, 1, 0 };

ändern müssen ..sonst gabs Kuddelmuddel auf dem Display.
Das könnte bedeuten, das ich mich mal nach einem DB für den
ST7567 umsehen sollte...


Update: ..aha..1-Bit Icons..na so ein Scheiß aber auch..

Gruß,

Holm

von Holm T. (Gast)


Lesenswert?

..der ST7567 ist nicht anders als der KS0713 oder der ST7565.
Der Offset um eins verschiebt nur den Bildinhalt um ein Pixel nach 
rechts, das bringt im konkreten Falle gar nichts.

Helft mir mal bitte im Datenblatt die Stelle mit diesen Icons zu 
begreifen, es gibt eine zusätzliche Page 9 bei in der nur das Bit 0 
bewertet wird.
Was aber bewirkt das? Es gibt acht "normale" Pages die 8 8 Bit breite 
Streifen über das Bild schreiben, wo diese  Streifen auf dem LCD 
erscheinen ist abhängig vom konkreten Page Mapping, weshalb die Treiber 
da ein Feld für eine Umsortierung (pagemap9 zur Verfügung stellen.

Ich habe jetzt aber nur eine Page 9 mit jeweils Bit 0 für diese 1 Bit 
Icons.
Muß ich mir diese Page um 90° nach links gedreht vorstellen auf dem Bild 
datas.jpg hier: 
Beitrag "Re: KS0713 Display.seltsames Problem"

Ich zweifele mittlerweile daran das meine SPI auch das überträgt was sie 
soll obwohl ich da schon ein anderes VFD mit SPI dran hatte. Ich kann 
mir zwar nicht vorstellen das die ganze restliche Geschichte problemlos 
funktioniert und dort dennoch ein Fehler steckt, aber mir wird einfach 
nicht klar was hier los ist. Die anderen Beispieltreiber kümmern sich 
einen Scheißdreck um diese "Icons".

Gruß,

Holm

von Dieter F. (Gast)


Lesenswert?

Holm T. schrieb:
> Helft mir mal bitte im Datenblatt die Stelle mit diesen Icons zu
> begreifen, es gibt eine zusätzliche Page 9 bei in der nur das Bit 0
> bewertet wird.

Nö - Page 8.

Holm T. schrieb:
> Was aber bewirkt das?

Offensichtlich kann man damit vordefinierte "Symbole" auf dem Display 
(je nach Kunde) ansteuern.

Holm T. schrieb:
> Ich habe jetzt aber nur eine Page 9 mit jeweils Bit 0 für diese 1 Bit
> Icons.

8 - Acht :-) (= 9. Page)

Holm T. schrieb:
> Muß ich mir diese Page um 90° nach links gedreht vorstellen auf dem Bild
> datas.jpg hier:
> Beitrag "Re: KS0713 Display.seltsames Problem"

Nein. Wenn Du diese Seite (Page) ansprichst schreibst Du (meiner Meinung 
nach) immer an die erste Stelle der Folge-Page die Adresse der 
"Folge-Page", da diese "Page" nur "Kundenbezogen" existiert (dafür gibt 
es einen Pin, wenn ich es richtig gesehen habe).

Wenn dieser "Pin" nicht aktiv ist schreibst Du die Nummer der aktuellen 
Page (7) immer an erster Stelle der neuen Page. So erkläre ich mir das 
...

von Holm T. (Gast)


Lesenswert?

Dieter F. schrieb:
> Holm T. schrieb:
>> Helft mir mal bitte im Datenblatt die Stelle mit diesen Icons zu
>> begreifen, es gibt eine zusätzliche Page 9 bei in der nur das Bit 0
>> bewertet wird.
>
> Nö - Page 8.
..ja oder 9 wie im DB beschrieben, "off by one" ist mir ein Begriff.

>
> Holm T. schrieb:
>> Was aber bewirkt das?
>
> Offensichtlich kann man damit vordefinierte "Symbole" auf dem Display
> (je nach Kunde) ansteuern.

Ja, schön, nur das das be i mir mehr oder weniger sinnlose Pixel in 
Spalte 0 sind.

>
> Holm T. schrieb:
>> Ich habe jetzt aber nur eine Page 9 mit jeweils Bit 0 für diese 1 Bit
>> Icons.
>
> 8 - Acht :-) (= 9. Page)
>
> Holm T. schrieb:
>> Muß ich mir diese Page um 90° nach links gedreht vorstellen auf dem Bild
>> datas.jpg hier:
>> Beitrag "Re: KS0713 Display.seltsames Problem"
>
> Nein. Wenn Du diese Seite (Page) ansprichst schreibst Du (meiner Meinung
> nach) immer an die erste Stelle der Folge-Page die Adresse der
> "Folge-Page", da diese "Page" nur "Kundenbezogen" existiert (dafür gibt
> es einen Pin, wenn ich es richtig gesehen habe).
>
Verstehschni.

> Wenn dieser "Pin" nicht aktiv ist schreibst Du die Nummer der aktuellen
> Page (7) immer an erster Stelle der neuen Page. So erkläre ich mir das
> ...

woher hast Du das(konkret?)

Gruß,

Holm

von Dieter F. (Gast)


Lesenswert?

Holm T. schrieb:
> ..ja oder 9 wie im DB beschrieben, "off by one" ist mir ein Begriff.

Wo - KS0713?

Holm T. schrieb:
> Ja, schön, nur das das be i mir mehr oder weniger sinnlose Pixel in
> Spalte 0 sind.

Wenn Du Page 8 beschreibst ... was Du ja machst

Holm T. schrieb:
> Verstehschni.

Da habe ich auch noch Verständnisprobleme - da fabuliere ich einfach :-)

Holm T. schrieb:
> woher hast Du das(konkret?)

Aus dem Datenblatt (wenn ich es richtig interpretiere).

Ws passiert denn, wenn Du

Mach mal bitte aus der 9 eine 8 :-)"

machst?

von Olaf (Gast)


Lesenswert?

Ich hab gerade mal geschaut. Das ist mein Code um das KS0713 zu 
loeschen:

void ks0713_pageadr(unsigned char data)
{
  ks0713_writecontrol((data & 0x0f) | 0xb0);
}

void ks0713_columnadr(unsigned char data)
{
  ks0713_writecontrol(((data & 0xf0)>>4) | 0x10); /* Highnibble */
  ks0713_writecontrol(data & 0x0f);               /* LowNibble  */
}

void ks0713_clrscr(void)
{ unsigned char i,j;

  for (i=0;i<8;i++)
  {
    ks0713_pageadr(i);
    for (j=0;j<128;j++)
    {
       ks0713_columnadr(j);
       ks0713_writedata(0x00);
    }
  }
}

Bei mir funktioniert das....

Olaf

von Crazy Harry (crazy_h)


Lesenswert?

Dieter F. schrieb:
> Holm T. schrieb:
>> Ja, schön, nur das das be i mir mehr oder weniger sinnlose Pixel in
>> Spalte 0 sind.
>
> Wenn Du Page 8 beschreibst ... was Du ja machst

Ja aber mit Nullen also sollte doch alles gelöscht sein.

Hast du eigentlich mal die Pixel auf dem Display gezählt? Hab ich grad 
gemacht: es sind 128x64 ..... also nix mit Page 8 ;-)

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Crazy H. schrieb:
> Hast du eigentlich mal die Pixel auf dem Display gezählt? Hab ich grad
> gemacht: es sind 128x64 ..... also nix mit Page 8 ;-)

Hast Du gelesen, was ich geschrieben habe?

Dieter F. schrieb:
> Nein. Wenn Du diese Seite (Page) ansprichst schreibst Du (meiner Meinung
> nach) immer an die erste Stelle der Folge-Page die Adresse der
> "Folge-Page", da diese "Page" nur "Kundenbezogen" existiert (dafür gibt
> es einen Pin, wenn ich es richtig gesehen habe).
>
> Wenn dieser "Pin" nicht aktiv ist schreibst Du die Nummer der aktuellen
> Page (7) immer an erster Stelle der neuen Page. So erkläre ich mir das
> ...

Und da bei Olaf das Löschen mit Page-Counter < 8 funktioniert sollte da 
etwas dran sein.


Wenn Du schon am zählen bist - wie viele Pixel malt er denn pro Zeile 
mit seinem Programm? (nur die gewollten ...)

von Holm T. (Gast)


Lesenswert?

Ich werde den Code oben mal ausprobieren, aber mir war schon von 
vornherein klar das es eine Page0 bis 7 gibt und eine Page 8 ...oder 
aber eben 9, je nach dem von wo man anfängt zu zählen.
Ich habe 9 Pages mit 0-en gefüllt..damit sollte doch eigentlich der RAM 
leer sein. Ein Pin zum Umschalten für die Pages ist mir nicht bekannt, 
es gibt nur eines zum Umschalten zwischen Daten und Control Codes (A0) 
und as wird durch die Ausgaberoutinen berücksichtigt, anderenfalls wäre 
es mit wohl nicht möglich gewesen Bilder darzustellen oder den Kontrast 
anzupassen.

Ich setze mich später heute da wieder ran.

Gruß,

Holm

von Holm T. (Gast)


Lesenswert?

1
void st7565_command(uint8_t c) {
2
  A0_LOW;
3
  mwait();
4
  usart0out(c);
5
}
6
7
void st7565_data(uint8_t c) {
8
  A0_HIG;
9
  mwait();
10
  usart0out(c);
11
}
12
13
void ks0713_pageadr(unsigned char data)
14
{
15
  st7565_command((data & 0x0f) | 0xb0);
16
}
17
18
void ks0713_columnadr(unsigned char data)
19
{
20
  st7565_command(((data & 0xf0)>>4) | 0x10); /* Highnibble */
21
  st7565_command(data & 0x0f);               /* LowNibble  */
22
}
23
24
void ks0713_clrscr(void)
25
{ unsigned char i,j;
26
27
  for (i=0;i<8;i++)
28
  {
29
    ks0713_pageadr(i);
30
    for (j=0;j<128;j++)
31
    {
32
       ks0713_columnadr(j);
33
       st7565_data(0x00);
34
    }
35
  }
36
}


...das Ergebnis sieht interessant aus..

Prosa nützt leider nix, deswegen hier wieder ein Video (das die Sorge 
über meine Frau ob sie mir ausreichen Kaffee gibt ad absurdum führt..)

https://www.tiffe.de/images/MOV03145.MPG


Gruß,

Holm

von Crazy Harry (crazy_h)


Lesenswert?

Am Anfang des Videos ist das Display komplett gelöscht --> 
Initialisierung?
Dann ist es komplett schwarz - was hast du da gemacht?

von Olaf (Gast)


Lesenswert?

> https://www.tiffe.de/images/MOV03145.MPG

Hm..der Fehler sitzt auf jedenfall vor dem Bildschirm. :-) Du hast 
sicher kein Hardwareproblem.

Es scheint mir auffaellig das du oft Fehler im linken Pixel hast und da 
eine gewisse Regelmaessigkeit drin ist.

Hast du den richtigen SPI-Mode? Du weisst das oft zwei der vier Modis 
funktionieren, aber einer dann direkt auf der Flanke umschaltet wo du es 
nicht haben willst?

Ansonsten wuerde ich sagen Ossi ran und sich mal die Uebertragung 
anschauen. Insbesondere zu dem Zeitpunkt wo du mitten auf dem Bild auch 
die falschen Striche hast. Dazu im Programm Trigger an einem unbenutzten 
Port ausgeben.

Wenn dein Kabel laenger ist wie 5-10cm dann wuerde ich mir auch mal 
Gedanken um die Signalqualitaet auf dem Kabel machen. Besonders wenn du 
einen relativ schnellen Prozessor hast der entsprechend schnelle Treiber 
hat. Mach dann mal 100R+47pF auf dem Display an die Clockleitung. Wenn 
moeglich dann den Ausgangsstrom am Port runterstellen. Bei manchen 
Herstellern heisst das auch "Slow".

Olaf

von Holm T. (Gast)


Lesenswert?

Crazy H. schrieb:
> Am Anfang des Videos ist das Display komplett gelöscht -->
> Initialisierung?
> Dann ist es komplett schwarz - was hast du da gemacht?

Das ist ok so, die Initialisierung schaltet das Ding kurz auf Reverse 
Betrieb um.
1
st7565_command(0xA2);  // <- Bias 1/9 (A3 -> 1/7)
2
 st7565_command(0xA0);  // <- ADC Direction L-R
3
 st7565_command(0xC0);  // <- SHL Direction 0-64
4
 st7565_command(0x25);  // <- Voltage ref
5
 st7565_command(0x81);  // <- Volume mode
6
 st7565_command(0x20);  // <- Volume set
7
 st7565_command(0x00);  // <- This probably isn't required here - it's set below
8
 st7565_command(0x2E);  // <- Booster on, Regulator on, Follower off
9
// st7565_command(0xF8);  // <- Booster ratio
10
// st7565_command(0x03);  // <- Booster ratio
11
 st7565_command(0x2F);  // <- + Follower on
12
 st7565_command(0xE3);  // <- NOP
13
 st7565_command(START_LINE);  // <- Initial display line
14
 st7565_command(0xA6);  // <- Normal display (reverse A7)
15
 st7565_command(0xAF);  // <- turn display on
16
 st7565_command(0xA5);  // <- all Points on
17
 delay_ms(3000);
18
 st7565_command(0xA4);  // <- all Points normal

Gruß,

Holm

von Holm T. (Gast)


Lesenswert?

Olaf schrieb:
>> https://www.tiffe.de/images/MOV03145.MPG
>
> Hm..der Fehler sitzt auf jedenfall vor dem Bildschirm. :-) Du hast
> sicher kein Hardwareproblem.
>
> Es scheint mir auffaellig das du oft Fehler im linken Pixel hast und da
> eine gewisse Regelmaessigkeit drin ist.

Naja..ganz so viel waren es vorher nicht..
>
> Hast du den richtigen SPI-Mode? Du weisst das oft zwei der vier Modis
> funktionieren, aber einer dann direkt auf der Flanke umschaltet wo du es
> nicht haben willst?
>
Ich habe alle 4 Modis getestet um solchen Käse auszuschließen, schon 
befor ich mich hier überhaupt gemeldet hatte, allerdings mit Deinem code 
noch nicht.

> Ansonsten wuerde ich sagen Ossi ran und sich mal die Uebertragung
> anschauen. Insbesondere zu dem Zeitpunkt wo du mitten auf dem Bild auch
> die falschen Striche hast. Dazu im Programm Trigger an einem unbenutzten
> Port ausgeben.
>
> Wenn dein Kabel laenger ist wie 5-10cm dann wuerde ich mir auch mal
> Gedanken um die Signalqualitaet auf dem Kabel machen. Besonders wenn du
> einen relativ schnellen Prozessor hast der entsprechend schnelle Treiber
> hat. Mach dann mal 100R+47pF auf dem Display an die Clockleitung. Wenn
> moeglich dann den Ausgangsstrom am Port runterstellen. Bei manchen
> Herstellern heisst das auch "Slow".
>
> Olaf

Kabel ist vllt. 8cm lang..ich werde morgen mal den SPI Takt runter 
nehmen.

Gruß,

Holm

von Olaf (Gast)


Lesenswert?

> Kabel ist vllt. 8cm lang..ich werde morgen mal den SPI Takt runter
> nehmen.

Die Geschwindigkeit des Taktes ist fuer die Steilheit der Flanken und 
der damit verbundenen Probleme vollkommen irrelevant.

Ich sag das uebrigens nicht ohne Grund. Ich hatte letztens auch ein 
Problem mit einem Display. Allerdings mit einem S6B0741 drauf.

Olaf

von Holm T. (Gast)


Lesenswert?

Olaf schrieb:
>> Kabel ist vllt. 8cm lang..ich werde morgen mal den SPI Takt runter
>> nehmen.
>
> Die Geschwindigkeit des Taktes ist fuer die Steilheit der Flanken und
> der damit verbundenen Probleme vollkommen irrelevant.
>
> Ich sag das uebrigens nicht ohne Grund. Ich hatte letztens auch ein
> Problem mit einem Display. Allerdings mit einem S6B0741 drauf.
>
> Olaf

Naja, das ist hier auch nicht das  erste Display das ich betreibe und 
auch nicht die erste SPI Hardware.
Ich hätte ja kein Problem damit wenn irgendwelche irregulären Pixel 
gesetzt würden oder Controlsequenzen nicht ausgeführt werden würden, 
aber die Tatsache das ich den gesamte Bildinhalt fehlerfrei übertragen 
bekomme läßt mich daran zweifeln da die Ursache da zu finden ist. Der 
Controller ist ein MSP430F1611, nicht das neueste Modell und auch mit 
seinen 8Mhz Takt nicht übermäßig schnell. Irgendwo eingefügte 
Verzögerungen haben auch nie irgendwelche Effekte gehabt, genauso wie 2 
Displays exakt das Selbe tun.

Hier mal die Initialisierung von USART0 wenn Du einen Blick drauf werfen 
möchtest:
1
void usart0Init()
2
{                               // USART0 in SPI Mode
3
                                // MSB first clocked out!!
4
        U0CTL=SWRST;
5
        U0CTL|=CHAR|SYNC|MM|SWRST;
6
        ME1|=USPIE0;
7
        U0TCTL=CKPL|SSEL1|SSEL0|STC|TXEPT;
8
        U0BR0=16;               // 8192MHz/16 = 512Khz
9
        U0BR1=0;
10
        U0MCTL=0;
11
        IE1&=~(UTXIE0|URXIE0);
12
        U0CTL&=~(SWRST);
13
        U0TXBUF=0;
14
}
15
16
void usart0out(char ch)  
17
{
18
#if !defined SPI_INT   
19
        while(!(U0TCTL&TXEPT));
20
        //U0TXBUF=mirror((uint8_t) ch); // transmit first char
21
        U0TXBUF=(uint8_t) ch;   // transmit first char
22
23
#else
24
        //spi0putc(mirror((uint8_t)ch));
25
        spi0putc((uint8_t)ch);
26
#endif
27
}

SPI_INT ist nicht aktiv...
Da die USART nur MSB first kann gabs in einer anderen Anwendung die 
funktion mirror() die die Bits spiegelt, Probleme hatte ich mit diesem 
Display aber nicht...(12 stelliges VFD von Pollin) Die Umlaufpuffer 
Geschichte mit Interrupt ist hier gar nicht aktiv..(spi0putc())

Gruß,

Holm

von Holm T. (Gast)


Lesenswert?

Ok, Auflösung des Rätsels, ich bekomme jetzt fehlerfreie Bilder:
1
void clear_screen(void) {
2
    uint8_t p, c;
3
    volatile uint8_t loop;
4
5
    for(p = 0; p < 8; p++)
6
    {
7
        st7565_command(CMD_SET_PAGE | p);
8
        for(c = 0; c < 129; c++)
9
        {
10
                st7565_command((CMD_SET_COLUMN_LOWER) | (0));           // 0x00 | ...
11
                st7565_command(CMD_SET_COLUMN_UPPER | (0));     // 0x10 | ...
12
                st7565_command(CMD_RMW);                                        // 0xe0 | Cancel Set Modify-Read
13
                for(loop = 0; loop < 8; loop++);
14
                st7565_data(0x0);
15
        }
16
    }
17
}
18
19
20
void write_buffer(uint8_t *buffer) {
21
  uint8_t c, p;
22
  volatile uint8_t loop;
23
24
  for(p = 0; p < 8; p++)
25
  {
26
27
    st7565_command(CMD_SET_PAGE | pagemap[p]);                  // 0xB0 | pagemap[p]
28
    st7565_command((CMD_SET_COLUMN_LOWER) | (0x0 & 0xf));               // 0x00 | ...
29
    st7565_command(CMD_SET_COLUMN_UPPER | ((0x0 >> 4) & 0xf));  // 0x10 | ...
30
    st7565_command(CMD_RMW);                                    // 0xe0 | Cancel Set Modify-Read
31
    for(loop = 0; loop < 8; loop++);
32
33
    for(c = 0; c < 128; c++)
34
    {
35
        st7565_data(buffer[(128*p)+c]); // write buffer out
36
    }
37
  }
38
}

Die Lösung ist in beiden Fällen die Verzögerung nach 
st7565_command(CMD_RMW) und dem Ausgeben der Daten, bei write_buffer 
halt die aus dem Puffer und bei clear_screen 0x0. Der Controller auf dem 
Display braucht zu viel Zeit und verschluckt sich nach CMD_RW (0xE0) am 
ersten Datenbyte wenn es unmittelbar darauf folgt, deswegen die for 
Schleife dazwischen.
Das Kommando CMD_RW ist 0xE0 ..was auch klar macht das da keine 7 diesen 
Strich gebildet hat, sondern das E, Man kann CMD_RW auch weglassen, 
prompt bekomme ich einen einzelnen Punkt angezeigt der von 
CMD_SET_COLUMN_UPPER (0x10) stammt.

Die Displays haben zwar Alle mehr oder weniger den selben Controller, 
aber u.U. unterschiedliche interne Taktfrequenzen die wohl von den 
beschalteten Kapazitäten abhängig sind, das erklärt warum Viele kein 
Problem hatten, ich aber mit dieser speziellen undokumentierten Sorte 
Display. Es ist evtl. ziemlich langsam...

Ein Problemchen habe ich noch, ich habe auf der obersten Zeile ganz 
rechts einen ständig eingeschalteten einzelnen Punkt der verschwindet, 
wenn ich bei write_buffer() pro Page ein weiteres 0x0 ausgebe. Ich muß 
jetzt wohl wirklich mal die Pixel zählen..

..hat sich ohne was zu tun irgendwie erledigt...

Dank an Alle die bisher hier geholfen haben!

Gruß,

Holm

von Crazy Harry (crazy_h)


Lesenswert?

Den verstehe ich als nicht-C-Programmierer nicht:
for(c = 0; c < 129; c++)

Das ist 0..128? Es sind doch nur 0..127 in der horizontalen.

von Holm T. (Gast)


Lesenswert?

..der Chip hat RAM für 132x65, es wird also eine Spalte mehr gelöscht 
als angezeigt wird.

Hier noch ein Beweisvideo: https://www.tiffe.de/images/MOV03155.MPG

Gruß,

Holm

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.