SSD1306 Display, Rauschen/Schnee bei der Initialisierung

OP #7943245
Lesenswert?

Hallo,

ich habe hier ein Problem bei meiner Anwendung, bei der ich ein 0,96" SSD1306 Display mit einem XIAO SAMD21 Arduino verwende, und zwar erscheint bei jedem Neustart der Applikation am gesamten Bildschirm ein Rauschen/Schneebildschirm für ca. 3s. Danach funktioniert die Darstellung der Zeichen einwandfrei.

Ich benutze folgende Bibliothek für die Zeichen am Display: https://github.com/olikraus/u8g2/

Meine Initialisierung sieht folgendermaßen aus:

U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(SCL,SDA,U8X8_PIN_NONE);

void setup(void) { delay(500); u8x8.initInterface(); u8x8.initDisplay(); u8x8.begin(); ...

Ist dieses "Rauschen" bei Beginn des Programm unvermeidlich (den Arduino muss ich leider Resetten) oder kann ich das irgendwie umgehen und verkürzen?

Vielen Dank schon mal, Michael

Angehängte Dateien:
#7943776
Lesenswert?

Nemopuk schrieb:

Brauchst du ihn als Text?

Stefan, ich kann OCR benutzen <rofl>, aber Suchmaschinen sind in der Hinsicht noch etwas zurückhaltend. Vernünftige Durchsuchbarkeit sollte doch irgendwie Ziel eines Forums sein. Und Copy&Paste-Programmierer auszugrenzen, geht gar nicht ;-)

Das erinnert ein bisschen an die 80er Jahre des vorigen Jahrhunderts, als man zur Programmierung von Mikroprozessoren mangels Internet aus Zeitschriften "seitenweise" Intel Hex-Code abtippen konnte.

: Bearbeitet durch User
#7943794
Lesenswert?

Michael F. schrieb:

Ja, es liegt tatsächlich an der Ausschaltsequenz, wenn ich die Stromversorgung abrupt unterbreche, dann startet das Display wieder mit dem Rauschen. Wenn die "Ausschaltsequenz" durchlaufen wird, kommt das Rauschen nicht.

Das "Rauschen" entsteht dadurch, dass der Display RAM beim einschalten nicht initialisiert ist (enthält willkürliche Werte).

Soll das jetzt bedeuten, wenn du deine "Ausschaltsequenz" ausführst, dann die Spannungsversorgung komplet entfernst, paar Sekunden, 1 Minute wartest und dann deine Schaltung mit Spannung versorgst, kein "Rauschen" zu sehen ist?

Das würde mich sehr stark wundern, außer du entfernst die Spannungsversorgung nicht wirklich. (Das würde mich jetzt echt interessieren)

Beim Einschalten könnte man erst die nötigen Init.-Befehle senden, dann den RAM z.b. mit 0 initialisieren und erst dann den Befehl "zeige RAM auf Display" ausführen.

#7943802
Lesenswert?

Wie groß ist denn die u8g2 im Vergleich zum Adafruit-Dingens? Ich musste bei Adafruit jede einzelne SPI<->I2C "Abfrage" rausnehmen und auch sonst sehr viel rauslöschen, um überhaupt etwas Spielraum auf einem U32u4 zu haben. Die Frage trägt eher rhetorischen Charakter, aber kann ja sein, dass das mal jemand vergleichen hat. Ich muss das glatt mal ausprobieren, zumal ich GrafikFunktionen garnicht brauche, bzw. wieder rausgeschmissen hatte, eben weil es nicht in den Speicher "passte". Ich hab dann alles in Textform angepasst und quasi als Pseudografik dann umgesetzt. Am Ende sind jetzt hier noch 342Byte frei. Naja

EDIT: U32u4? naweiss ja jeder, was ich meine. Die kleinen Arduinos mit 32K Flash

: Bearbeitet durch User
#7943882
Lesenswert?

Adam P. schrieb:

Das "Rauschen" entsteht dadurch, dass der Display RAM beim einschalten nicht initialisiert ist (enthält willkürliche Werte).

Soll das jetzt bedeuten, wenn du deine "Ausschaltsequenz" ausführst, dann die Spannungsversorgung komplet entfernst, paar Sekunden, 1 Minute wartest und dann deine Schaltung mit Spannung versorgst, kein "Rauschen" zu sehen ist?

Das würde mich sehr stark wundern, außer du entfernst die Spannungsversorgung nicht wirklich. (Das würde mich jetzt echt interessieren)

Beim Einschalten könnte man erst die nötigen Init.-Befehle senden, dann den RAM z.b. mit 0 initialisieren und erst dann den Befehl "zeige RAM auf Display" ausführen.

und mit einem delay zum Anfang des Programms so lange wie möglich warten bis das Rauschen durch die Initialisierung überschrieben wird.

#7943893
Lesenswert?

Obelix X. schrieb:

und mit einem delay zum Anfang des Programms so lange wie möglich warten bis das Rauschen durch die Initialisierung überschrieben wird.

Ähm...

Also wenn deine Init. Routine kein Init. (clear) vom RAM durchführt, kannst warten bis die Erde von der Sonne verschlungen wird. Das bringt nichts!

Dazu ist es wichtig zu wissen was deine Init. Funktion intern wirklich macht (Befehle vom SSD1306).

Obelix X. schrieb:

delay zum Anfang des Programms so lange wie möglich warten bis das Rauschen durch die Initialisierung überschrieben wird.

Dir ist schon klar, das delay dein Programm unterbricht? Sprich, führt die Init. einen "clear" durch, brauchst danach kein delay und tut sie es nicht, ist es egal ob davor oder danach, da du kein Multithreading hast.

: Bearbeitet durch User
#7943902
Lesenswert?

Adam P. schrieb:

Dir ist schon klar, das delay dein Programm unterbricht? Sprich, führt die Init. einen "clear" durch, brauchst danach kein delay und tut sie es nicht, ist es egal ob davor oder danach, da du kein Multithreading hast.

Ich erkläre dir das nochmal ganz langsam ...

  • Projekt wird eingeschaltet und Müll ist im OLED Speicher -> Rauschen
  • Delay -> warten, es wird weiterhin Müll angezeigt weil ja nichts durch das Programm gemacht wird
  • Display init -> Keine Ahnung ob das den OLED Speicher initialisiert, aber angenommen ja, dann ist das der früheste Zeitpunkt an dem der Bildinhalt geändert wird.

Sorry, ich bin davon ausgegangen, dass die Ironie eindeutig wäre.

: Bearbeitet durch User
#7943907
Lesenswert?

Es gibt bei allen Displays ein Display-on und ein Display-off Kommando. Damit wird der Bildschirm abgeschaltet, aber nicht der Display-Controller. Bevor man irgendetwas Anderes macht (Initialisierung) gibt man also ein Kommando Display-off und wenn alles fertig ist, ein Display-on. Dann gibt es keinen Schnee.

Mag sein dass die sogenannten Libs den (Arduino) User so bevormunden dass es keine Möglichkeit gibt die Sequenz so wie beschrieben auszuführen.

#7944057
Lesenswert?

Meine Library enthält folgende Sequenz nach der Initiaisierung des Chips:

1
clear();   // buffer memory
2
display(); // send buffer to display   
3

4
i2c.beginTransmission(i2c_address);
5
i2c.write(0x00); // command
6
i2c.write(0x8D); // enable charge pump
7
i2c.write(0x14);
8
i2c.write(0xAF); // display on
9
i2c.endTransmission();

Möglicherweise hatte ich deswegen noch nie "Schnee" im Bild gesehen.

: Bearbeitet durch User
OP #7944096
Lesenswert?

Adam P. schrieb:

Das würde mich sehr stark wundern, außer du entfernst die Spannungsversorgung nicht wirklich. (Das würde mich jetzt echt interessieren)

Ich schalte in der Abschaltsequenz den "EN"-Pin eines StepUp-Wandlers aus, d.h. da bleibt noch eine kleine Restspannung, die dann langsam abfällt. Beim Neustart erscheint das Rauschen nur, wenn die Sequenz nicht durchlaufen wurde. d.h. wenn z.Bsp. der Akku ausgesteckt wurde.

#7944187
Lesenswert?

Adam P. schrieb:

Soll das jetzt bedeuten, wenn du deine "Ausschaltsequenz" ausführst, dann die Spannungsversorgung komplet entfernst, paar Sekunden, 1 Minute wartest und dann deine Schaltung mit Spannung versorgst, kein "Rauschen" zu sehen ist?

Das würde mich sehr stark wundern,

Es ist auch für mich nicht logisch. In meinem Gerät schreibe ich "Power off" ins Display und ein paar Sekunden die Versorgung aus. Wenn ich nach Wochen oder Monaten wieder einschalte, ist das Display schwarz aus, bevor ich den Starttext ausgebe.

Axel R. schrieb:

Wie groß ist denn die u8g2 im Vergleich zum Adafruit-Dingens? Ich musste bei Adafruit jede einzelne SPI<->I2C "Abfrage" rausnehmen und auch sonst sehr viel rauslöschen, um überhaupt etwas Spielraum auf einem U32u4 zu haben.

Schaue Dir mal die lib von Greiman an, nicht perfekt, aber sparsam: https://github.com/greiman/SSD1306Ascii

Obelix X. schrieb:

Projekt wird eingeschaltet und Müll ist im OLED Speicher -> Rauschen

Ist denn überhaupt definiert, was im Speicher steht - ist doch kein PROM.

Frank O. schrieb:

Ich finde deine Kommentare oft pingelig,

.. und andere sind meist überflüssig.

#7944268
Lesenswert?

Michael F. schrieb:

Ich schalte in der Abschaltsequenz den "EN"-Pin eines StepUp-Wandlers aus, d.h. da bleibt noch eine kleine Restspannung, die dann langsam abfällt. Beim Neustart erscheint das Rauschen nur, wenn die Sequenz nicht durchlaufen wurde. d.h. wenn z.Bsp. der Akku ausgesteckt wurde.

Also hast du das Problem ansich ja noch nicht gelöst / verstanden. Alles was du bis jetzt gemacht hast, war ja dann nur eine temporäre Lösung die anscheinend bei gegebenen Bedingungen funktioniert.

Manfred P. schrieb:

Ist denn überhaupt definiert, was im Speicher steht - ist doch kein PROM.

Nein ist es nicht, genau so wenig wie im RAM von einem µC (beim Start).

: Bearbeitet durch User
OP #7944624
Lesenswert?

Frank O. schrieb:

Michael F. schrieb:

Ich habe in meiner verwendeten Lib keinen entsprechenden Befehl gefunden, ich denke, das ist in Nepomuks Lib dann besser gelöst.

Hast du alles zur Ulli Kraus lib gelesen? Das glaube ich nicht. Es steht ganz sicher in den sehr umfangreichen Beschreibungen.

Ich geb's zu, ich habe nicht alles von vorne hin hinten durchgelesen, aber ich komme schon zum Schluss, dass die Initalisierung doch mit dem Befehl "u8x8.begin();" erfolgt und in dem Moment auch das Rauschen erscheint. Alle Befehle mit clear() o.ä. scheinenen hier keinen positiven Effekt bzgl. des Rauschbildschirms zu haben.

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