Forum: Mikrocontroller und Digitale Elektronik SSD1306 Display, Rauschen/Schnee bei der Initialisierung


von Michael F. (michael_f268)


Angehängte Dateien:

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

von Nemopuk (nemopuk)


Lesenswert?

Michael F. schrieb:
> Ist dieses "Rauschen" bei Beginn des Programm unvermeidlich

Es ist vermeidbar. Bei meiner Bibliothek tritt es nicht auf. Aber ich 
schätze, dass die Bibliothek nicht der Knackpunkt ist, sondern wie du 
sie benutzt. Dennoch, probiere einfach mal meine zum Vergleich.

https://stefanfrings.de/arduino_oled/index.html

von Michael F. (michael_f268)


Lesenswert?

Vielen Dank für die Library, ich habe die eben hochgeladen auf den 
Arduino, allerdings erscheint hier auch dieses Rauschen zu Beginn, das 
muss mal an etwas anderen liegen bei mir.

von Nemopuk (nemopuk)


Lesenswert?

Michael F. schrieb:
> das muss mal an etwas anderen liegen bei mir.

Wenn du meinen Sketch genommen hast, kann es ja nur die Stromversorgung 
oder das Display selbst sein. Meine starten immer schwarz.

von Michael F. (michael_f268)


Angehängte Dateien:

Lesenswert?

Das scheint wohl was mit dem Ausschalten vorm Neustart gelegen zu haben. 
Ich habe dort jetzt noch die Zeile "u8x8.noDisplay();" eingefügt und 
jetzt sieht es so aus, als ob das Rauschen nicht mehr kommt.

von Michael F. (michael_f268)


Lesenswert?

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.

von Nemopuk (nemopuk)


Lesenswert?

Gut zu wissen. Danke

von Michael F. (michael_f268)


Lesenswert?

Vielen Dank für deine Unterstützung!

von Rainer W. (rawi)


Lesenswert?

Michael F. schrieb:
> Auschaltsequenz.png

Quellcode als PNG - ganz großes Kino :-(

von Nemopuk (nemopuk)


Lesenswert?

Rainer W. schrieb:
> Quellcode als PNG - ganz großes Kino

Brauchst du ihn als Text?

von Harald K. (kirnbichler)


Lesenswert?

Nemopuk schrieb:
> Brauchst du ihn als Text?

Verwendest Du einen "graphischen Compiler"?

von Nemopuk (nemopuk)


Lesenswert?

Harald K. schrieb:
> Verwendest Du einen "graphischen Compiler"?

Sinnlose Gegenfrage, denn ich will den Code nicht compilieren.

von Schwierig (ruelps)


Lesenswert?

Dann ist es damit für dieses Universum entschieden worden.
Sollte es doch nicht um alle gehen: Dann schweig doch einfach.

von Rainer W. (rawi)


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
von Adam P. (adamap)


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.

von Axel R. (axlr)


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
von Obelix X. (obelix)


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.

von Axel R. (axlr)


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.

ja - genau;
1
delay(4096);
hätte ich da hingeschrieben. ;)

von Adam P. (adamap)


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
von Obelix X. (obelix)


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
von Wastl (hartundweichware)


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.

von Nemopuk (nemopuk)


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
von Michael F. (michael_f268)


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.

von Michael F. (michael_f268)


Lesenswert?

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

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

von Frank O. (frank_o)


Lesenswert?

Rainer W. schrieb:
> Quellcode als PNG - ganz großes Kino :-(

Ich finde deine Kommentare oft pingelig,  aber die sind tatsächlich die 
letzte Zeit nicht mehr so schlimm und dieser hier, nicht nur lustig 
beschrieben,  sondern auch völlig richtig.

von Frank O. (frank_o)


Lesenswert?

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.

von Manfred P. (pruckelfred)


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.

von Frank O. (frank_o)


Lesenswert?

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

Danke für den Hinweis.
Bei der von Ulli kann man das auch klein kriegen, muss aber viel und an 
unterschiedlichen Stellen lesen.

von Adam P. (adamap)


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
von Manfred P. (pruckelfred)


Lesenswert?

Adam P. schrieb:
> 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).

Ja, und damit ist unklar, wo das "Rauschen" herkommt und, weshalb ein 
definierten Ausschalten dessen Anzeige verhindern soll.

von Michael F. (michael_f268)


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.

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.