Forum: Mikrocontroller und Digitale Elektronik 128x64-OLED weniger störempfindlich machen


von Michael (Gast)


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.ä.

von Beo Bachta (Gast)


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.

von Maxim B. (max182)


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.

: Bearbeitet durch User
von Brice (Gast)


Lesenswert?

Kein Plan, kein Bild, keine Hilfe.

von Christian (Gast)


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...

von Michael (Gast)


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.

von Olaf (Gast)


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

von Maxim B. (max182)


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?

: Bearbeitet durch User
von Johannes S. (Gast)


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.

von Beo Bachta (Gast)


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.

von Susi Sorglos (Gast)


Lesenswert?

> Wenn die Störungen leitungsgebunden wären. Ich vermute aber nicht

Entferne alle Leitungen. Dann können sie ganantiert nicht stören. .-)

von Michael (Gast)


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);

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.