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:
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
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
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
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
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 :-)
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
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) ?
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
> 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
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
> 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
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
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
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?
> 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
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
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...
;)
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.
:-)
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
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
..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
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
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
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 ;-)
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
..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
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
...
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
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?
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 ;-)
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 ...)
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
...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
> 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
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)
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
> 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
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
voidusart0Init()
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
voidusart0out(charch)
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
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
..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