Ich versuche gerade das (Densitron) DD-160128FC-2A in Betrieb zu nehmen
und komme nicht weiter. Es will einfach nichts anzeigen. Das Display hat
einen SEPS-525 Controller (http://www.farnell.com/datasheets/4146.pdf)
und ich hab da so meine Zweifel ob ich alles richtig interpretiert habe.
Es ist folgendermaßen angeschlossen (an einen AVR32):
Pin 1 2 3 4 5 6 7 8 9 10
Fkt NC GND +14V GND 68K-PD |-10K-| +3V NC GND
PIN 11 12 13 14 15 16 17 18 19 bis 24
Fkt GND GND GND 1K-PD 1K-PD SCK MOSI MISO GND
PIN 25 26 27 28 29 30 31 32 33 34 35 bis 37
Fkt D/C CS GND GND nRes GND +3V GND +14V GND NC
Quelltext habe ich hinten dran gehängt (hab der Übersicht wegen alles
Unnötige entfernt, vielleicht nicht ganz fehlerfrei).
Hat jemand Erfahrung mit dem SEPS und SPI Ansteuerung? Schaut mal über
den Code, ob ich da generell irgendetwas missinterpretiert habe. Die SPI
funktioniert soweit (sehe die Bytes übers Osci huschen).
Tips wären ganz nett...
OK, hab jetzt einen kleinen Satz im Datenblatt entdeckt: "*Note : When
the SPI mode is selected, DB[15] pin must be unconnected.". Gesagt,
getan.
Die Initialisierung bewirkt jetzt wenigstens, dass eine Zeile von oben
nach unten langsam mit zufälligen Muster durchblinkt. Und das Display
reagiert auf das Einschalt-Kommando (0x06, 0x01). Lass ich es weg, so
bleibt das Display dunkel. Schicke ich irgendwelche Daten zum Display so
ändert sich nichts und es blinkt weiter fröhlich vor sich hin.
Irgendetwas ist an der Initialisierung noch nicht ok. Suche geht
weiter...
Sorry, aber langsam treibt mich das Display in Richtung Wahnsinn.
Das Display hört auf Kommandos (ein/auschalten etc.). Ein chaotisches
buntes Bild wird angezeigt. Aber ich schaffe es nicht zu löschen oder
sonst irgendwie anders zu beschreiben.
Folgendermaßen gehe ich vor:
- Display initialisieren (ziemlich viele Varianten durchprobiert)
1
send(0x06,0x00);//aus
2
send(0x04,0x01);//REDUCE_CURRENT
3
send(0x02,0x41);//OSC
4
send(0x03,0x00);//CLK
5
send(0x80,0x00);//IREF
6
send(0x13,0x00);//DISPLAY_MODE_SET
7
send(0x14,0x10);//RGB_IF
8
send(0x16,0x66);//MEMORY_WRITE_MODE
9
send(0x17,0x00);//window
10
send(0x18,0x9F);
11
send(0x19,0x00);
12
send(0x1A,0x7F);
13
send(0x3B,0x00);//Scrsav aus
14
send(0x04,0x00);//REDUCE_CURRENT
15
send(0x06,0x01);//an
dann erscheint das zufällige Bild aufm Display
Dann versuche ich einfach mal das DDRAM zu ändern nur um zu sehen ob
sich was tut (bisher ohne Erfolg).
1
send(0x17,0x00);//window
2
send(0x18,0x9F);
3
send(0x19,0x00);
4
send(0x1A,0x7F);
5
send(0x20,0x00);//memmory access pointer
6
send(0x21,0x00);
7
8
9
10
for(i=0;i<160*128;i++)
11
{
12
//send_com(0x22); //variante mit DDRAM_DATA_ACCESS_PORT
13
send_data(0xFFFF);// 16/2*8 Bit (weiss)
14
}
Und nichts passiert. Die Daten flitzen über die SPI (sehe ich im Scope).
1
send_data(unsignedshortdata)//2*8Bit
2
{
3
select_display();
4
gpio_set_gpio_pin(RS);
5
spi_write(&AVR32_SPI0,data>>8);
6
spi_ready(&AVR32_SPI0,CS_DISPLAY);
7
unselect_display();
8
9
//variante 8bit mit cs zw. zwei byte
10
//variante 8bit ohne cs zw. zwei byte
11
//variante 1*16bit statt 2*8bit mit cs
12
//variante 1*16bit statt 2*8bit ohne cs
13
14
select_display();
15
spi_write(&AVR32_SPI0,data);
16
spi_ready(&AVR32_SPI0,CS_DISPLAY);
17
unselect_display();
18
}
Send_data hab schon zig Male geändert. 16Bit und 2*8Bit Daten mit
CS-Flanke zw. den Bytes ohne CS. Mit vorangestellten Commando 0x22 und
ohne. Varianten über Varianten. Ergebnis ist immer das gleiche: ich
bekomme offensichtlich das DDRAM des Displays nicht mit Daten
beschrieben. Auf Kommandos reagiert es, denn ich bekomme es per Commando
ein und ausgeschaltet und die Oscillator-Frequenz lässt sich auch
beinflussen. Nur mit dem RAM haut es nicht hin.
Hat jemand Erfahrung mit dem SEPS 525 Displaycontroller (Google gibt ein
Beispiel her: http://www.omniboard.be/projects/kit2/, leider nur
parallel).
Hat jemand Kritik, Ideen, Vorschläge? Hilfe ist sehr willkommen!!!
Ich habe das Display am EIR laufen und musste auch mit eingen zusammen
geklaubten Code Fetzen aus dem Netz vorlieb nehmen, was die
Initialisierung angeht. Allerdings nutze ich das Display im 9-Bit Modus
am parallelen Datenbus. Die init kann ich mal raussuchen, denn das
Display läuft bei mir.
War aber eine wilde Probiererei, da Densitron keine brauchbaren
Init-Parameter für das Display im Datenblatt abgedruckt hat. Ein Überl,
das bei immer mehr Display Herstellern einreißt. Selbst essentielle
Informationen fehlen gerne schon mal oder man muss sie sich aus Glas und
Controller Datenblatt selber zusammen rechnen. Überl, übel.
Gruß, Ulrich
Hab mich mal an Densitron direkt gewandt und c-code erhalten. Funzt auch
soweit. Erste Analyse erbrachte: Software-SPI. Jetzt müsste ich nur
rausfinden was nun anders ist (ja ja die liebe Zeit, die einem immer
fehlt). Ich bin mir noch nicht sicher ob ich bei der SPI Variante
bleibe, denn der Bildaufbau hängt direkt an der Übertragungsrate der
SPI. Mal sehen ...
Hi Willum,
kannst Du den Code mal mailen? Wäre nett. Ich habe mich gegen SPI
entschieden, weil fast alle SPI-Displays nur das Schreiben, aber nicht
das Lesen des Moduls unterstützen. Man kann dadurch sehr viel mehr
Funktionalität bei sehr viel weniger Speicher Verbrauch erreichen.
Allerdings ist der Pincount sehr hoch, jedenfalls für einen AVR. Aber
selbst bei einem SAM7 wird es mit RAM und Pinnen eng, wenn man keine
Variante mit Datenbus benutzt. Ist immer eine Frage was man will, was
man kann und was übrig bleibt :)
Gruß, Ulrich
Hi!
I am also trying to start up DD-160128FC-2A.. It still remains dark even
tho I tried for over 100hours :((
Did anyone get the SPI interface working?
I'm using at91sam7s256 and the mosi (SDO) is unconnected.
The init code:
Um mich selbst mal zu zitieren:
> Ich bin mir noch nicht sicher ob ich bei der SPI Variante> bleibe, denn der Bildaufbau hängt direkt an der Übertragungsrate der> SPI. Mal sehen ...
Meine SPI ist relativ schnell (24 MHz) aber ich bekomme den
Displayinhalt nicht schnell genug reingeschaufelt. Also bleibt mir nur
noch die Parallelvariante. Ich hab die Routinen angepasst, die Daten
flitzen über den Bus und doch ich bekomme das Display mal wieder nicht
zum Leben erweckt. Das ist zum Mäuse melken, kann denn mal nicht
irgendetwas auf Anhieb gehen?
In einem anderen Forum hab ich gelesen, dass das Timing entscheidend
ist, also hab ich großzügige Waits eingebaut, später kann man sie immer
noch optimieren. Nützt nichts, das Display bleibt einfach dunkel.
Hab mal Auszüge aus meinem Code drangehängt mit der Bitte mal drüber zu
schauen.
Moin,
auch wenn es schon "etwas" länger her ist: Hier ist eine Dokumentation
zum SEPS525 Treiber Chip:
https://docs.google.com/file/d/0B_A2gK_LY7Nyb2M0dElyWFZ0UFU/edit
Falls gewünscht, kann ich auch verschiedene Source Codes
bereitstellen(C++ und C#), habe das Display nämlich im Einsatz.
Lieben Gruß,
Sebastian
Hi Sebastian,
wäre super wenn du ein paar Quellcodes (C++) posten könntest :)
Ich bekomm die Initialisierung hin (buntes Bild) aber ich kann einfach
kein weißes Bild erzeugen.
Benutze 80er Modus 8-Bit parallel/tristate :/
Wäre superschön wenn jemand was handfestes Codemäßig hätte...
mfg
Thomas
Perfekt, danke ;)
Mittlerweile hab ichs auch selbst einigermaßen hinbekommen, bin gerade
an dem Stand mir eigene Zahlen zu malen, und eine Funktion zu schreiben,
welche diese der Reihe nach ausgibt.
Wie ich sehe steuerst du das ganze mit dem Pi - Mich würde interessieren
wie du das mit den Interrupts handlest. Ich bekomm fast schon Probleme
wenn ich damit über den SMBus (100khz) kommunizieren möchte.
Schönes Projekt von dir!
Hallo Thomas,
ich nutze keine Interrupts. Ich lese "ständig" alle IO's ein (in einer
loop).
Was die Geschwindigkeiten des Schreibens angeht, da gebe ich dir
folgenden Rat: Kurze Leitungen!! So wenig Zwischenverdrahtungen wie nur
möglich. Steckbrett meiden. Nutze so viele verschiedene GND-Leitungen
vom Pi wie nur möglich, Stichwort Sternförmige Masseführung. Beachtest
du das nicht, wirst du bei hohen Geschwindigkeiten mit
Grafikfehlern/Abstürzen gestraft. Solltest du einen Levelshifter(5to2.8
oder 3.3to2.8) verwenden, denke an die Entstör-Elkos! Vermeide 3.3V,
weil es den IC zu warm werden lässt. Geh mit mit einem 3.9 Ohm
Widerstand von 3.3 auf 2.8. Ein vollwertiger Spannungsteiler
funktioniert nicht, weil das Display keine ohmsche Last ist. Oder ich
war einfach nur zu dämlich.
Solltest du den rpi nutzen, und du brauchst "mehr speed": Nutze direkten
Speicherzugriff. Sehe dir dazu die Klasse "public unsafe class
TOLEDSPIFastDataBus : TOLEDDataBus" an. Dazu habe ich den Treiber etwas
modifiziert, damit ich an die Speicheradresse rankomm. Findest du auch
in meinem Github-Projekt. Ich nutze das native SPI vom RPI nicht. Hat
irgendwie nicht geklappt. Keine Ahnung warum. SPI-Mode und so natürlich
richig eingestelllt.
Welches OLED-Display nutzt du genau? Ich habe mich nun für das
DD-160128FC-1A entschieden. Ist zwar kleiner, hat dafür aber
brilliantere Farben und die Pixel sind sauberer. Das DD-160128FC-2B hat
hässliche Subpixel, die Farben ließen sich aber vielleicht mit einem
anderen Kontrast-Referenz-Widerstand ändern (also z.B. 30K statt 68k).
Noch was zum DD-160128FC-2B: Das scheint schwerer lieferbar zu sein, als
das DD-160128FC-1A. Welche Displays gibt es eigentlich noch mit dem IC
SEPS-525? Nur falls Densitron irgendwann nicht mehr liefert, ohne dass
ich meine Platine völlig ändern muss. Aber für den Fall packe ich die
Display-Logik auf eine separate Platine (Spannungsversorgung,
Levelshifter, ON-OFF-Mechanismen, ...), damit ich im "Härtefall" nur die
"kleine" Displayplatine auswechseln muss, ein wenig die Software,
anstatt meine ganze Steuerplatine (für den Schachcomputer). Ich habe mir
nämlich sagen lassen, dass OLED-Displays oftmals ganz schnell wieder vom
Markt verschwinden (spezifische Modelle, versteht sich).
Mein Display läuft auf ca. 10-20Mhz (muss ich manchmal ändern, wenn ich
Kabel "schlampig" verlege zu Testzwecken). Ein Bildaufbau ist schnell
genaug um nicht zu sehen, dass er aufgebaut wird. Aber ich bau ja auch
nur inkrepmentell auf (es werden nur die Änderungen Vorher/Nachher
geschrieben). Für komplexe Grafikausgaben nutze ich schlicht die
mächtige Grafikbibliothek von Mono.NET (System.Drawing), generiere
daruas eine Bitmap und schreibe die Änderungen ans Display. Also ich
schlage mich nicht mit einzelnen Zeichen rum ;)
Derzeit arbeite ich am Powerup/Powerdown Mechanismus (Auf
Hardwareebene). Man soll ja nicht auf beides gleichzeitig Saft geben,
wegen der Lebenserwartung. Da mein Produkt aber "haltbar" sein soll,
beachte ich dies natürlich.
Lieben Gruß,
Sebastian