Oled display 128 mal 64 180 Grad verdreht

OP #8092307
Lesenswert?

Hier meine Fragen , habe ich mal von der KI machen lassen...

Hallo zusammen,

ich habe ein etwas ungewöhnliches Problem mit einem 128x64 OLED mit I²C, Adresse 0x3C und ESP32c3.

Das Display lief mit meinem bisherigen Programm bisher problemlos. Seit einigen Tagen wird die gesamte Darstellung plötzlich um 180° gedreht angezeigt.

Das Interessante dabei:

Hardware wurde nicht verändert. Das gleiche OLED wird verwendet. Mein bisheriger Sketch wurde nicht bezüglich der Displaydarstellung geändert. Ich verwende den OLED-Treiber von Stefan Frings. Auch eine ältere Version der oled.h / oled.cpp von etwa 2020 wurde getestet. Mit der alten Version ist die Darstellung ebenfalls um 180° gedreht. Die Drehung betrifft die komplette Anzeige, also Text und Grafiken. Die Koordinaten funktionieren grundsätzlich, nur die gesamte Darstellung ist kopfstehend. Arduino IDE 1.8.13. Die OLED-Library arbeitet mit Software-I²C.

In der Initialisierung des Treibers stehen beispielsweise:

i2c_send(0xA1); // segment remapping mode i2c_send(0xC8); // COM output scan direction

Mir ist bewusst, dass diese Befehle die Orientierung bestimmen. Allerdings erklärt das für mich nicht, warum eine alte Version des Treibers, die zuvor funktioniert hat, plötzlich ebenfalls 180° gedreht darstellt.

Hat jemand diesen Effekt mit dem Stefan-Frings-OLED-Treiber schon einmal gehabt?

Besonders interessant wäre für mich, ob es eine bekannte Ursache gibt, bei der sich die Displayorientierung plötzlich ändert, obwohl OLED, Verkabelung und Programm unverändert sind.

Falls Stefan Frings hier mitliest: Vielleicht ist Ihnen dieser Effekt bereits begegnet.

Vielen Dank!

1
#include <Arduino.h>
2
#include "oled.h"
3

4
OLED display=OLED(A1,A0,NO_RESET_PIN,0x3C,128,64,false);
5

6
void setup()
7
{
8
  
9
    display.init();  
10
  delay(100);
11
  display.clear() ;
12

13
}
14

15

16
void loop()
17
{
18
   delay(500);
19
    display.draw_rectangle(0,50,127,63);
20
    
21
   display.display();
22
   display.set_contrast(64);
23
      display.display();
24
   delay(500);
25
   display.draw_rectangle(0,51,126,62,OLED::SOLID);
26
    display.display();
27
   delay(500);
28

29
    display.set_contrast(64);
30
       display.display();
31
    delay(500);
32
       display.draw_string(2,52,"TES",OLED::NORMAL_SIZE,OLED::BLACK);  
33
    display.display();
34

35
       delay(2500);
36
       display.clear() ; 
37
}

Alles o.k. nur 180 Grad verdreht..

Der Alte knacker

: Verschoben durch Moderator
#8092363
Lesenswert?

Al. K. schrieb:

Hier meine Fragen , habe ich mal von der KI machen lassen... Problem mit einem 128x64 OLED mit I²C, Adresse 0x3C und ESP32c3. Das Display lief mit meinem bisherigen Programm bisher problemlos. Seit einigen Tagen wird die gesamte Darstellung plötzlich um 180° gedreht angezeigt. Das Interessante dabei: Hardware wurde nicht verändert. Das gleiche OLED wird verwendet.

Da stimmt was nicht an den Angaben. Welches "Das Display" das bisher Problemlos lief ? Datasheet ?

Nachbau ? Display aus gleicher Charge?

Ich sehe da viele delays. Kabellänge geändert oder schon Grenzwertig das Timing ?

#8092651
Lesenswert?

Al. K. schrieb:

In der Initialisierung des Treibers stehen beispielsweise: i2c_send(0xA1); // segment remapping mode i2c_send(0xC8); // COM output scan direction

Hi und Hallo

Dann schreib doch da mal 0xA0 und 0xC0 rein. Dann „müsste“ das ja wieder umdrehen. Würde sonst bedeuten, dass dein Soft I2C die Kommandos zum initialisieren garnicht verwendet oder die unteren Bits nicht sauber überträgt und das OLED evtl. „von Hause aus“ seine Vorzugsrichtung verwendet. Was ich tun würde: einen alten Stand des Arduino-Sketches hochladen und mal kuggen. Man kann auch bei Start hinterm Display init mal 5 Sekunden Pause einbauen und in dieser Zeit mit ner Pinzette scl und sda überbrücken. Oder mal probieren, die Initialisierung testhalberweise wegzulassen. Aber dann wirds wohl garnicht angehen, weil die Ladungspumpen nicht gestartet werden. Was hängt denn noch am I2C Bus? Das mitm Oszi auszuzählen, ist mühsam, weil schon recht viele Initialisierungsbefehle gesendet werden. Unser EO213 dürfte das leider NICHT können. Dazu müsste der Befehl ständig wiederholt werden. Und für die Soundkarte isses ein wenig zu schnell. Aber signalintegrität (Flanken usw) ließe sich auch mitm älteren Gerät abschätzen. Hast du denn Zugriff auf ein (Speicher)Oszi? Viel Erfolg noch. (Ich bin mit sicher; am Ende isses wieder was ganz banales und wir konnten alle was lernen)

Also:

  • Rotation absichtlich provozieren (A0 und C0) und Ergebins berichten.

  • Firmwarestände, chronologisch sortiert, installieren und schauen, ab welchem Stadium der Änderung der Spaß auftritt. Dann beide Versionen vergleichen.

  • mitm Oszi draufschauen und den Datenstrom dekodieren (lassen)

Besten Gruß, Axelr.

#8092669
Lesenswert?

Ja klar. So ein Logikanalyser wäre perfekt. Man kann ja n zweiten Arduino hierfür nehmen, wenn man keinen LA besitzt.

Er schrieb ja, dass prinzipiell alles ginge, also wird das I2C Protokoll schon ansatzweise funktionieren, denke ich mal. Wenn er einen Logikanalysator hat, kann er das verifizieren. Hatta aber sicher nich. Also dann wenigstens mitm Oszi auf Clock triggern und sich die Daten ansehen. Bei fallender Taktflanke müssen die stabil auf „H“ oder „L“ liegen. Das geht zur Not auch mitm D195 und acht LEDs, wenn man garnichts hat. War ja auch nur n Tipp. Man kann Clock und Daten (100kHz) sicher auch anders visualisieren.

Da wird sein Soft-I2C iwie „ausgebremst“, tippe ich mal.

#8092677
Lesenswert?

Axel R. schrieb:

Ja klar. So ein Logikanalyser wäre perfekt. Man kann ja n zweiten Arduino hierfür nehmen, wenn man keinen LA besitzt.

Ein dafür geeigneter LA kostet keine 10€. Den sollte eigentlich jeder, der mit Datenübertragung und µC rumbastelt, in der Schublade haben.
https://www.amazon.de/dp/B0CFFGS5XF
https://www.amazon.de/dp/B0D868ST5C

: Bearbeitet durch User
#8092686
Lesenswert?

Ich würde vorher die Qualität der Signale prüfen, ansonsten sind die Erkenntnisse vom Logic Analyzer wertlos. Bei schlechten Signalen kann das Display was ganz anderes verstehen, als der Logic Analyzer.

Wie bei Harry Potter: "Er gat genuschelt"

: Bearbeitet durch User
(Firma: 1984now) #8092699
Lesenswert?

Al. K. schrieb:

Das Display lief mit meinem bisherigen Programm bisher problemlos. Seit einigen Tagen wird die gesamte Darstellung plötzlich um 180° gedreht angezeigt. Das Interessante dabei: Hardware wurde nicht verändert. Das gleiche OLED wird verwendet. Mein bisheriger Sketch wurde nicht bezüglich der Displaydarstellung geändert.

Aber wohl an anderer Stelle. Also: Änderung rückgängig machen. Verschwindet der Effekt dadurch: herausfinden, was genau ihn bewirkt.

Dazu vergleich man die Änderungen und überlegt, inwiefern sie den OLED-Treiber beeinflüssen könnten.

#8092730
Lesenswert?

Rainer W. schrieb:

Ein dafür geeigneter LA kostet keine 10€. Den sollte eigentlich jeder, der mit Datenübertragung und µC rumbastelt, in der Schublade haben.

Die Fähigkeiten, einen Logic Analyzer zu bedienen, liegen leider nicht in jeder Schublade herum, und die kann man auch nicht kaufen.

Ein grenzwertiges Timing-Problem lässt sich auch mit dem besten Logic Analyzer nicht eingrenzen.

[Schbässle]
Am Besten man fragt die KI ob die Timing-Werte für das LCD/OLED stimmen.
[/Schbässle]

OP #8092753
Lesenswert?

Habe jetzt alle meine OLED Displays getestet, und feststellen müssen das Eins eine 180 Grad Drehung anzeigt. auf Grund der vielen Tests welche ich gemacht habe kann ich jetzt nicht mehr nachvollziehen das ich dieses gedrehte Display getauscht hatte, beim probieren.

Ich war auch schon soweit, alles so zu lassen wie es ist. Aber dies ist bestimmt zu 99% das bezeichnete Problem. Danke für Diejenigen welche eine ehrliche Hilfe Angeboten haben.

Der 81 Jährige alte knacker

#8092898
Lesenswert?

Al. K. schrieb:

Ich war auch schon soweit, alles so zu lassen wie es ist. Aber dies ist bestimmt zu 99% das bezeichnete Problem. Danke für Diejenigen welche eine ehrliche Hilfe Angeboten haben.

Man könnte beim Testen natürlich auch einen Stapel machen mit 0°-Drehung und einen mit 180°-Drehung.

Vermutung: Das Display wird nicht vollständig initisialisiert und die verdrehte Darstellung ist schon "werkseitig" gesetzt. (Warum auch immer.)

#8092904
Lesenswert?

Rahul D. schrieb:

Vermutung

Besser wäre: nachschauen.

Aber wie immer sind die wenigen kB Code mal wieder ein Staatsgeheimnis. Der aktuelle Code von Stefan Frings kann es jedenfalls nicht sein, denn der hat einen anderen Konstruktor.

Al. K. schrieb:

Bei der gleichen Hartware

Wie wir jetzt wissen, ist es wohl doch nicht die gleiche Hardware. Dazu bitte bedenken, dass die chinesischen Hersteller häufig kleine Details ändern ohne darauf hinzuweisen. Erschwerend kommt dazu, dass die Produkte meist ohne technische Unterlagen (Schaltplan, Datenblatt) und ohne eindeutigen Namen verkauft werden. Da kann man nie sicher sein, das zu bekommen, was man erwartet hat. Man muss jedes einzelne Teil nach der Lieferung kontrollieren.

: Bearbeitet durch User
(Firma: Starfleet) #8092906
Lesenswert?

"Kopfstehend" (an der Horizontalachse gespiegelt) und "180° gedreht" sind zweierlei.

Die Frage ist, wo die lib den Koordinatenursprung (x=0,y=0; engl: origin) sieht, resp. wohin dieser konfiguriert wurde.

Standardmäßig liegt 0,0 oben links; und nicht wie manche erwarten würden unten, links.

: Bearbeitet durch User
#8092921
Lesenswert?

Hans W. schrieb:

Dazu bitte bedenken, dass die chinesischen Hersteller häufig kleine Details ändern ohne darauf hinzuweisen.

Hans W. schrieb:

Aber wie immer sind die wenigen kB Code mal wieder ein Staatsgeheimnis. Der aktuelle Code von Stefan Frings kann es jedenfalls nicht sein, denn der hat einen anderen Konstruktor.

Auf ein ähnliches Problem bin ich auch gestoßen. Die Lösung war die richtige Initialisierungssequenz.
Zitat:

note: 0x81 and 0xC8, otherwise display mirrored
/Zitat

vorher:
0x81, 0xCF
Das sind "Zweibyte"-Befehle, wobei 0xC8 bzw. 0xCF der Parameter ist.

ciao
gustav

: Bearbeitet durch User
#8092941
Lesenswert?

Al. K. schrieb:

... auf Grund der vielen Tests welche ich gemacht habe kann ich jetzt nicht mehr nachvollziehen ...

Da hilft es sich vorher einen kleinen Testplan zu machen und diesen durchzugehen. Da kann man auch gleich die Ergebnisse drauf notieren. Parallel entstehende Fotos, Screenshots, Quelltexte und/oder Messreihen werden ebenfalls gleich dem richtigen Test zugeordnet.

Damit hat man eine Chance hinterher noch nachzuvollziehen, was man da eigentlich gemacht hat.

Und immer nur an einem Parameter drehen, auch wenn die Versuchung groß ist!

OP #8092967
Lesenswert?

Rick schrieb:

Und immer nur an einem Parameter drehen, auch wenn die Versuchung groß ist!

Da hast du Recht.

Aber bei diesen Problem spielt die Interesse warum? es so ist am meisten mit. Wenn ich es nötig hätte drehe ich das Display. Bei einzelnen Projekten kein Problem, ehe man Tagelang sucht.

Hugo H. schrieb:

Wozu wird das wohl da sein?

Wo gefunden, zeige mal etwas genauer.. ;--))))

Der alte 81 Jährige

P.S. Stefan wollte ich mit diesen Problem nicht belästigen...

: Bearbeitet durch User
#8092969
Lesenswert?

Al. K. schrieb:

Wo gefunden, zeige mal etwas genauer.. ;--))))

Die (Doxygen-) Beschreibung findet man in der OLED.h und die Funktionsdefinition in der OLED.cpp.

Wenn man schon die "OLED.h" inkludiert, liegt der Verdacht nahe, dass sie sich darin befindet. Die entsprechenden Binärcodes für die Display-Konfiguration sollten im Datenblatt des Display-Controllers beschreiben sein. (Wenn nicht, ist der Hersteller dem Untergang geweiht.)

#8092973
Lesenswert?

Bau dir doch am ADC einen Spannungsteiler und je nach Typ und Version stellst du dort 1, 2 oder 3Volt ein und kannst anschließend im Code, je nach eingestellter Spannung, dein Display leicht abweichend initialisieren. Bei einem Typ drehst du es um 180Grad, beim anderen nicht. Brauchst auf der Platine blos zwei Widerstände ändern. Je nach dem, welches Display Dir unter die Finger kommt. Oder baust noch n kleinen Taster mit auf die Platine. Klick -> gedreht. Hast du vielleicht ein kleines Menü im Display? Dann bastle dort, zusätzlich zu „Helligkeit und Kontrast“, eben noch die Drehung mit rein. Dann bist du nächstes Mal fein raus.

Kannst ja froh sein, wenn Dir jemand die Initialisierung bereits angenommen hat. Ich hatte so einen blöden 3D-Druck-Rahmen über dem Display, dass mir nur 122 x 58 Pixel freie Sicht blieben. Der Rest war verdeckt. Da durfte ich die Initialisierung fast komplett allein machen. Dabei half das Datenblatt vom Display-Controller und ein Blick in die ominöse „Oled.h“.

#8093057
Lesenswert?

Kilo S. schrieb:

Axel R. schrieb:

Der Rest war verdeckt. Da durfte ich die Initialisierung fast komplett allein machen.

Und warum ausgerechnet das? Ich hätte den Rahmen einfach vorsichtig weg gemacht oder den Versatz beim Schreiben berücksichtigt. Man will ja doch den ganzen Anzeigebereich, gerade bei den kleinen Displays.

Man hätte dem Konstrukteur den Druck auf den Schreibtisch knallen sollen und ihn das neu machen lassen. Stimmt schon. War aber in der Zeit nicht angezeigt. (musste halt fertig werden). Ich wollte da auch erst rumfeilen und den Bereich freilegen, aber das Design gab das wegen den Schrägen nicht her. Nochmal tue ich mir das nicht an. Ging nämlich auch ne Menge Zeit drauf.

#8093067
Lesenswert?

Wastl schrieb:

Karl B. schrieb:

Hier noch eine Initialisierungsroutine für den Controller Type SSD1306 und "kompatible".

Die Umsetzung deines genialen Asm-Codes in sein C-Programm wird den Al.K. den Rest seines Lebens beschäftigen.

Falls man es noch nicht selber gemerkt hat, der TO hat zum selben Thema noch einen Thread aufgemacht. Hier geht es weiter:

Beitrag "Re: OLED_SPI_128_64"

Und mit Arduino. Den ASM-Krempel braucht er dann wohl nicht mehr. Aber das war ja vorher nicht gesagt worden.

ciao
gustav

: Bearbeitet durch User
(Firma: Starfleet) #8093083
Lesenswert?

Seit einigen Tagen wird die gesamte Darstellung plötzlich um 180° gedreht angezeigt.

Bei frühen OLED gabs das Problem der unterschiedlichen Alterung (Reduktion der Leuchtkraft) der Grundfarbpolymere und Ansätze dafür dies wieder auszugleichen, also dafür zu Sorgen das die Grundfarben eines Pixels gleichmäßig "verblassen". (Software-seitiges Antiwear)

"Auf den Kopf stellen" nach einer gewissen betriebs war ein Ansatz dazu, nicht das das "versehentlich" aktiviert wurde. (der bei rotierbaren Handhelds halbwegs funktioniert).

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