Forum: Mikrocontroller und Digitale Elektronik DEP16201-Y auch 4-Bit?


von Tom H. (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Das DEP16201 hat einen Raystar RS0010 Displaycontroller. Und der besitzt 
auch einen 4-Bit-Mode.

MfG Spess

von Tom H. (Gast)


Lesenswert?

Perfekt, Danke für diese Info :)

von Tom H. (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
von Tom H. (Gast)


Lesenswert?

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

von Tom H. (Gast)


Lesenswert?

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

von Nosnibor (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

Im Datenblatt des RS0010 gibt gibt es am Ende eine Note zum Reset des 
Displaycontrollers im 4-Bit-Mode.

MfG Spess

von Karl M. (Gast)


Lesenswert?

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

von Tom H. (Gast)


Lesenswert?

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

von Karl M. (Gast)


Lesenswert?

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.

von Tom H. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.