Hallo, ich möchte mit einem FPGA Board (MachXO2 Breakout Board) ein 256x64 OLED mit SSD1322 Controller ansteuern. Da es (vermutlich) kein FPGA Problem ist, habe ich mich für dieses Forum entschieden. Zuerst habe ich versucht über das Datenblatt (http://www.newhavendisplay.com/redirect.html?goto=www.newhavendisplay.com%2Fspecs%2FNHD-2.8-25664UMY3.pdf&action=url) eine eigene Ansteuerung zu entwerfen. Dazu habe ich das Display mit Masse, 3.3V Versorgungsspannung vom FPGA (mit Pufferkondensator), und die I/O Pins für das parallele 6800 Interface direkt mit entsprechenden FPGA Pins verbunden. Mein eigener Entwurf für eine Verilog FSM zur Ansteuerung hat leider kein Ergebnis erzielt. Es ist einfach gar nichts passiert (in der Simulation sah die Ansteuerung für mich in Ordnung aus). Nun scheint aber vor allem die Initialisierung des SSD1322 ziemlich kniffelig zu sein. Daher habe ich den vom Hersteller bereitgestellten Demo C Code (https://www.newhavendisplay.com/app_notes/OLED_25664.txt) verwendet. Einziges Problem für mich waren die Sleep Routinen. "OLED_uDelay(x)" wird wahrscheinlich für eine Verzögerung von x Mikrosekunden sorgen, aber was ist mit "OLED_Delay(x)" (ohne Einheit)? Da ich im Datenblatt weder vom Hersteller noch vom Controller diesen Wert gefunden habe, habe ich ebenfalls Mikrosekunden angenommen. War das vielleicht falsch? In meiner main Methode rufe ich nun nacheinander die Funktionen OLED_Init_25664() und Checkerboard_25664() auf. Für die 8 Datenleitungen und die 4 benötigten Steuersignale (/RES,/CS,DC,E) habe ich zwei GPIOs konfiguriert, und im Simulator getestet. Die entsprechenden Funktionen im Democode habe ich umgeschrieben. Wenn ich nun den Code ausführe, leuchtet für den Bruchteil einer Sekunde eine horizontale Linie auf, manchmal auch 2-3. An dieser Stelle komme ich nun nicht weiter. Die Verbindungen zwischen den Pins des FPGAs und dem Display habe ich überprüft. Die Output Pins des FPGAs sind als IO Type LVCMOS33 konfiguriert, das müsste also auch stimmen. Der 3.3V Spannungswandler des FPGA Boards liefert laut Datenblatt bis zu 1A. Testweise habe ich neben meinem USB Hub mit externer Stromversorgung auch ein starkes USB Netzteil (funktioniert mit Raspberry Pi) verwendet, aber das Resultat war das gleiche. Habt ihr eine Idee wie ich ohne Oszilloskop und Logic Analyzer das Problem weiter eingrenzen kann? Danke im Voraus!
Gast
#3744866
Ein Delay ohne Einheit ist wahrscheinlich im ms gemeint. Hier: http://docs-europe.electrocomponents.com/webdocs/0d2c/0900766b80d2c7d9.pdf ist das Timing angegeben. Hast Du auch den Punkt 10 - Power-On Sequence beachtet?
hp-freund schrieb: > Ein Delay ohne Einheit ist wahrscheinlich im ms gemeint. Das wären dann 10s Delay.. Ich habe jetzt einmal versucht es aus dem Datenblatt herauszulesen, aber genau dieser Wert (10000) taucht an dieser Stelle in keiner Möglichkeit auf (unabhängig von der Einheit). Da es aber nur einen Aufruf gibt, der direkt nach dem Reset auftritt, ist es weniger kritisch. hp-freund schrieb: > Hier: > http://docs-europe.electrocomponents.com/webdocs/0d2c/0900766b80d2c7d9.pdf Danke für den Link! Ich habe mir auch bereits schon andere Datenblätter für den Controller angesehen. Was mich irritiert ist die unterschiedliche Initialisierung. Laut Datenblatt muss direkt nach dem Reset der Befehl 0xAF (Display ON) gesendet werden. Im Beispielcode vom Hersteller wird dies viel später gemacht (dort wird zunächst "Unlock Commands" und "Display OFF" aufgerufen). Was stimmt denn nun?
Das Display findet sich bei vielen Herstellern z.B. die von mir verwendete 3.2" Version von Densitron als DD-25664YW-4A oder von Eastrising als ER-OLED032-1Y. Beide sind identisch. Beide verwenden auch den SSD1322 Controller. Beide Displays gibt es auch in der 2.8" Variante. Somit denke ich ist zwischen Densitron, Eastrising und Newhavendisplay kein Unterschied am Panel selbst. Günstig sind sie eben von Eastrising: http://www.buydisplay.com/default/oled-display/256x64-dot-matrix-2-8-oled-display-module-with-datasheet-price-pinout-arduino-serial-spi-interface-from-china-manufacturer-supplier http://www.buydisplay.com/default/oled-display/256x64-dot-matrix-3-2-oled-display-module-with-datasheet-price-pinout-arduino-serial-spi-interface-from-china-manufacturer-supplier Auf dieser Seite findest du auch ein Series Manual, was verdammte Ähnlichkeiten zu dem von Densitron aufweist. Wie dem auch sei, das Datenblatt finde ich ausführlicher als dein verlinktes. Es hat die Einschalt und Ausschaltsequenz sowie eine ausführliche Intialisierungsroutine abgebildet, welche ich auch erfolgreich so verwende: (für einen PIC24F, ansteurung über das parallele Interface)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
Gast
#3748346
Ich hoffe du kannst mit Pascal was anfangen ? So initialisiere ich das (OLED, 256x32, SSD1322-Controller)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
Gast
#5188509
Frank M. schrieb: > Somit denke ich ist zwischen Densitron, Eastrising und > Newhavendisplay kein Unterschied am Panel selbst. Ich habe ein 256x64 Modul via Aliexpress gekauft (auch $30, incl. Versand), das identisch zu den Eastrising-Modulen aussieht (Bestückungsdruck: "TW56640320B03") und auf der Salomon Systech SSDSSD1322UR "Flex assembly" aufbaut. Es ist für 4-wire SPI konfiguriert und ich habe es mit angepasstem Code von https://github.com/MartyMacGyver/OLED_SSD1322 auf einem "Blue Pill" STM32F103 board mit STM32duino grundsätzlich zum Laufen gebracht. Die Initialisierung scheint auf den ersten Blick mit der von Eastrising übereinzustimmen. Aber: offenbar hat mein Display einen Column-Offset von 28 (genutzt mit "Set Column Address", offset=startline=0). Frage: habt ihr diesen Offset auch oder ist bei mir evtl. eine Mapping-Einstellung falsch? Oder ist bei der Fertigung etwas verrutscht? Ansonsten bin ich kein Freund vom Datenblatt des Controllers. Es steht nirgends explizit, dass ein write-Befehl bzw. eine Column zwei Bytes braucht und erst dann ins Display-Ram schreibt. Es gibt nur Hinweise, wie bei "Set Row Address": "After finishing read/write four pixels of data, the column address is increased automatically by 1 to access the next RAM location for next read/write operation". Oder bei GDDRAM Structure: auf den zweiten Blick sieht man, dass eine Column aus vier Segmenten besteht. "Data Bus to RAM Mapping" zeigt auch zwei Bytes. Naja.
Gast
#5188621
Das Datenblatt vom SSD1306 ist genau so ätzend. Dafür habe ich letztes Wochenende einen Treiber geschrieben (aus Spaß am Machen, nicht dass es wirklich nötig gewesen wäre). Die meisten Treiber, die ich im Internet gefunden habe, haben jedes Kommando einzeln als separate I²C Transaktion gesendet. Ich habe aber gemerkt, dass man beliebig viele Kommandos hintereinander in einem Rutsch senden kann. Im Gegensatz zum HD44780 kann man bei den SSD13xx Controllern die Kommandos offensichtlich ohne Delay direkt hintereinander senden. Was die Reihenfolge der Initialisierung angeht: Ich habe das Gefühl, dass die Kommandos (fast) in beliebiger Reihenfolge gesendet werden können. Jede Implementierung macht es anders und keine, die ich gesehen habe, hält sich exakt an das Datenblatt. Es würde mich nicht wundern, wenn die empfohlene Sequenz in jeder Version des Datenblattes anders aussieht. Typisch chinesisch. > habt ihr diesen Offset auch? Beim 128 Pixel breiten Displays mit SH1106 (welcher dem SSD13xx zu 99% gleicht) gibt es auch einen Offset. Da hat das RAM 132 Spalten, das Display aber nur 128. Der Offset ist dort 2 (also zentriert).
Gast
#5188808
Mhh, zentriert? Controller: 480 pixels/nibbles == 240 Bytes == 120 columns (Achtung, in GDRAM-Tabelle ist 77 Hex == 119) Display: 256 pixels/nibbles == 128 Bytes == 64 columns (120-64)/2 = 28 Tada! Als 0x1C auch in http://www.newhavendisplay.com/app_notes/OLED_25664.txt als magic number. Meine Quelle hat es wohl einfach verpeilt: > // Still figuring these out... Rätsel gelöst - danke für den Hinweis!
Gast
#5188846
> Rätsel gelöst - danke für den Hinweis!
Na, da hatte ich ja gut geraten.
Gast
#5189641
Ja! Gleich nochmal: Gibt es ein Mittel oder eine Einstellung gegen Streifen, d.h. hellere Pixel, die offenbar entstehen, wenn Zeilen auch eine nennenswerte Zahl schwarzer Pixel hat als die umliegenden? Als würde der Zeilentreiber dann zuviel Strom ausgeben. Oder aber, in alle anderen Zeilen schafft der Zeilentreiber nicht alle Pixel und sie erscheinen daher dunkler. ... Ok, Initialisierung angepasst (Densitron/Newhaven) und es ist deutlich besser, aber dennoch sichtbar.
Gast
#5189655
Ich kann nur sagen, dass mein OLED Display mit dem anderen SSD1306 keine Streifen macht. Schau mal im Datenblatt (https://www.crystalfontz.com/controllers/SolomonSystech/SSD1322/427/) nach dem Stichwort "contrast". Die LEDs werden mit einem konstanten Strom angesteuert, dessen Maximum durch einen Widerstand außerhalb des IC bestimmt wird und von 0 bis max per Befehl einstellbar ist. Vielleicht ist bei Dir die höhere Spannungsversorgung für die LEDs (7V?) instabil. Hast du eine Charge-Pump, dann ist diese vielleicht überlastet, oder sie liefert wegen falschen Kondensatoren/Spulen keine konstante Spannung. In diesem Fall könnte es schon genügen, die Helligkeit zu verringern. Das wäre auch für die Lebensdauer des Displays von Vorteil.
Gast
#5189975
Danke für die Hinweise. Der kleine SOT23-5 auf dem "generic STM32" schafft die 3.3 V Versorgung, wenn auch mit einem delta-T von 35 K. Die generierten Spannungen scheinen aber auch alle zu passen (13.6 V für die LEDs). Helligkeit ist schon reduziert. Man könnte ein Testmuster generieren und die Einstellungen durchtesten ... oder den Effekt erstmal ignorieren. Ist nicht so schlimm.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.