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.ä.
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.
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
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...
> 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.
> 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
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
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.
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.
> Wenn die Störungen leitungsgebunden wären. Ich vermute aber nicht
Entferne alle Leitungen. Dann können sie ganantiert nicht stören. .-)
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.