Forum: Mikrocontroller und Digitale Elektronik Densitron OLED


von marco (Gast)


Angehängte Dateien:

Lesenswert?

Hallo liebes Forum,

ich bin gerade dabei mein Densitron Oled Display anzusteuern. Leider 
erfolglos. Das Display bleibt tot. Bin meinen Code schon mehrmals 
durchgegangen. Finde den Fehler aber nicht.
Würde mich sehr freuen, wenn jemand kurz Zeit hätte meine 
Initialisierung anzugucken. Im Main möchte ich nur über den einen Taster 
einige Zeilen mit unterschiedlichem GrayScale Werten beschreiben. Über 
den anderen das Display löschen. Sonst passiert da nix.

Vielen Dank schon mal im voraus.

mfg marco

von u8glib (Gast)


Lesenswert?

So mal über den Daumen gepeilt, gibt es bei Densitron mindestens 100 
verschiedene OLEDs. Daneben gibt es derzeit ca. 5-10 verschiedene 
Controller, die dabei eingesetzt werden. Deshalb wäre es sehr hilfreich, 
wenn wir wüssten, um welches Display es sich konkret handelt.

Grüße,
Oliver

von u8glib (Gast)


Lesenswert?

Was man aber auch ohne das Display zu kennen sagen kann: Das 
Command/Data Signal und die Chip-Select Leitung werden definitiv falsch 
gesetzt.
Genaueres steht im Datenblatt des Controllers.

Der auskommentierte Code war definitiv richtiger.

Oliver

von marco (Gast)


Angehängte Dateien:

Lesenswert?

Ok, es handelt sich um das DD-128YO-1A.
Display controller: SSD1325

Zu dem Command/data Signal wollte ich noch sagen das ich während des 
gesamten Schreibvorgangs mit Daten oder Kommandos das CS oder D_C Signal 
nicht mehr verändere. Also z.B bei den Daten lasse ich D_C auf 1 und CS 
auf 0. Muss ich das denn in der SendData Routine wieder zurücksetzten um 
es dann wieder auf den richtigen Wert zu setzten? Fände ich irgendwie 
nicht logisch.

Habe trotzdem gerade gesehen, dass ich CS im Main.c auf 1 setze. Das 
muss natürlich auf 0.
Hab den Fehler gerade ausgebessert und nochmal durchlaufen lassen, hat 
aber nix geändert!?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Als erstes würde ich die Schaltung, insbesondere die 
Spannungsgenerierung für das Display sehen wollen oder hat das Teil 
schon einen Step-Up-Converter an Board.

von u8glib (Gast)


Lesenswert?

Hallo

Wärend der Übertragung muss CS = 0 sein.
Wenn Befehle oder die Argumente der Befehle übertragen werden, dann muss 
D_C = 0 sein. Sollen Daten in das RAM des OLEDs geschrieben werden, muss 
D_C = 1 sein.

Grüße und frohes Fest,
Oliver

von marco (Gast)


Lesenswert?

danke erstmal.

Ja es hat einen Step-Up-Wandler. Da hab ich besonders drauf geguckt bei 
der Auswahl meines Displays, weil ich mich nicht selbst um die 15V 
kümmern wollte.

Habe noch ein Paar Fehler endeckt. Im Main setze ich CS auf 1. Dass muss 
natürlich auf 0. Und auch in der SendData-Funktion setzte ich zum Schluß 
CS auf 1. Ist natürlich genauso quatsch. Nach diesen Korrekturen läuft 
aber immer noch nix.

Aber richtige Initialisierung hin oder her. Die meisten, die das erste 
mal ein Display ansteuern, schreiben doch hier im Forum, das sie erst 
mal einen Pixelbrei zu sehen bekommen. Meines ist jedoch komplett tot. 
Man sieht absulut nichts. Deshalb frage ich mich schon ob es vielleicht 
nicht doch an meiner Spannungsversorgung liegt??

Mit dem Kommando "Set Biasing Current" aktiviert man doch den 
DC/DC-Converter (siehe Display-Datenblatt, S.17). Sehe ich das richtig 
so?

Wenn ich den internen DC/DC-Converter einsetze, darf ich dann den 
Vcc-Pin einfach offen lassen?

von marco (Gast)


Lesenswert?

Hat den keiner mehr einen Rat? Hätte doch so gern mein Display noch vor 
Jahresende zum laufen gebracht.

von Christopher (Gast)


Lesenswert?

Hi,

ich bin auch gerade an einem Display mit SSD1325 Controler 
(VGY12864Z-S005 von Conrad) dran.

Will es parallel anschließen und wälze schon Datenblätter bevor ich 
alles da habe.


zu deiner Initialisierung:
1
// Display OFF
2
sendCommand(0xAE); 
3
4
//Set display clock divide and oscilator frequency    
5
sendCommand(0xB3);      
6
sendCommand(0x91);

geh ich mit


1
//Set Multiplexratio
2
sendCommand(0xA8);
3
sendCommand(0x50);

Der Controler kann 80 Zeilen ansprechen (0x50 = 80). Meiner Meinung nach 
(dem Datenblatt entnommen) sollte der Wert 0x40 sein (laut 
http://code.google.com/p/u8glib/source/browse/csrc/u8g_dev_ssd1325_nhd27oled_gr_new.c) 
sind es aber 0x3f.


1
//Set Display Offset
2
sendCommand(0xA2);
3
sendCommand(0x0);

Der Wert sollt 0x4C sein, warum? Keine Ahnung, habe ich aber in mehreren 
Initialisierungen so gefunden.. laut Datenblatt wäre aber eine 0x0 
richtig, gebe dich dir völlig recht, aber probiers mal mit 0x4C.



1
//Set Display Start-Line
2
sendCommand(0xA1);
3
sendCommand(0x0);
4
5
//Set Column Adress
6
sendCommand(0x15);
7
sendCommand(0x0);
8
sendCommand(0x3F);
9
10
//Set Row Adress
11
sendCommand(0x75);
12
sendCommand(0x0);
13
sendCommand(0x3F);

völlig korrekt


1
//Set Re-map
2
sendCommand(0xA0);
3
sendCommand(0x0);

Da sagen wieder mehrere Initalisierungen 0x52, siehe Datenblatt was da 
genau geschieht.


1
//Set Master Configurtation
2
sendCommand(0xAD);
3
sendCommand(0x02);

0x02 = "Select external VCC supply" und genau das wolltest du doch 
nicht?
0x03 wäre korrekt um den internen step-up wandler zu nutzen(?)


1
//Set Bias-Current for DC/DC-Converter
2
sendCommand(0xCF);
3
sendCommand(0xF0);

den Befehl gibt es laut meinem Datenblatt gar nicht! Was willst du da 
setzen?


1
//Set Current Range
2
sendCommand(0x85);
3
4
//Set Contrast Control
5
sendCommand(0x81);
6
sendCommand(0x7F);

jepp


1
//Set Row Period
2
sendCommand(0xB2);
3
sendCommand(0x46);
4
5
//Set Phase Length
6
sendCommand(0xB1);
7
sendCommand(0x28);

Keine Ahnung, aber wo nimmst du den Wert her?

Laut Datenblatt passen die Werte glaube ich nicht richtig zusammen.

Vielleicht korrekte Werte siehe u8g.


1
//Set Pre-Charge Voltage
2
sendCommand(0xBC);
3
sendCommand(0x10);

jepp


1
//Set VCOMH Voltage
2
sendCommand(0xBE);
3
sendCommand(0x02);

warum genau dieser Wert?


1
//Set VSL
2
sendCommand(0xBF);
3
sendCommand(0x0D);

Laut Datenblatt sind nur 0x02 und 0x0E zulässig... aber bei u8g wird 
auch 0x0D verwendet.. wer weiß..


1
//Set Display-Mode
2
sendCommand(0xA4);

korrekt


dann fehlen dir meiner Meinung nach (siehe u8g) die Befehle

- 0xB0 mit dem Wert 0x28,

- 0xB4 mit dem Wert ... gute Frage.. laut Datenblatt 0x03, aber hab 
alles von 0x00 bis 0x04 gesehen

- 0xB8 mit der Graustufen-Tabelle

Das war alles was mir jetzt auffiel... ich werde nächste Woche beginnen 
mein Display parallel anzusteuern, wie hast du es angeschlossen?

Dann kann ich dir auch hoffentlich mehr sagen.

von Christopher (Gast)


Lesenswert?

Ok, Beiträge dazwischen nur überflogen.. jetzt weiß ich auch was für ein 
Display du benutzt.
Ein aktuelleres Datenblatt habe ich hier gefunden 
(http://www.newhavendisplay.com/app_notes/SSD1325.pdf)

Ob du in deiner main.c das CS auf 0 oder 1 setzt ändert an der 
Initialisierung nichts, du machst das ja nach oled_init().
ABER mir sind deine sendCommand und sendData Funktionen nicht schlüssig!

Kommando senden: RD = 1, CS = 0, D/C = 0
Daten senden: RD = 1, CS = 0, D/C = 1

von Christopher H. (roki)


Lesenswert?

Ich hab mein Display angesteuert bekommen. Angeschlossen am LPT Port 
unter Linux. Für die Ansteuerung der einzelnen LPT Pins wurde die Lib 
"Parapin" verwendet.

CS wurde auf Masse gelegt, da es eh immer low sein muss/kann.
Wichtig war, dass Reset nicht dauerhaft auf low lag, sondern wirklich 
nur zur Initialisierung low gesetzt wurde, danach dauerhaft auf high.

OLED.h
1
#define pinRD   LP_PIN01
2
3
#define pinD1  LP_PIN02
4
#define pinD2  LP_PIN03
5
#define pinD3  LP_PIN04
6
#define pinD4  LP_PIN05
7
#define pinD5  LP_PIN06
8
#define pinD6  LP_PIN07
9
#define pinD7  LP_PIN08
10
#define pinD8  LP_PIN09
11
12
#define pinWR   LP_PIN14
13
#define pinDC   LP_PIN16
14
#define pinRES  LP_PIN17



OLED.c
1
void setData(uint8_t data) {
2
3
  ((data & 0x80)) ? set_pin(pinD8) : clear_pin(pinD8);
4
  data = data << 1;
5
  ((data & 0x80)) ? set_pin(pinD7) : clear_pin(pinD7);
6
  data = data << 1;
7
  ((data & 0x80)) ? set_pin(pinD6) : clear_pin(pinD6);
8
  data = data << 1;
9
  ((data & 0x80)) ? set_pin(pinD5) : clear_pin(pinD5);
10
  data = data << 1;
11
  ((data & 0x80)) ? set_pin(pinD4) : clear_pin(pinD4);
12
  data = data << 1;
13
  ((data & 0x80)) ? set_pin(pinD3) : clear_pin(pinD3);
14
  data = data << 1;
15
  ((data & 0x80)) ? set_pin(pinD2) : clear_pin(pinD2);
16
  data = data << 1;
17
  ((data & 0x80)) ? set_pin(pinD1) : clear_pin(pinD1);
18
19
}
20
21
void writeDisp(uint8_t data, uint8_t cmd) {
22
23
  set_pin(pinRD);
24
  change_pin(pinDC, (cmd == 1) ? LP_CLEAR : LP_SET);
25
  clear_pin(pinWR);
26
27
  setData(data);
28
29
  set_pin(pinWR);
30
  set_pin(pinDC);
31
}
32
33
void initalize() {
34
35
  clear_pin(pinRES);
36
  usleep(10);
37
  set_pin(pinRES);
38
39
  writeDisp(0xAE, CMD);
40
41
  writeDisp(0x15, CMD);           // Set Column Address
42
  writeDisp(0x00, CMD);           // Begin  0
43
  writeDisp(0x3f, CMD);           // End   64
44
45
  writeDisp(0x75, CMD);           // Set Row Address
46
  writeDisp(0x00, CMD);           // Begin  0
47
  writeDisp(0x4f, CMD);           // End   79
48
49
  writeDisp(0x86, CMD);           // Set Current Range
50
51
  writeDisp(0x81, CMD);
52
  writeDisp(0x7F, CMD);           // Set Contrast Control
53
54
  writeDisp(0xBE, CMD);           // Set VCOMH Voltage
55
  writeDisp(0x00, CMD);         
56
57
  writeDisp(0xBC, CMD);           // Set Precharge Voltage
58
  writeDisp(0x0F, CMD);
59
60
  writeDisp(0xA0, CMD);           // Set Re-map
61
  writeDisp(0x52, CMD); 
62
63
  writeDisp(0xA8, CMD);           // Set Multiplex Ratio
64
  writeDisp(0x4F, CMD);           // multiplex ratio N from 16MUX-80MUX //
65
66
  writeDisp(0xB1, CMD);           // Set Phase Length
67
  writeDisp(0x22, CMD);
68
69
  writeDisp(0xB2, CMD);           // Set Row Period
70
  writeDisp(0x46, CMD);
71
72
  writeDisp(0xB0, CMD);           // Set Pre-charge Compensation Enable
73
  writeDisp(0x08, CMD);
74
75
  writeDisp(0xB4, CMD);           // Set Pre-charge Compensation Level
76
  writeDisp(0x00, CMD);
77
78
  writeDisp(0xB3, CMD);           // Set Display Clock
79
  writeDisp(0xA0, CMD);
80
81
  writeDisp(0xBF, CMD);           // Set Segment Low Voltage (VSL)
82
  writeDisp(0x0D, CMD);
83
84
  writeDisp(0xB8, CMD);           // Set Gray Scale Table
85
  writeDisp(0x01, CMD);
86
  writeDisp(0x11, CMD);
87
  writeDisp(0x22, CMD);
88
  writeDisp(0x32, CMD);
89
  writeDisp(0x43, CMD);
90
  writeDisp(0x54, CMD);
91
  writeDisp(0x65, CMD);
92
  writeDisp(0x76, CMD);
93
94
  writeDisp(0xAD, CMD);           // Set Master Configuration
95
  writeDisp(0x02, CMD);
96
97
  writeDisp(0xA4, CMD);
98
  writeDisp(0xAF, CMD);
99
  writeDisp(0xE3, CMD);           //NOP
100
101
  drawRectanlge(0x00, 0x4f, 0x00, 0x3f, 0xff);
102
}
103
104
void drawRectanlge(uint8_t row_start, uint8_t row_end, uint8_t col_start,
105
    uint8_t col_end, uint8_t gray) {
106
  writeDisp(0x23, CMD);
107
  writeDisp(0x01, CMD);
108
109
  writeDisp(0x24, CMD);
110
  writeDisp(col_start, CMD);
111
  writeDisp(row_start, CMD);
112
  writeDisp(col_end, CMD);
113
  writeDisp(row_end, CMD);
114
  writeDisp(gray, CMD);
115
}



Weiterhin viel Erflog!

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.