Hallo @all ich habe hier ein DEP16201-Y OLED Display (16x2 gelb) und wollte ein Modul mit einem PCF8574T-IC nach I2C verwenden. So benötige ich zur Ansteuerung des OLED nur I2C zum uC + VCC & GND. Nun funktionieren die PCF8574T Boards nur mit 4-Bit zum OLED. Ich kann leider im Datenblatt nicht finden, ob das Modul auch mit 4-Bit funktioniert. Hat hier jemand mehr Informationen? Gruß Tom
Hi Das DEP16201 hat einen Raystar RS0010 Displaycontroller. Und der besitzt auch einen 4-Bit-Mode. MfG Spess
Gestern getestet getestet, funktioniert! :) Was ich aber feststellen muss: Nach jeden 3. Reset des uC, wird das OLED nicht richtig initialisiert und zeigt seltsame Zeichen an und lässt sich nicht ansprechen. Werde ich mal weiter Untersuchen. Hat jemand vielleicht einen Tipp? Tom
Tom H. schrieb: > Hat jemand vielleicht einen Tipp? Tritt der Fehler nur nach einem Reset unter Spannung auf (Resettaster) oder passiert das nur nach einem Power-Up (sowohl Controller als auch Display stpannungsfrei) oder passiert das sowohl als auch? > Hat jemand vielleicht einen Tipp? Die üblichen Probleme: Timing und/oder Kommandoreihenfolge bei der Initialisierung nicht korrekt.
:
Bearbeitet durch Moderator
Lothar M. schrieb: > Tritt der Fehler nur nach einem Reset unter Spannung auf (Resettaster) > oder passiert das nur nach einem Power-Up (sowohl Controller als auch > Display stpannungsfrei) oder passiert das sowohl als auch? Der Fehler tritt nur bei einem Reset unter Spannung auf. Ich verwende ein Arduino Zero M0 pro verbunden über I2C, 5V und GND. Mache ich den Controller und Display spannungsfrei und erneut Powerup, funktioniert es immer zu 100%.... Ich werde heute Abend mal einen anderen Controller (Uno) nutzen, eventuell eine alternative LCD-I2C-Library... Tom
Hier hat jemand genau dieses Problem. Genau diese Zeichen entstehen, wenn ein Reset unter Spannung durchgeführt wird. https://forums.adafruit.com/viewtopic.php?p=279621 Ich werde also VCC mit einem Transistor kurz aus- und wieder einschalten, bei einem Reset unter Spannung. Das Oled-Display kann ich somit auch deaktivieren, wenn es nicht benötigt wird. Muß aber noch eine Möglichkeit finden, den Oled-I2C Bus von den restlichen Komponenten zu trennen (Oled ausgeschaltet) und wieder zu verbinden (in Soft- und Hardware). Eventuell mit einem Mosfet? Tom
Lothar M. schrieb: >> Hat jemand vielleicht einen Tipp? > Die üblichen Probleme: Timing und/oder Kommandoreihenfolge bei der > Initialisierung nicht korrekt. Genau das. Als erstes würde ich prüfen, ob vor dem Umschalten auf den 4bit-Modus dreimal auf 8bit geschaltet wird. Das ist einfach nötig, wenn man nicht weiß, in welchem Zustand das Display vorher war, und wird gerne vergessen, weil es unter günstigen Bedingungen auch ohne geht.
Hi Im Datenblatt des RS0010 gibt gibt es am Ende eine Note zum Reset des Displaycontrollers im 4-Bit-Mode. MfG Spess
spess53 schrieb: > Hi > > Im Datenblatt des RS0010 gibt gibt es am Ende eine Note zum Reset des > Displaycontrollers im 4-Bit-Mode. > > MfG Spess Danke für den Hinweis zum Datenblatt, für einen weiteren Chip WS0010 hatte ich das ähnlich schon mal gesehen. https://libstock.mikroe.com/blog_docs/get/114/1496146223-raystar-rs0010-o.pdf
Ich habe es mal in die LiquidCrystal_I2C.cpp (Library Arduino) angepasst. (Habe ich noch nie gemacht) Nach einigen testen, funktioniert es nun. Ab und zu ist noch ein 2.Reset notwendig, damit Zeile 1 und Zeile 2 richtig herum dargestellt werden. Jemand noch eine Idee? Vielen Dank für die sehr guten Tipps hier im Forum! Tom
1 | ...
|
2 | void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { |
3 | if (lines > 1) { |
4 | _displayfunction |= LCD_2LINE; |
5 | }
|
6 | _numlines = lines; |
7 | |
8 | // for some 1 line displays you can select a 10 pixel high font
|
9 | if ((dotsize != 0) && (lines == 1)) { |
10 | _displayfunction |= LCD_5x10DOTS; |
11 | }
|
12 | |
13 | // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
|
14 | // according to datasheet, we need at least 40ms after power rises above 2.7V
|
15 | // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
|
16 | delay(50); |
17 | |
18 | // Now we pull both RS and R/W low to begin commands
|
19 | expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1) |
20 | delay(500); |
21 | |
22 | //put the LCD into 4 bit mode
|
23 | // this is according to the hitachi HD44780 datasheet
|
24 | // figure 24, pg 46
|
25 | |
26 | // Repeat procedures for an 4-Bit Interface OLED(RS0010)
|
27 | for (int rs0010 = 0; rs0010 < 4; rs0010++) |
28 | {
|
29 | write4bits(0x0 << 9); |
30 | delayMicroseconds(2000); |
31 | }
|
32 | |
33 | // 4-Bit initialization sequence from Technobly
|
34 | write4bits(0x03 << 4); // Put back into 8-bit mode |
35 | delayMicroseconds(5000); |
36 | |
37 | write4bits(0x08 << 4); |
38 | delayMicroseconds(5000); |
39 | |
40 | write4bits(0x02 << 4); // Put into 4-bit mode |
41 | delayMicroseconds(5000); |
42 | write4bits(0x02 << 4); |
43 | delayMicroseconds(5000); |
44 | write4bits(0x08 << 4); |
45 | delayMicroseconds(5000); |
46 | |
47 | command(0x08); // Turn Off |
48 | delayMicroseconds(5000); |
49 | |
50 | command(0x01); // Clear Display |
51 | delayMicroseconds(5000); |
52 | |
53 | command(0x06); // Set Entry Mode |
54 | delayMicroseconds(5000); |
55 | |
56 | command(0x02); // Home Cursor |
57 | delayMicroseconds(5000); |
58 | |
59 | command(0x0C); // Turn On - enable cursor & blink |
60 | delayMicroseconds(5000); |
61 | |
62 | // set # lines, font size, etc.
|
63 | command(LCD_FUNCTIONSET | _displayfunction); |
64 | delayMicroseconds(5000); |
65 | |
66 | // turn the display on with no cursor or blinking default
|
67 | _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; |
68 | display(); |
69 | delayMicroseconds(5000); |
70 | |
71 | // clear it off
|
72 | clear(); |
73 | delayMicroseconds(5000); |
74 | |
75 | // Initialize to default text direction (for roman languages)
|
76 | _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; |
77 | delayMicroseconds(5000); |
78 | |
79 | // set the entry mode
|
80 | command(LCD_ENTRYMODESET | _displaymode); |
81 | delayMicroseconds(5000); |
82 | |
83 | home(); |
84 | delayMicroseconds(5000); |
85 | }
|
86 | ...
|
Hallo, als Tipp
1 | for (int rs0010 = 0; rs0010 < 4; rs0010++) |
2 | {
|
3 | write4bits(0x0 << 9); |
4 | delayMicroseconds(2000); |
5 | }
|
Die Schleife läuft 4 mal durch, 0x0 << 9 ist immer 0. Warum wird rs0010 als Integer = 15 Bit + Vorzeichen verwendet? unsinnig.
Der Befehl wird nun 5mal aufgerufen. Für int nutze ich jetzt byte. Danke :) Tom
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.