Hallo, ich habe hier ein Densitron OLED (DD-12864YO) und bekomme es nicht reproduzierbar initialisiert. Ich gehe genau nach den Anweisungen im Datenblatt vor daher denke ich dass das Timing irgendwo nicht wirklich passt. Hat einer von Euch schon mal etwas mit diesem Display gemacht und weiß worauf man achten muss? Sollte man VCC wirklich erst nach dem initialisieren einschalten wie es im Datenblatt steht? Ich habe früher mit einem Osram Display gearbeitet, da habe ich VCC davor eingeschaltet und hatte keinerlei Probleme. Vielen Dank schon mal Jan
S/P ? DD-12864YO-? Zeig Initialisierung Der Einschaltzeitpunkt der OLED Spannung ist eigentlich egal. Man sollte nur vorher das Timing initialisieren sonst ist es nicht so perfekt für die Lebensdauer.
Ein DD-12864YO-1A parallel angeschlossen.
1 | writeCommand(0xAE); // x // set off |
2 | |
3 | waitms(100); |
4 | |
5 | writeCommand(0xB3); // // clock divider |
6 | writeCommand(0x91); // // clock divider |
7 | |
8 | writeCommand(0xA8); // // multiplex ratio |
9 | writeCommand(0x3F); // // multiplex ratio |
10 | |
11 | writeCommand(0xA2); // // set offset |
12 | writeCommand(0x44); // // set offset |
13 | |
14 | writeCommand(0xA1); // // start line |
15 | writeCommand(0x00); // // start line |
16 | |
17 | writeCommand(0xA0); // // re-map |
18 | writeCommand(0x41); // // re-map |
19 | |
20 | writeCommand(0xAD); // // set master config |
21 | writeCommand(0x02); // // set master config |
22 | |
23 | writeCommand(0xCF); // // set bias current |
24 | writeCommand(0xF0); // // set bias current |
25 | |
26 | writeCommand(0x86); // // set current range |
27 | |
28 | writeCommand(0x81); // // set contrast |
29 | writeCommand(0x7F); // // set contrast |
30 | |
31 | writeCommand(0xB2); // // set row period |
32 | writeCommand(0x46); // // set row period |
33 | |
34 | writeCommand(0xB1); // // set phase length |
35 | writeCommand(0x28); // // set phase length |
36 | |
37 | writeCommand(0xBC); // // set precharge voltage |
38 | writeCommand(0x10); // // set precharge voltage |
39 | |
40 | writeCommand(0xBE); // // set vcomh voltage |
41 | writeCommand(0x02); // // set vcomh voltage |
42 | |
43 | writeCommand(0xBF); // // set vsl |
44 | writeCommand(0x0D); // // set vsl |
45 | |
46 | writeCommand(0xA4); // // set display mode |
47 | |
48 | // clear screen
|
49 | for (i = 0; i < 80; i++) { |
50 | uint8_t j; |
51 | for (j = 0; j < 64; j++) { |
52 | writeData(0x00); |
53 | }
|
54 | }
|
55 | |
56 | vcc_supply(ON); |
57 | |
58 | waitms(100); |
59 | |
60 | writeCommand(0xAF); // display on |
Irgendwie ist deine Initialisierung des SSD1325T6 ganz anders als beim SSD1305 oder SH1101A. Den SSD1325T6 kenne ich aber nicht. Schon der erste Befehl: writeCommand(0xB3); // // clock divider writeCommand(0x91); // // clock divider ist beim SSD1305 und SH1101A “Set GDDRAM Page Start Address”. Da kann ich nicht helfen, wundere mich aber, dass der Chiphersteller so die Kommandos geändert hat. Beim SH1101A Controller mache ich das so:
1 | // Display ON/OFF
|
2 | OledCommand(0xAE, -1); // (13) 0xAF: ON; 0xAE: OFF (Display off) |
3 | |
4 | // Segment Re-map
|
5 | OledCommand(0xA1, -1); // (08) 0xA0: column address 0 is map to SEG0; 0xA1: column address 131 map to SEG0 |
6 | |
7 | // Common Pads Hardware Configuration
|
8 | OledCommand(0xDA, 0x12); // (19) common pads hardware: alternative |
9 | |
10 | // Common Output Scan Direction
|
11 | OledCommand(0xC8, -1); // (15) 0xC0: COM0 to COMn; 0xC8: COMn to COM0 |
12 | |
13 | // Multiplex Ratio
|
14 | OledCommand(0xA8, 0x3F); // (11) multiplex ration: 64 |
15 | |
16 | // Display Clock Divide
|
17 | OledCommand(0xD5, 0x50); // (17) Osc. Freq.: 5; Display divide ration: 0 (ratio 1) |
18 | |
19 | // VCOMH
|
20 | OledCommand(0xDB, 0x40); // (20) VCOM deselect level: 40H |
21 | |
22 | // VP
|
23 | OledCommand(0xD9, 0x1F); // (18) discharge period: 1; precharge period: 15 |
24 | |
25 | // Display Offset
|
26 | OledCommand(0xD3, 0x00); // (16) Display offset: 0 |
27 | |
28 | // Display Start Line
|
29 | OledCommand(0x40, -1); // (06) Display start line: 0 |
30 | |
31 | // Entire Display ON/OFF
|
32 | OledCommand(0xA4, -1); // (09) 0xA4: normal diplay; 0xA5: entire display |
33 | |
34 | // Normal or Inverse Display
|
35 | OledCommand(0xA6, -1); // (10) 0xA6: normal diplay; 0xA7: reverse display |
36 | |
37 | // Contrast Control Register
|
38 | OledCommand(0x81, ucContrast); // (07) contrast control: 0 .. 255 |
39 | |
40 | // Set DC-DC
|
41 | OledCommand(0xAD, 0x8A); // (12) 0x8B: ON; 0x8A: OFF (external Vpp must be used) |
42 | |
43 | // clear OLED RAM
|
44 | OledUpdate(bDisplayEntire, bDisplayRotated, ucDisplayContrast); |
45 | |
46 | // Display ON/OFF
|
47 | OledCommand(0xAF, -1); // (13) 0xAF: ON; 0xAE: OFF (Display on) |
Hast du deine Clear Routine noch zur Hand? Wäre jetzt auf die schnelle praktischer zum testen...
Ich gehe über SPI und zumindest da muss man vor jeder der 8 Pages erst ein Kommando mit der Pagenummer schicken.
1 | OledCommand(0xA4, -1); // (09) 0xA4: normal diplay; 0xA5: entire display |
2 | |
3 | // Segment Re-map
|
4 | OledCommand(0xA1, -1); // (08) 0xA0: column address 0 is map to SEG0; 0xA1: column address 131 map to SEG0 |
5 | |
6 | // Common Output Scan Direction
|
7 | OledCommand(0xC8, -1); // (15) 0xC0: COM0 to COMn; 0xC8: COMn to COM0 |
8 | |
9 | OledCommand(0x81, 127); // (07) contrast control: 0 .. 255 |
10 | |
11 | |
12 | ESPITDCR |= ESPITDCR_SSV; // activate Slave Select (SS) |
13 | |
14 | for (ucPage = 0; ucPage < DISP_ROW / 8; ucPage++) |
15 | {
|
16 | PSet(OLED_DATA_COMM, FALSE); // Command Mode |
17 | |
18 | ESPIDATA = 0xB0 + ucPage; // (14) Page Address |
19 | |
20 | while (!(ESPISTAT & ESPISTAT_TDRE)) ; // wait for: Transmit data register empty |
21 | ESPIDATA = 0x00 + DISP_COL_FIRST; // (01) Collumn Address (4 low bits) |
22 | |
23 | while (!(ESPISTAT & ESPISTAT_TDRE)) ; // wait for: Transmit data register empty |
24 | ESPIDATA = 0x10; // (02) Collumn Address (4 high bits) |
25 | |
26 | while (ESPISTAT & ESPISTAT_TFST) ; // wait for: No data transfer is currently in progress |
27 | PSet(OLED_DATA_COMM, TRUE); // Data Mode |
28 | |
29 | for (ucCol = DISP_COL; ucCol--; ) |
30 | {
|
31 | while (!(ESPISTAT & ESPISTAT_TDRE)) ; // wait for: Transmit data register empty |
32 | ESPIDATA = 0; |
33 | }
|
34 | |
35 | while (ESPISTAT & ESPISTAT_TFST) ; // wait for: No data transfer is currently in progress |
36 | }
|
37 | |
38 | ESPITDCR &= ~ESPITDCR_SSV; // deactivate Slave Select (SS) |
Mit deiner Initialisierung bekomme ich immerhin VCOM jedes mal auf ca. 10V. Von daher sollte das Display ja zumindest noch funtionieren. Beim 1325 ist 0xB3 definitiv der clock divider. Steht so im Datenblatt vom SDD1325 und auch die initialisierung vom DD-12864YO-1A sieht das so vor. Dir auf jeden Fall schon mal vielen Dank!
Hat sonst vielleicht noch jemand Erfahrung mit dem Display? Besonders bezüglich der parallelen Ansteuerung da ich genau nach Datenblatt vorgehe und trotzdem nichts zu sehen bekomme...
Seid gegrüßt Freunde der Sonne, kann mir jemand sagen wie ich am besten die OLED-Spannung erzeuge, habe ein ähnliches Display: http://www.conrad.de/ce/de/product/180848/OLED-DISPLAY-VGG12864L-S003-128X64-GRUeN/0212041 Sollte ich einfach einen kleinen Festspannungsregler nehmen, habe 17V Gleichspannung zur Verfügung. Und was hat es mit dem verzögerten Anschalten der OLED-Spannung auf sich? >Sollte man VCC wirklich erst nach dem initialisieren einschalten wie es >im Datenblatt steht?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.