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
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
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
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!?
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.
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
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?
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
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.
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
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
voidsetData(uint8_tdata){
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
voidwriteDisp(uint8_tdata,uint8_tcmd){
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
voidinitalize(){
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)