Forum: Mikrocontroller und Digitale Elektronik Display mit SSD1306 Controller ansteuern


von Christian M. (christian_m280)


Angehängte Dateien:

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

von Christian M. (christian_m280)


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

von Crazy Harry (crazy_h)


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);

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

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

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

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

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

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

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

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

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

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

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

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

    WriteLCD($AF,false);                          // display on
    MDelay(500);
  End GraphInit;

von Rainer W. (rawi)


Lesenswert?

Crazy Harry schrieb:
> Ich schick dem einfach das hier:
>
> Procedure WriteLCD(Arg: Byte; IsData: Boolean);
> ...

Wichtige Regeln - erst lesen, dann posten!

Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

C-Code in Code-Tags einschließen

von Wastl (hartundweichware)


Lesenswert?

Rainer W. schrieb:
> Wichtige Regeln - erst lesen, dann posten!

Leute die hier schon länger im Forum sind, sind sooo alt dass
sie die Regeln (und der Ort wo sie zu lesen sind) schon wieder
vergessen haben. Ansonsten kann auch Alters-Starrsin oder
Beratungsresistenz eine Ursache sein.

von Volker B. (Firma: L-E-A) (vobs)


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

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Volker B. schrieb:
> Ich habe keine Ahnung was Deine Funktion display.ssd1306_command()
> macht

Du könntest es nachlesen.
https://github.com/adafruit/Adafruit_SSD1306/blob/master/Adafruit_SSD1306.cpp

Und nein, die Funktion stammt nicht vom TO

Christian M. schrieb:
> Adafruit-Library

von Christian M. (christian_m280)


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

von Volker B. (Firma: L-E-A) (vobs)


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

: Bearbeitet durch User
von Crazy Harry (crazy_h)


Lesenswert?

Rainer W. schrieb:
> C-Code in Code-Tags einschließen

Das hab ich mal versucht und es hat nicht funktioniert. Du meinst schon
1
 blahblah
 .... wär ja witzig, wenns jetzt geht 😁

Mist das geht wirklich. Sorry 😔

Ich hab bei mir eine Stepup mit 4.1V drauf für die Displayspannung (3.3V 
Logik).

: Bearbeitet durch User
von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Volker B. schrieb:

> Vielleicht solltest Du den Kontrastwert als Data senden?

...oder die Funktion
1
Adafruit_SSD1306::ssd1306_commandList()
verwenden.

: Bearbeitet durch User
von Christian M. (christian_m280)


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

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Christian M. schrieb:

> Ist protected. Zugänglich ist schon ssd1306_command.

Dann denk' Dir eine eigene Methode aus, wie Du Daten als Daten senden 
kannst. In Gottes Namen musst Du dann eben eine eigene Funktion 
schreiben.

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.