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
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
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.
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.
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.
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.
Harald K. schrieb: > Verwendest Du einen "graphischen Compiler"? Sinnlose Gegenfrage, denn ich will den Code nicht compilieren.
Dann ist es damit für dieses Universum entschieden worden. Sollte es doch nicht um alle gehen: Dann schweig doch einfach.
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
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.
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
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.
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. ;)
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
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
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.
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
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.
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.
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.
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.
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

