Display mit SSD1306 Controller ansteuern

#7743509
Lesenswert?

Momentan bastle ich mit einem 0.42 Zoll OLED mit SSD1306 Controller rum. Dafür habe ich einen Adapterprint gemacht, siehe Anhang. Inspiriert aus folgendem PDF Seite 12:

https://www.icbanq.com/icdownload/data/ICBShop/Board/ZJY001_0.42_16P%20OLED.pdf

Funktioniert fast alles einwandfrei, bis ich die Helligkeit ändern wollte, da geht weder mit

1
  // Helligkeit:
2
  display.ssd1306_command(SSD1306_SETCONTRAST); // 0x81
3
  display.ssd1306_command(0xff);

noch mit

1
  // Pre Charge Period:
2
  display.ssd1306_command(SSD1306_SETPRECHARGE); // 0xD9
3
  display.ssd1306_command(0xff);

irgendwas. Nun habe ich das SSD1306 Datenblatt studiert und da finde ich einige Differenzen zum obigen PDF:

https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf

1
VBAT: Reserved pin. It should be connected to VDD

Also was stimmt jetzt? Ausserdem raffe ich nicht ganz, ob ich nun die Charge-Pump enablen oder disablen muss und ob die 3V3 Versorgung reicht?

Gruss Chregu

Angehängte Dateien:
#7743699
Lesenswert?

Also an VBAT muss eine Spannung anliegen, sonst kommt nichts! Also muss ich nach

https://www.icbanq.com/icdownload/data/ICBShop/Board/ZJY001_0.42_16P%20OLED.pdf

gehen. Momentan versuche ich die empfohlene Startup-Sequenz umzusetzen wie Seite 21/22 beschrieben - ist aber nicht ganz einfach, muss immer schauen, was die Adafruit-Library in der .init schon macht...

Gruss Chregu

#7743812
Lesenswert?

Ich schick dem einfach das hier:

Procedure WriteLCD(Arg: Byte; IsData: Boolean); Begin If IsData=true then PortD:=PortD or %00001100; // Daten else PortD:=PortD and %11111011; // Befehl EndIf; SPIOutByteD(Arg); // Output arg End WriteLCD;

Procedure GraphInit; Begin PortD:=%00000000; // /Reset MDelay(100); PortD:=%00001000; // Reset MDelay(350);

1
WriteLCD($AE,false);                          // display off
2

3
WriteLCD($20,false);                          // set memory addressing mode
4
WriteLCD($02,false);                          // page addressing mode
5

6
WriteLCD($22,false);                          // set page address
7
WriteLCD($00,false);                          // start
8
WriteLCD($7D,false);                          // end
9

10
WriteLCD($00,false);                          // set lower column address
11
WriteLCD($10,false);                          // set higher column address
12
WriteLCD($B0,false);                          // set page address
13

14
WriteLCD($81,false);                          // contrast control
15
WriteLCD($80,false);                          // 0-255
16

17
WriteLCD($A1,false);                          // set segment remap
18
WriteLCD($A6,false);                          // normal/reverse
19
WriteLCD($A8,false);                          // multiplex ratio
20
WriteLCD($1F,false);                          // duty=1/32
21
WriteLCD($C8,false);                          // com scan direction
22

23
WriteLCD($D3,false);                          // display offset
24
WriteLCD($00,false);                          //
25

26
WriteLCD($D5,false);                          // set osc division
27
WriteLCD($80,false);                          //
28

29
WriteLCD($D9,false);                          // set pre-charge period
30
WriteLCD($1F,false);                          //
31

32
WriteLCD($DA,false);                          // set COM pins
33
WriteLCD($00,false);                          //
34

35
WriteLCD($DB,false);                          // set vcomh
36
WriteLCD($40,false);                          //
37

38
WriteLCD($8D,false);                          // set charge pump enable
39
WriteLCD($14,false);                          // $10=disable
40

41
WriteLCD($AF,false);                          // display on
42
MDelay(500);

End GraphInit;

(Firma: L-E-A) #7743915
Lesenswert?

Christian M. schrieb:

Funktioniert fast alles einwandfrei, bis ich die Helligkeit ändern wollte, da geht weder mit

1
>   // Helligkeit:
2
>   display.ssd1306_command(SSD1306_SETCONTRAST); // 0x81
3
>   display.ssd1306_command(0xff);
4
>

noch mit

1
>   // Pre Charge Period:
2
>   display.ssd1306_command(SSD1306_SETPRECHARGE); // 0xD9
3
>   display.ssd1306_command(0xff);
4
>

Ich habe keine Ahnung was Deine Funktion display.ssd1306_command() macht. Wenn ich bei meinem Oled-Display mit SDD1306 nur den Kontrast (hier z.B. auf den Wert 0x80) einstellen will, schicke ich die Sequenz aus den folgenden drei Bytes via I2C an den Controller: 0x00,0x81,0x80

Das führende Nullbyte heißt in meinem Code SSD1306_CMD, scheint also wichtig zu sein.

Grüßle, Volker

#7743920
Lesenswert?

Volker B. schrieb:

schicke ich die Sequenz aus den folgenden drei Bytes an den Controller: 0x00,0x81,0x80

Das führende Nullbyte heißt in meinem Code SSD1306_CMD, scheint also wichtig zu sein.

Scheint dann in deiner Library geparst zu werden und dann das D/C# Bit (in Hardware) zu löschen. Dann folgen die zwei Bytes über SPI.

Rainer W. schrieb:

Längeren Sourcecode nicht im Text einfügen

Naja, auf dem Desktop ist es noch lesbar, auf dem Natel eine Katastrophe.

Volker B. schrieb:

Wenn ich bei meinem Oled-Display mit SDD1306 nur den Kontrast (hier z.B. auf den Wert 0x80) einstellen will

Crazy Harry schrieb:

WriteLCD($81,false); // contrast control WriteLCD($80,false); // 0-255

Und, passiert bei Euch was? Bei mir bleibt es immer gleich hell. Und nicht sonderlich hell, und es ist neu!

Gruss Chregu

(Firma: L-E-A) #7743922
Lesenswert?

Christian M. schrieb:

Das führende Nullbyte heißt in meinem Code SSD1306_CMD, scheint also wichtig zu sein.

Scheint dann in deiner Library geparst zu werden und dann das D/C# Bit (in Hardware) zu löschen. Dann folgen die zwei Bytes über SPI.

Wie oben geschrieben, verwende ich I2C. Vielleicht solltest Du den Kontrastwert als Data senden?

Volker B. schrieb:

Wenn ich bei meinem Oled-Display mit SDD1306 nur den Kontrast (hier z.B. auf den Wert 0x80) einstellen will

Und, passiert bei Euch was? Bei mir bleibt es immer gleich hell. Und nicht sonderlich hell, und es ist neu!

Es wird mit steigendem Wert heller und bei 0 ist's dunkel.

Grüßle, Volker

#7743948
Lesenswert?

Volker B. schrieb:

...oder die Funktion

1
Adafruit_SSD1306::ssd1306_commandList()

verwenden.

Ist protected. Zugänglich ist schon ssd1306_command.

Crazy Harry schrieb:

Ich hab bei mir eine Stepup mit 4.1V drauf für die Displayspannung

Schalte bei mir 5V mit einem BCR555 auf dem Hauptprint, dann eine 1N4148 und der 4k7, dass auch sicher unter 4.2V bleibt.

(3.3V Logik).

Ja bei mir auch, ist aber schon Max.

Gruss Chregu

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren