Mikrocontroller und Digitale Elektronik
›
Thread
Display mit SSD1306 Controller ansteuern
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
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
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;
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
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.
VB
Volker B.
(vobs)
(Firma: L-E-A)
28.09.2024 18:47
#7743915
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
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
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
VB
Volker B.
(vobs)
(Firma: L-E-A)
28.09.2024 19:05
#7743922
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
Rainer W. schrieb:
C-Code in Code-Tags einschließen
Das hab ich mal versucht und es hat nicht funktioniert. Du meinst schon
.... 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).
VB
Volker B.
(vobs)
(Firma: L-E-A)
28.09.2024 19:17
#7743930
Volker B. schrieb:
Vielleicht solltest Du den Kontrastwert als Data senden?
...oder die Funktion
1
Adafruit_SSD1306 :: ssd1306_commandList ()
verwenden.
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
VB
Volker B.
(vobs)
(Firma: L-E-A)
28.09.2024 20:51
#7743987
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren