128x64-OLED weniger störempfindlich machen

Gast #6036907
Lesenswert?

Ich nehme an ich bin nicht der Einzige, der chinesische 
0,96"-OLED-Module einsetzt (128x64) und festgestellt hat, dass die nach 
Einbau in 230V-Geräte, z.B. als Timer, sehr empfindlich auf Störungen 
reagieren, z.B. auf Schaltvorgänge. Plötzlich dreht sich das Bild um 
o.ä.

Falls schon mal jemand Massnahmen direkt am OLED statt an der Quelle der 
Störung durchprobiert hat und etwas gefunden hat, um es etwas stabiler 
zu bekommen, würde ich gerne davon hören. Ich denke an lokale 
Stabilisierung/Filterung der 5V-Versorgung oder Abschirmung oder Buffer 
für die SPI-Leitungen am OLED (incl. Level-Shifter, um die angeblich 
5V-toleranten Module mal mit korrekten 3,3V-Logik-Pegeln anzusteuern) 
u.ä.
Gast #6037481
Lesenswert?

Michael schrieb:
> würde ich gerne davon hören.

So wirst du nichts Belastbares bekommen da die Sörungen
sehr stark vom tatsächlichen Aufbau abhängen.

Wenn dir hier jemand Tipps geben sollte dann sind diese so
allgemein gehalten dass nur Gelabere bzw. Gemeinplätze
dabei herauskommt/kommen.
#6037523
Lesenswert?

Michael schrieb:
> Ich denke an lokale
> Stabilisierung/Filterung der 5V-Versorgung oder Abschirmung oder Buffer
> für die SPI-Leitungen am OLED (incl. Level-Shifter, um die angeblich
> 5V-toleranten Module mal mit korrekten 3,3V-Logik-Pegeln anzusteuern)
> u.ä.

Bist du sicher, daß die Störung in OLED selbst und nicht in dem 
angeschlossenen Kontroller ist? Wie hast du das festgestellt?

Du kannst auch mit SPI-Geschwindigkeit spielen versuchen.
Gast #6037626
Lesenswert?

Wenn du das reproduzieren kannst, wäre doch das Erste, sich die Signale 
mit einem Oszilloskop anzuschauen und zu gucken, welches Signal sich 
etwas einfängt. Dann kann man daraus schlussfolgern und entsprechend 
über Maßnahmen diskutieren.

Ich habe das gleiche auch schonmal gehabt. Konnte es aber nicht 
reproduzieren, weshalb ich dem Problem nie auf die Schliche gekommen 
bin...
Gast #6037672
Lesenswert?

> Bist du sicher, daß die Störung in OLED selbst und nicht in dem angeschlossenen 
Kontroller ist? Wie hast du das festgestellt?

Der Controller zeigt keine Funktionsstörungen. Er gibt den OLED-Inhalt 
10 mal po Sekunde aus. Eigentlich sollten Störungen sofort wieder 
verschwinden. Die Artefakte (typischer Fall: Bild dreht sich nach 
230V-Schaltvorgängen um 180 Grad oder verschiebt sich vertikal) bleiben 
aber - bis der Controller einen Reset am OLED auslöst. Was ich deshalb 
noch plane: Regelmässiges erneutes Senden jener Befehle der 
Initialisierung, die was mit Mapping/Drehung zu tun haben (statt nur 
Pixel zu senden)

> wäre doch das Erste, sich die Signale mit einem Oszilloskop anzuschauen und zu 
gucken

Wenn die Störungen leitungsgebunden wären. Ich vermute aber nicht, denn 
wenn ich das Display durch die vorgesehene Öffnung im Blech hängen lasse 
(die Leitungen sind dann z.g.T. immer noch im 230V-Geät), gibt es keine 
Störungen. Nur wenn das Display an der vorgesehenen Stelle im Blech 
klebt und die Unterseite damit im Inneren der Maschine liegt, gibt es 
Störungen.
Gast #6037683
Lesenswert?

> Ich nehme an ich bin nicht der Einzige, der chinesische

Doch, es liegt an dir. :-)

Ich hab so ein Teil seit einem Jahr im Dauerbetrieb laufen ohne das ich 
da jemals ein Problem mit hatte. Allerdings kann man jetzt sehen das die 
haeufiger benutzen Pixel deutlich dunkler sind als die weniger 
genutzten.

Ich wuerde mal sagen deine Verdrahtung ist kacke. Send Pix!

Olaf
#6037696
Lesenswert?

Michael schrieb:
> Was ich deshalb
> noch plane: Regelmässiges erneutes Senden jener Befehle der
> Initialisierung, die was mit Mapping/Drehung zu tun haben (statt nur
> Pixel zu senden)

Das kann man nur aus Verzweiflung machen. Beseitigst du die Ursache 
nicht, dann kann das Problem woanders kommen, und zwar nach einiger 
Zeit.

Michael schrieb:
> nach
> Einbau in 230V-Geräte, z.B. als Timer, sehr empfindlich auf Störungen
> reagieren, z.B. auf Schaltvorgänge. Plötzlich dreht sich das Bild um
> o.ä.

Bedeutet das, daß das Gerät von dem gleichen Kontroller geschaltet wird, 
der auch OLED bedient? Wenn so, dann solltest du Relais in Visier 
nehmen. Besonders hochinduktive Verbraucher (z.B. Kühlschrank) brauchen 
etwas Aufmerksamkeit. Ich hoffe, RC-Dämpfer hast du schon eingebaut?
Gast #6038222
Lesenswert?

Wie sieht das Display init aus, werden alle Register im Display gesetzt? 
Ich hatte so einen Effekt beim debuggen wenn ich das laufende Programm 
unterbrochen hatte und nur den uC neu gestartet hatte. Dann kann der 
Controller Müll bekommen und ohne HW Reset gab es ähnliche Bilder.
Das kann auch passieren wenn durch die Störung nur der uC resettet. Zum 
Testen in das Programm mal etwas einbauen was einen Reset anzeigt.
Gast #6038235
Lesenswert?

Michael schrieb:
> Wenn die Störungen leitungsgebunden wären. Ich vermute aber nicht,
> .....
> .....

Unglaublich welcher Starrsinn daraus spricht. So wird das
nichts wrden.

Dabei wäre es so einfach den konkreten Aufbau inklusive
Schaltplan zu zeigen.

Denn die Erfahrung hier auf uC.net und anderen Foren zeigt:

Der Fehler sitzt in 99.99999 Prozent aller Fälle vor dem
Bildschirm bzw. in der Schaltung / dem Aufbau die/den der
vor dem Bildschirm sitzende kreiert hat.
Gast #6038601
Lesenswert?

> Wie sieht das Display init aus, werden alle Register im Display gesetzt?

Der Init-Code müsste stimmen. Ausschnittweise unten.

> hatte so einen Effekt beim debuggen wenn ich das laufende Programm unterbrochen 
hatte und nur den uC neu gestartet hatte

Bei mir nicht möglich, da der Controller nach Resets nicht an der 
gleichen Stelle im Programm landen würde, sondern bei einem 
Startbildschirmm. Ausserdem ruft der Controller beim Starten den 
Dispaly-init (incl. hartem Reset) auf.

> Unglaublich welcher Starrsinn daraus spricht

Nicht aufregen und andere Threads lesen. Ich suche nur 
"Das-hatte-ich-auch-mal-mit-diesen-OLED-Displays-und-die-Lösung-war"-Kom 
mentare.

--- schnipp
1
// initialize display (this function must not be called directly after power-on; displays need time to power up; there is a delay in module_init() for that reason)
2

3
void
4
oled_init()
5
{
6
    oled_reset();                                // hard display reset (via reset pin)
7

8
    oled_command(OLED_COMMAND_DISPLAYOFF);       // display off
9

10
    oled_command(OLED_COMMAND_SETVCOMDETECT);    // set VCOMH deselect level
11
    oled_command(0x20);                          // ~0.77 x VCC
12

13
    oled_command(OLED_COMMAND_SETMULTIPLEX);     // set multiplex ratio to suggested value
14
    oled_command(0x3F);
15

16
    oled_command(OLED_COMMAND_SETDISPLAYOFFSET); // set mapping of display start line to 0 (no offset)
17
    oled_command(0);
18

19
    oled_command(OLED_COMMAND_SETSTARTLINE);     // set display start line to 0
20

21
    oled_command(OLED_COMMAND_MEMORYMODE);
22
    oled_command(0);                             // choose horizontal addressing mode (only supported by SSD1306)
23

24
    if (DISPLAYRotated)                          // display rotated (upside down)?
25
    {
26
        oled_command(OLED_COMMAND_SEGREMAP | 0); // set segment re-map: column address 0 is mapped to SEG0
27

28
        oled_command(OLED_COMMAND_COMSCANINC);   // set COM output scan direction to normal mode: scan from COM0 to COM[N –1]
29
    }
30
    else
31
    {
32
        oled_command(OLED_COMMAND_SEGREMAP | 1); // set segment re-map: column address 127 is mapped to SEG0
33

34
        oled_command(OLED_COMMAND_COMSCANDEC);   // set COM output scan direction to remapped mode: scan from COM[N-1] to COM0
35
    }
36

37
    oled_command(OLED_COMMAND_SETCOMPINS);       // set COM pins hardware configuration to alternative configuration; disable left/right remap
38
    oled_command(0x12);
39

40
    oled_command(OLED_COMMAND_SETCONTRAST);      // choose contrast
41
    oled_command(OLEDContrast);
42

43
    oled_command(OLED_COMMAND_DISPLAYALLON_RAM); // output follows RAM content
44

45
    oled_command(OLED_COMMAND_NORMALDISPLAY);    // non-inverse display
46

47
    oled_command(OLED_COMMAND_SETDISPLAYCLOCKDIV);
48
    oled_command(0x80);                          // set display clock divider to suggested value
49

50
    oled_command(OLED_COMMAND_SETPRECHARGE);
51

52
    #ifdef OLED_EXTERNALVCC
53
        oled_command(0x22);
54
    #else
55
        oled_command(0xF1);
56
    #endif
57

58
    oled_command(OLED_COMMAND_CHARGEPUMP);       // charge pump must be enabled by the following commands: 8Dh (charge pump setting), 14h (enable charge pump) and AFh (display ON)
59

60
    #ifdef OLED_EXTERNALVCC
61
        oled_command(0x10);
62
    #else
63
        oled_command(0x14);
64
    #endif
65

66
    oled_command(OLED_COMMAND_DISPLAYON);        // turn on oled panel
67

68
    spi_chipselect(SPI_CS_NONE);
69
}
70

71
void
72
oled_reset()
73
{
74
    // generate reset (high-low-high)
75

76
    oled_reset_high();
77

78
    delay_us(100);                               // do not use delay_ms() here (timer not operational if this code is called during boot)
79

80
    oled_reset_low();
81

82
    delay_us(100);                               // do not use delay_ms() here (timer not operational if this code is called during boot)
83

84
    oled_reset_high();
85

86
    // wait 1ms for display to come out of reset
87

88
    delay_us(1000);                              // do not use delay_ms() here (timer not operational if this code is called during boot)
89
}
90

91
Ausschnitt aus dem Header-File:
92
-------------------------------
93

94
#define OLED_COMMAND_W                   128     // display dimensions
95
#define OLED_COMMAND_H                   64      // display dimensions
96

97
#define OLED_COMMAND_PAGES               (OLED_COMMAND_H / 8)
98

99
// contrast limits
100

101
#define OLED_CONTRAST_MAX                255
102

103
// ports
104

105
#define OLED_RS_PORT                     PORTD   // port for RS line
106
#define OLED_RS_PIN                      3       // pin  for RS line
107
#define OLED_RESET_PORT                  PORTD   // port for /RESET line
108
#define OLED_RESET_PIN                   7       // pin  for /RESET line
109

110
// use charge pump
111

112
#undef OLED_EXTERNALVCC
113

114
// SSD1306/SH1106 commands
115

116
#define OLED_COMMAND_SETCONTRAST         0x81
117
#define OLED_COMMAND_DISPLAYALLON_RAM    0xA4
118
#define OLED_COMMAND_DISPLAYALLON        0xA5
119
#define OLED_COMMAND_NORMALDISPLAY       0xA6
120
#define OLED_COMMAND_INVERTDISPLAY       0xA7
121
#define OLED_COMMAND_DISPLAYOFF          0xAE
122
#define OLED_COMMAND_DISPLAYON           0xAF
123

124
#define OLED_COMMAND_SETDISPLAYOFFSET    0xD3
125
#define OLED_COMMAND_SETCOMPINS          0xDA
126

127
#define OLED_COMMAND_SETVCOMDETECT       0xDB
128

129
#define OLED_COMMAND_SETDISPLAYCLOCKDIV  0xD5
130
#define OLED_COMMAND_SETPRECHARGE        0xD9
131

132
#define OLED_COMMAND_SETMULTIPLEX        0xA8
133

134
#define OLED_COMMAND_SETLOWCOLUMN        0x00
135
#define OLED_COMMAND_SETHIGHCOLUMN       0x10
136

137
#define OLED_COMMAND_SETSTARTLINE        0x40
138

139
#define OLED_COMMAND_MEMORYMODE          0x20
140
#define OLED_COMMAND_COLUMNADDR          0x21
141
#define OLED_COMMAND_PAGEADDR            0x22
142

143
#define OLED_COMMAND_COMSCANINC          0xC0
144
#define OLED_COMMAND_COMSCANDEC          0xC8
145

146
#define OLED_COMMAND_SEGREMAP            0xA0
147

148
#define OLED_COMMAND_CHARGEPUMP          0x8D
149

150
#define OLED_COMMAND_EXTERNALVCC         0x1
151
#define OLED_COMMAND_SWITCHCAPVCC        0x2
152

153
// SH1106-only commands
154

155
#define OLED_COMMAND_SETPAGEADDRESS      0xB0
156
#define OLED_COMMAND_SETLOCOLUMN         0x00
157
#define OLED_COMMAND_SETHICOLUMN         0x10
158

159
// default contrast
160

161
#ifdef OLED_EXTERNALVCC
162
    #define OLED_DEFAULT_CONTRAST        0x9F
163
#else
164
    #define OLED_DEFAULT_CONTRAST        0x10    // low contrast works better than recommended value 0xCF
165
#endif
166

167
// macros for RS (= command/data) and RESET signals
168

169
#define hal_oled_rs_high()               OLED_RS_PORT    |=  (1<<OLED_RS_PIN)
170
#define hal_oled_rs_low()                OLED_RS_PORT    &= ~(1<<OLED_RS_PIN)
171

172
#define hal_oled_reset_high()            OLED_RESET_PORT |=  (1<<OLED_RESET_PIN)
173
#define hal_oled_reset_low()             OLED_RESET_PORT &= ~(1<<OLED_RESET_PIN)
174

175
// globals
176

177
extern uint8_t         OLEDContrast;
178
extern uint8_t         OLEDChip;                 // chip type (OLED_SSD1306, OLED_SH1106)
179

180
// prototypes
181

182
extern void hal_oled_write   (uint8_t data, bool command);
183
extern void hal_oled_command (uint8_t command);
184
extern void hal_oled_data    (uint8_t command);
185
extern void hal_oled_init    (void);
186
extern void hal_oled_reset   (void);
187
extern void hal_oled_contrast(uint8_t contrast);
188
extern void hal_oled_rotate  (bool upsidedown);
189
extern void hal_oled_on      (void);
190
extern void hal_oled_off     (void);

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