Forum: Mikrocontroller und Digitale Elektronik Oled Display SSD1306: Manchmal hängt es beim Init!


von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Moin,

ich nutze gern diese kleinen Displays für Text und kleine Grafiken, die 
sich nicht bewegen. I2C Bus, Software von Adafruit, fertig. Laufen prima 
an Arduino, ESP8266 und STM32.

Am STM32F103 auf welchen ich die Textausgabe portiert habe passiert es 
leider immer wieder, dass das Display beim Einschalten nicht aufwacht 
oder nach dem Watchdog Reset, wenn alles neu initialisiert wird nicht 
mehr ansprechbar ist. Die Befehle werden einfach verschluckt, die 
Fehlerroutine wird nicht aktiviert.

Da hilft nur den Kippschalter ein paar Mal zu betätigen, bis es da ist. 
Bei Wärme steigert sich das Fehlverhalten außerdem, da das Gerät im Auto 
eingebaut ist.

An was ich gedacht habe:

- 500ms warten, bis Vcc stabil vom DC/DC anliegt
- I2C Frequenz 100khz

Init Sequenz ist die die im Netz überall zu finden ist.

Display schaltet sich aus, wenn CPU auch schläft, es wird eingeschaltet 
wenn was los ist. Das sind eingebaute Funktionen, die nur als Befehl 
gesendet werden.

Nach einem CPU Reset wird I2C komplett neu aufgesetzt.

Gibt es vielleicht eine Abhilfe dafür, die sich bewährt hat? Ich möchte 
das Display ungern dauernd eingeschaltet lassen, da es rund 25mA 
braucht. Man kann die Pixel alle löschen, dann verbraucht es nur noch ca 
5ma aber das wäre nur die letzte Lösung.
1
uint8_t ssd1306_Init()
2
{
3
    // Wait for the screen to boot
4
    DelayMs(500);
5
    int status = 0;
6
7
    // Init LCD
8
    status += ssd1306_writeCommand(0xAE);   // Display off
9
    status += ssd1306_writeCommand(0x20);   // Set Memory Addressing Mode
10
    status += ssd1306_writeCommand(0x10);   // 00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
11
    status += ssd1306_writeCommand(0xB0);   // Set Page Start Address for Page Addressing Mode,0-7
12
    status += ssd1306_writeCommand(0xC8);   // Set COM Output Scan Direction
13
    status += ssd1306_writeCommand(0x00);   // Set low column address
14
    status += ssd1306_writeCommand(0x10);   // Set high column address
15
    status += ssd1306_writeCommand(0x40);   // Set start line address
16
    status += ssd1306_writeCommand(0x81);   // set contrast control register
17
    status += ssd1306_writeCommand(0xFF);
18
    status += ssd1306_writeCommand(0xA1);   // Set segment re-map 0 to 127
19
    status += ssd1306_writeCommand(0xA6);   // Set normal display
20
21
    status += ssd1306_writeCommand(0xA8);   // Set multiplex ratio(1 to 64)
22
    status += ssd1306_writeCommand(0x3F);
23
24
    status += ssd1306_writeCommand(0xA4);   // 0xa4,Output follows RAM content;0xa5,Output ignores RAM content
25
    status += ssd1306_writeCommand(0xD3);   // Set display offset
26
    status += ssd1306_writeCommand(0x00);   // No offset
27
    status += ssd1306_writeCommand(0xD5);   // Set display clock divide ratio/oscillator frequency
28
    status += ssd1306_writeCommand(0xF0);   // Set divide ratio
29
    status += ssd1306_writeCommand(0xD9);   // Set pre-charge period
30
    status += ssd1306_writeCommand(0x22);
31
32
    status += ssd1306_writeCommand(0xDA);   // Set com pins hardware configuration
33
#ifdef SSD1306_COM_LR_REMAP
34
    status += ssd1306_writeCommand(0x32);   // Enable COM left/right remap
35
#else
36
    status += ssd1306_writeCommand(0x12);   // Do not use COM left/right remap
37
#endif
38
    status += ssd1306_writeCommand(0xDB);   // Set vcomh
39
    status += ssd1306_writeCommand(0x20);   // 0x20,0.77xVcc
40
    status += ssd1306_writeCommand(0x8D);   // Set DC-DC enable
41
    status += ssd1306_writeCommand(0x14);   //
42
43
    status += ssd1306_writeCommand(0xAF);   // Turn on SSD1306 panel
44
    if (status)
45
        HardFault_Handler();
46
47
    fDisplayIsOn = true;
48
49
    // Clear screen
50
    ssd1306_Fill(Black);
51
52
    // Flush buffer to screen
53
    ssd1306_UpdateScreen();
54
55
    // Set default values for screen object
56
    SSD1306.CurrentX = 0;
57
    SSD1306.CurrentY = 0;
58
59
    SSD1306.Initialized = 1;
60
61
    return 0;
62
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian J. schrieb:
> dass das Display beim Einschalten nicht aufwacht
> Init Sequenz ist die die im Netz überall zu finden ist.
Jetzt noch ein mal mehr...

Wenn die bei allen anderen geht, aber bei dir nicht, dann ist an deiner 
unbekannten Schaltung irgendwas anders als bei den anderen, die da ihr 
Zeug ins Netz gestellt haben. Insofern wäre es sinnvoll genau diesen 
Aufbau, der da Probleme macht, Informationen zu beschreiben (Schaltplan, 
Layout, Fotos...).

: Bearbeitet durch Moderator
von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Lothar M. schrieb:
> Insofern wäre es sinnvoll genau diesen
> Aufbau, der da Probleme macht, Informationen zu beschreiben (Schaltplan,
> Layout, Fotos...).

DC/DC 3.3V + 47uf ..... 5cm Leitung... 100nf direkt davor. I2C PU 4.7 
kOhm.
Also alle anderen I2C Teilnehmer spielen wunderbar.

Und ob das bei allen anderen auch immer funktioniert weiss ja niemand.

Ok, glaube das hat sich - wenn Info richtig ist - erledigt. Der Reset 
wird ja nicht heraus geführt aber genau das scheint das Problem zu sein, 
dass die Dinger nach einem Sleep nicht richtig aufwachen.

https://github.com/adafruit/Adafruit_SSD1306/issues/106

Also wird die einzige Lösung wohl sein, den Sleep zu vermeiden und nur 
die Pixel zu löschen :-( Oder dem Display einen TRansistor zu verpassen, 
der Vcc abklemmt.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Ist das I²C Signal absolut sauber, Timingverhalten? ich setze auch hin 
und wiedermal solche Displays ein und kann dir nur die 4 Tips geben:
1.) unsauberes Timing und Spannung verhalten des I²C bus kann das 
Display zum Hängen bringen
2.) Kein Kerko (ca 4.7µF) in der Speiseleitung unmittelbar beim Display 
macht oft Probleme
3.) Nach einschalten der Spannungsversorgung MUSS SCL und SDA auf 
sauberen VCC liegen, ist einer auf 0V Hängt das Display auch gerne.
4.) Nach Stromversorgung On erst nach frühstens 100mS Befehle am Bus 
bringen

Das  sind so die Erfahrungen die ich gemacht habe

von Christian J. (Gast)


Lesenswert?

Patrick L. schrieb:
> Ist das I²C Signal absolut sauber, Timingverhalten? ich setze auch hin
> und wiedermal solche Displays ein und kann dir nur die 4 Tips geben:
> 1.) unsauberes Timing und Spannung verhalten des I²C bus kann das
> Display zum Hängen bringen

I2C ist eine Hardware Einheit, viel kann man da nicht machen. 4.7k und 
das Signal sieht zumindest nicht schlecht aus. Den Rest erledigt das IC 
und alle anderen kommen damit ja zurecht. Ich löte jetzt erstmal einen 
PNP Transistor ein, der Vcc vom Display abklemmt  bzw hat mein DC/DC 
3.3V ja einen Enable Eingang der die gesamte Hardware steuert. Nur das 
Display eben nicht, weil mir das anfangs besser passte. Nur wenn nix 
läuft muss man ja auch nix sehen.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Christian J. schrieb:
> Den Rest erledigt das IC
> und alle anderen kommen damit ja zurecht.

Ja dann scheint Punkt 1. wohl weggefallenen :-)

Ich verwende diese Diese Displays mit dem Internen I²C UCSI des 
MSP430Fxxxx
und habe einfach schon probleme gehabt wenn ich die Punkte die ich oben 
beschreibe nicht beachte (oder von Mitarbeiter nicht beachtet werden) 
deshalb die Tipps.

Das mit dem Sleepmodus, ich sende vor Aufwachsequenz immer zuerst 2 
Stoppbefehle gefolgt von 9 Clocks am I²C Bus bevor ich die Sequenz 
sende.

Falls die anderen Tipps von mir nicht helfen, versuche es mal damit ;-)

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

Diese Displays sind Massenware und nicht alle gleich gut.

Hast du schon mal ein anderes Exemplar probiert?

PS: ich habe hier gerade eines auf einem Steckbrett an einem Nucleo L432 
ohne irgendwelche zusätzliche Beschaltung, einfach 1:1 verbunden - läuft 
einwandfrei.

: Bearbeitet durch User
von Christian J. (Gast)


Lesenswert?

Klaus W. schrieb:
> PS: ich habe hier gerade eines auf einem Steckbrett an einem Nucleo L432
> ohne irgendwelche zusätzliche Beschaltung, einfach 1:1 verbunden - läuft
> einwandfrei.

Das kann sein, muss aber nicht. In diversen Foren wird berichtet, dass 
diese Displays einen Reset benötigen, dessen Leitung der Bequemlichkeit 
natürlich nicht rausgeführt ist. Arduino freundlich soll es sein. Aus 
dem Sleep wachen sie dann wohl eher zufällig mal auf, mal auch nicht. So 
ca 1/3 aller Vorgänge bei mir scheitert.

Lasse das Ding jetzt dauerhaft an, die 5ma machen den Kohl auch nicht 
fett bei 2x18650 Zellen mit 6000mA. In 10h sind das 50mah mehr... 
Peanuts für eine Hobbyanwendung, die eh ständig nachgeladen wird. Klappt 
bisher einwandfrei, 10 Mal ging die CPU in den Sleep, 10x aufgewacht und 
das Teil war da. Dass man manchmal 2-3 Mal den Kippschalter umlegen muss 
ist halt so. Andere Displays haben das nicht die ich verwende.

von Olaf (Gast)


Lesenswert?

> Lasse das Ding jetzt dauerhaft an, die 5ma machen den Kohl auch nicht
> fett bei 2x18650 Zellen mit 6000mA. In 10h sind das 50mah mehr...

WArum schaltest du dann dem Display nicht einfach mit einem Transistor
den Strom komplett ab? Mich wuerden 5mA schon sehr stoeren. Ich kenne 
Schaltungen mit mehreren Microcontroller und Display die im Vollbetrieb 
weniger verbrauchen.

Olaf

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Olaf schrieb:
> WArum schaltest du dann dem Display nicht einfach mit einem Transistor
> den Strom komplett ab?

Will er ja Versuchen:
Christian J. schrieb:
> Ich löte jetzt erstmal einen
> PNP Transistor ein, der Vcc vom Display abklemmt

[Ironie ON]
Das passiert gerne wenn mann meine Tipps ignoriert ....LOL
[Ironie OFF]

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Christian J. schrieb:
> In diversen Foren wird berichtet, dass
> diese Displays einen Reset benötigen

Ich habe einige leicht unterschiedliche Wifi-Kit-8 Module. Bei allen 
muss ich die Reset Leitung per Software ansteuern.

Ich habe aber auch eine Hand Voll einzelner Displays unterschiedlicher 
Größe (als Modul mit Spannungsregler) gekauft, die haben keinen Reset 
Eingang und funktionieren auch ohne.

Die Lage ist also nicht eindeutig.

von Olaf (Gast)


Lesenswert?

> Die Lage ist also nicht eindeutig.

Naja, wie immer wenn man glaubt einen Fehler in anderleuts Hardware 
erkannt zu haben ist das in 90% Quatsch und man ist selber schuld. 
Besonders da die meisten hier ja gar nicht selber programmieren sondern 
nur Libaries aus dem Internet zusammenklauen. Andererseits sind ja 
offensichtlich auch die unterschiedlichsten Displaytreiber auf den 
Displays verbaut und selbst aehnliche Displays koennen dann noch von 
unterschiedlichen Herstellern kommt, sich als in Layout und 
Huehnerfutter unterscheiden. Zum basteln ist das ja auch voll in 
Ordnung. Man kann dann die Loesung dieser Probleme als intellektuelle 
Herausforderung sehen welche man mit Freude meistert. .-)

Olaf

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Olaf schrieb:
> Besonders da die meisten hier ja gar nicht selber programmieren sondern
> nur Libaries aus dem Internet zusammenklauen

Du kannst dir ja gern das Datenblatt des SSD1306 zu Gemüte führen, es 
komplett durchlesen. Und dann deine eigene Init schreiben. Die Register 
und Fachausdrücke sind ja gut erklärt. Du musst nur noch rausfinden 
welche Zahlen da rein müssen, weil der Chip ja zig Displays steuern 
kann...

Und nächstes Jahr, wenn Du fertig bist sag Bescheid ;-)

von Christian J. (Gast)


Lesenswert?

Olaf schrieb:
> WArum schaltest du dann dem Display nicht einfach mit einem Transistor
> den Strom komplett ab? Mich wuerden 5mA schon sehr stoeren.

Sobald ich das Bedürfnis habe, dass die Schaltung länger als 1 Woche im 
Auto liegen muss, bevor ich den USB Pröppel reinstecke und nachlade. 
5,6mA sind es, schalte ich ab falle ich auf <1mA.

Sobald es etwas kühler ist ;-) Freibad wartet.....

von D. J. (basteldag)


Lesenswert?

Hast du auch ein 3V Modul angeschlossen ?
Ich habe so was ähnliches mit Bascom-Prog erlebt. Ursache war, das ich 
ein 5V Modul in einer 3V Schaltung betrieben habe.
Ich habe bisher noch nie den Rest-Pin vermisst bzw gebraucht.

: Bearbeitet durch User
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.