Forum: Mikrocontroller und Digitale Elektronik [Pollin] Grafik Display Anschluss Verständnisfragen


von Ralf M. M. (ramime)



Lesenswert?

Hallo zusammen,

nachdem ich inzwischen erfolgreich das "Sanbum" Display:
Beitrag "Pollin LCD SANBUM LBL-11337"
dank der tollen Vorarbeiten einiger Forumsmitglieder in Betrieb nehmen 
konnte (vielen Dank für diese Vorarbeiten), möchte ich mich nun an einem 
weiteren Display von Pollin versuchen. Und zwar dem folgenden:
http://www.pollin.de/shop/dt/MzU4ODc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/Grafik_Display_W_DISPLAY_WCG12864B6FSDEWG_GDSC_FF_12864WM_64_.html

Als Modellnummer wird angegeben WCG12864B6FSDEWG (GDSC-FF-12864WM-64) 
und es sind auch 2 Datenblätter bei Pollin hinterlegt. Einmal eines des 
Displays selbst und einmal eines des verwendeten Controllers.

So nun zu meinen Fragen (leider kann ich noch nicht praktisch testen, da 
erst morgen die Stecker kommen)

1.) Aus dem Display sind die Anschlüsse D0-D7 herausgeführt und auch 
andere Steuerleitungen, aber nicht die im Controller-Datenblatt 
erwähnten Konfigurationspins "P/S" (für Umschaltung parallel/seriell) 
und "C86" für Umschaltung des Modus (8080/6800). Bedeutet das, dass es 
auch alle Fälle ein Parallelmodus ist oder habe ich irgendwo übersehen, 
dass die Einstellung des Modus auch mit den vorhandenen Pins geht?

2.) ich habe verstanden, dass ich an die Cx+ und Cx- in verschiedenen 
Varianten Kondensatoren anschließen kann um die eingebaute Charge-Pump 
zu benutzen, jedoch ist mir zum einen nicht klar, welchen Faktor ich 
nehmen muss, wenn ich die in der Zeichnung des Modul-Datenblatts 
angegebenen Werte für Vdd=3,3V und LCD Driving Voltage = 8,5V haben 
will. Da der Anschluss CAP4+ nicht herausgeführt ist, denke ich mal, 
dass ich eh nur 3x und 2x Step-Up machen kann. Aber mit 3x bin ich bei 
9,9V und mit 2x bei 6,6V also jeweils weit daneben!?

2.a) irgendwie finde ich auch keinen Wert, der bei den C benutzt wird. 
Ist 100nF hier ein guter "Startwert" für Versuche?

3.) Muss ich die V0-V4 Anschlüsse irgendwie benutzen, oder dienen die 
nur dazu um ggf. weitere Schaltungen mit den erzeugten Spannungen zu 
versorgen?

Vielen Dank schon mal an alle die sich mit den Fragen beschäftigen!
Und gerne auch Hinweise, falls ich irgendwas völlig falsch gedacht habe.

von Dieter F. (Gast)


Lesenswert?

Das meinst Du jetzt ernst? Du kaufst irgendein Display und das Forum 
sagt Dir, wie Du es nutzen kannst? Interessant ...

Irgendwelche Leute nennen das "Schwarmintelligenz nutzen" - mir fallen 
dabei andere Begriffe ein :-)

von Ralf M. M. (ramime)


Lesenswert?

Dieter F. schrieb:
> Das meinst Du jetzt ernst? Du kaufst irgendein Display und das Forum
> sagt Dir, wie Du es nutzen kannst? Interessant ...

Ja genau das meine ich, du hast es genau auf den Punkt gebracht. Danke 
dafür!

Ich weiß, dass es hier im Forum Leute gibt, welche tatsächlich Spaß 
daran haben solche Dinge herauszuknobeln, ich gehöre ja auch zu denen 
und wenn man an einem Punkt selbst nicht mehr weiter kommt, dann bittet 
man um Hilfe.

So einfach ist das.

: Bearbeitet durch User
von Christoph K. (christoph1024)


Lesenswert?

Von dem Dislay habe ich mir auch einige gekauft. Mir gefällt es vom 
mechanischen Standpunkt ziemlich gut, und der Preis ist auch gut.

>1.)
>...auch alle Fälle ein Parallelmodus ist oder habe ich irgendwo übersehen,
>dass die Einstellung des Modus auch mit den vorhandenen Pins geht?

Jepp, blöderweise ist der Pin für P/S nicht herausgeführt. Um das Teil 
nativ anzusteuern braucht man also massig Pins.
Die fertigen Libs für Arduino alle leider alle auf den seriellen Modus 
gemünzt.

Die notwendigen Pins sind mir bei weitem zu viele, daher wäre meine Idee 
für die Nutzung entweder einen Attiny als Displaytreiber, also vom 
Konzept in etwa sowas wie das hier:
http://www.ebay.de/itm/371837002396
http://www.ebay.de/itm/371001933236
has dem Haupt-Arduino einiges an RAM und Flash erspart und zudem 
(arbeite meist mit 5V) auch das 3,3V Levelshifterproblem auf den I2C-Bus 
beschränkt.
Das Gute an dem Parallelmodus ist aber, dass man das Display-Ram im 
Gegensatz zum seriellen Modus auslesen kann. Theoretsch könnte man sich 
damit den Buffer im µC-Ram für den DisplaytreiberµC sparen und ein 
kleinerer Tiny könnte ausreichen.

Ich habe mir aber jetzt - auch für ein paar andere GLCD`S mit KS0108 wie 
dem 
https://www.pollin.de/shop/dt/MDY3ODc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_TRULY_MCG401_A3.html 
eine Ladung MCP23017 bestellt http://www.ebay.de/itm/272041592464. Der 
hat auch für das KS0108-Display genug Pins, um auch die Taster 
abzufragen.

Das dürfte der bei weitem angenehmere Weg sein.

Für das KS0108-Display hab ich schon eine Fix und fertige Lib für den 
MCP23017-Betrieb gefunden:
http://www.gammon.com.au/forum/?id=10940
Im Prinzip kann man diese Lib mit der portexpanderfreien Lib für den 
NT7538H kreuzen:
http://www.weigu.lu/microcontroller/arduino_lib_NT7534/index.html

Ich hab angefangen, die Lib für den direkten Betrieb mit Pro Mini 
umzumünzen, aber der Teensy ist schon praktisch, der hat einen 
kompletten Port komplett herausgeführt, was die Bedienung des Bus 
einfach und schnell macht. Für die meisten Arduinos muss man leider 
lower und upper Nibble auf zwei Ports verteilen.

Unangenehm finde ich das 26polige Flexkabel mit 0,5mm Raster. Ich habe 
schon eine Adapterplatine beim Heissluftföhn-Auflöten ruiniert. 0,5mm 
ist schon eine Hausnummer.

von Ralf M. M. (ramime)


Lesenswert?

Christoph K. schrieb:
> Die fertigen Libs für Arduino alle leider alle auf den seriellen Modus
> gemünzt.

Die Software ist kein Problem, ich steure ihn gerne "manuell" an, sprich 
erst mal per Bit-Bang von einem ATmega328p aus. Libs brauche ich nicht.



> Unangenehm finde ich das 26polige Flexkabel mit 0,5mm Raster. Ich habe
> schon eine Adapterplatine beim Heissluftföhn-Auflöten ruiniert. 0,5mm
> ist schon eine Hausnummer.
Das ist an sich nicht problematisch, wenn ich mich gestern nicht ganz so 
dämlich angestellt hätte und meine letzte passende Buchse mechanisch 
zerstört hätte. Jetzt muss ich bis morgen warten.

Aber nochmal, es geht nicht um die Software sondern um die Hardware 
Fragen aus meinem Startbeitrag.

von Werner H. (pic16)


Angehängte Dateien:

Lesenswert?

Ralf M. M. schrieb:
> So nun zu meinen Fragen

Diese Schaltung sollte passen, nimm aber für alle Kondensatoren 1µF, 
steht auch so im Datenblatt. Das Display ist ausschliesslich für 
parallelbetrieb.

Christoph K. schrieb:
> Ich habe
> schon eine Adapterplatine beim Heissluftföhn-Auflöten ruiniert.

Handlöten mit vieeeeel Flux und feiner abgeflachter Spitze, geht 
kinderleicht.

von Ralf M. M. (ramime)


Lesenswert?

Werner H. schrieb:
> Diese Schaltung sollte passen, nimm aber für alle Kondensatoren 1µF,
> steht auch so im Datenblatt. Das Display ist ausschliesslich für
> parallelbetrieb.

Super, vielen vielen Dank, das hilft mir sehr weiter.

Nun denke ich habe ich auch die Funktionsweise verstanden. Im Nachhinein 
und wenn man weiß wonach man suchen muss, dann findet man die Dinge.

Das mit den Spannungen war mir erst unklar, aber logisch, wenn die keine 
Kondensatoren für die Charge-Pump im Display integrieren können, dann 
können sie auch keine zur Spannungsstabilisierung rein machen. Außerdem 
hatte ich dann mit meinen "Sanbum" Displays Glück gehabt, denn da habe 
ich den entsprechenden Kondensator vergessen und es funktioniert 
trotzdem einwandfrei. Werde ihn aber trotzdem gleich mal nachrüsten.

von christoph1024 (Gast)


Lesenswert?

Werner H. schrieb:

> Handlöten mit vieeeeel Flux und feiner abgeflachter Spitze, geht
> kinderleicht.
Ok, ich bin kein Kind mehr, vermutlich kann ich es deshalb nicht mal 
ansatzweise.

Mit 3 Dioptrin Lesebrille, dazu 3-fach Lupe und alles in extra gekauftem 
Flux geflutet, feine Spitze: zwei von 26 Pins, die äußeren geklappt und 
dann direkt eine 4 Pins breite Lötbrücke. Das ist nix mehr für mich, 
nicht mal ansatzweise.
Mit dem Heissluftlötkolben hab ich TSOP und co 16 pins noch ganz gut, 
hinbekommen, aber Deine Methode ist absolut nichts für mich, geschweige 
denn kinderleicht. Kann man irgendwo fertige 0,5mm Flexkabel DIL 
Adapterplatinen kaufen?

von Werner H. (pic16)


Lesenswert?

christoph1024 schrieb:
> Mit 3 Dioptrin

Kann ich mithalten;-) Ich nehme keine Lupe aber viel (blendfrei) Licht. 
Hinderlich wären zittrige Hände. Ich nehme kein Pastenlot und auch nicht 
bleifrei.
Leiterbahnen dünn verzinnen, Buchse drauf und an ein, zwei Anschlüssen 
fixieren. Gut Flux drauf und mit abgeflachter Spitze und gut Wärme ohne 
zusätzlich Zinn gleichmässig über die Pins streichen. Etwas Übung ist 
angebracht zb. alte Platinen aus CD Laufwerken. Buchsen mit Heißluft 
entlöten und händisch wieder drauf.

von W.S. (Gast)


Lesenswert?

Christoph K. schrieb:
> Unangenehm finde ich das 26polige Flexkabel mit 0,5mm Raster. Ich habe
> schon eine Adapterplatine beim Heissluftföhn-Auflöten ruiniert. 0,5mm
> ist schon eine Hausnummer.

Wieso das?
Hast du etwa versucht, das Folienkabel anzulöten?

Also, eine Buchse für ein Folienkabel kann man genauso leicht anlöten 
wie einen normalen IC im 0.5mm Raster: auf jeder Seite 1 Pad verzinnen, 
Buchse drauf, erstmal 1 Pin anlöten, Sitz kontrollieren, ggf. 
korrigieren. Dann mit genug Kolophonium alles anlöten, egal ob da was 
zwischen die Kontakte läuft. Dann mit ner dünnen LIFY (feindrähtige 
Litze), getunkt in Kolo, dranhalten, Litze mit trockenem Kolben erhitzen 
und schon saugt sie das überflüssige Zinn ab. Mit 
Zahnbürste+Spiritus+Papiertaschentuch säubern. Fertig.

W.S.

von Ralf M. M. (ramime)


Angehängte Dateien:

Lesenswert?

W.S. schrieb:
> Mit
> Zahnbürste+Spiritus+Papiertaschentuch säubern. Fertig.

und so wie oben sieht es dann aus (vor der Behandlung mit der 
Zahnbürste)

christoph1024 schrieb:
> Kann man irgendwo fertige 0,5mm Flexkabel DIL
> Adapterplatinen kaufen?

Du meinst sowas
http://www.ebay.de/itm/391447802315

Suche nach "FFC" oder "FPC" und zusätzlich "PCB Adapter" bei eBay

Ich werde nun morgen endlich mit meinen Tests beginnen können

von Ralf M. M. (ramime)


Angehängte Dateien:

Lesenswert?

Endlich habe ich nun Zeit gefunden in den letzten Tagen und konnte das 
Display nun zum laufen bringen.

Vielen Dank nochmals für die Hilfe

P.S. der Parallelmodus befindet sich in der 8080 Betriebsart

: Bearbeitet durch User
von Patrick S. (schnibbelwind)


Angehängte Dateien:

Lesenswert?

Moin,

ich habe ein Probelem.

Vor Zeiten habe ich von ramime etwas Code bekommen. Den habe ich auf 
einen STM32F103 protiert und soweit auch zum laufen bekommen.

Leider verstehe ich nicht, woher die schwarzen Striche kommen und er die 
Darstellung streckt (uint8_t font [96] [5]).

Vielleicht sieht jemand mein Denkfehler. Ich mache vermutlich was in der 
MonoGLCD.update() falsch.
1
const uint8_t font [96] [5] {
2
  { 0x00, 0x00, 0x00, 0x00, 0x00 }, // space  (0x20)
3
  { 0x00, 0x00, 0x2F, 0x00, 0x00 }, // !
4
  { 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
5
  { 0x14, 0x7F, 0x14, 0x7F, 0x14 }, // #
6
  { 0x24, 0x2A, 0x7F, 0x2A, 0x12 }, // $
7
  { 0x23, 0x13, 0x08, 0x64, 0x62 }, // %
8
  { 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
9
  { 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
10
  { 0x00, 0x1C, 0x22, 0x41, 0x00 }, // (
11
  { 0x00, 0x41, 0x22, 0x1C, 0x00 }, // (
12
  { 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
13
  { 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
14
  { 0x00, 0x50, 0x30, 0x00, 0x00 }, // ,
15
  { 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
16
  { 0x00, 0x30, 0x30, 0x00, 0x00 }, // .
17
  { 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
18
19
usw....

MAIN:
1
uint8_t g_buf[64*128/8];
2
MonoGLCD GLCD(g_buf);
3
4
int main(void)
5
{
6
  HAL_Init();
7
  SystemClock_Config();
8
  MX_GPIO_Init();
9
  MX_USART2_UART_Init();
10
11
  GLCD.init();
12
//  memcpy(g_buf,logo1,sizeof(logo1));
13
  memcpy(g_buf,font,sizeof(font));
14
  GLCD.update();
15
  HAL_Delay(3000);
16
  while (1)
17
  {
18
19
  }
20
  /* USER CODE END 3 */
21
}

INCLUDE:
1
// defines ------
2
#define DISPLAY_ON         0xAF
3
#define DISPLAY_OFF       0xAE
4
5
#define DISPLAY_START_LINE_SET  0x40   //0x40 to 0x7F  63-Stufen
6
#define PAGE_ADRESS_SET      0xB0   //0xB0 to 0xB8  8-Stufen
7
#define COLUMN_ADRESS_SET    0x00   //0x00 to 0x18  24-Stufen
8
9
#define ADC_SELECT_NORMAL    0xA0
10
#define ADC_SELECT_REVERSE    0xA1
11
12
#define DISPLAY_NORMAL      0xA6
13
#define DISPLAY_REVERSE      0xA7
14
15
#define ENTIRE_DISPLAY_ON    0xA4
16
#define ENTIRE_DISPLAY_OFF    0xA5
17
18
#define LCD_BIAS_1_9      0xA2  //default
19
#define  LCD_BIAS_1_7      0xA3
20
21
#define READ_MODIFY_WRITE    0xE0
22
23
#define END            0xEE
24
#define RESET          0xE2
25
26
#define COMMON_OUTPUT_MODE_SEL  0xC0  //0xC0 to 0xCF  15-Stufen
27
28
#define POWER_CONTROL_SET    0x28  //0x28 to 0x2F  7-Stufen
29
30
#define V0_VOLTAGE_REGULATOR  0x20  //0x20 to 0x27  7-Stufen
31
32
#define ELECTRONIC_VOLUME_MODE  0x81  //
33
34
#define SET_STATIC_INDIC_ON    0xAC  //
35
#define SET_STATIC_INDIC_OFF  0xAD
36
37
MonoGLCD::MonoGLCD() {
38
}
39
40
MonoGLCD::MonoGLCD(uint8_t* graphicBuffer):graphicBuffer(graphicBuffer){
41
  //MonoGLCD::graphicBuffer = graphicBuffer;
42
}
43
44
void MonoGLCD::config(DisplayBusParallel dbp, uint8_t* graphicBuffer) {
45
  MonoGLCD::dbp = dbp;
46
  MonoGLCD::graphicBuffer = graphicBuffer;
47
  MonoGLCD::upsideDownStatus = false;
48
}
49
50
void MonoGLCD::init(void) {
51
52
  MonoGLCD::dbp.init();
53
54
  // Display OFF
55
  MonoGLCD::dbp.writeCommand(DISPLAY_OFF);
56
57
  //  Reset
58
  MonoGLCD::dbp.writeCommand(RESET);
59
  //_delay_us(100);
60
  HAL_Delay(1);
61
  //  Power Control 4x Boost fuer 3.3V
62
  MonoGLCD::dbp.writeCommand(0x2F);
63
  //  Booster
64
  //MonoGLCD::dbp.writeCommand(0xFB);
65
  // Bias Control 1/7
66
  //MonoGLCD::dbp.writeCommand(LCD_BIAS_1_7);
67
  // ADC Select - Normal
68
//-  MonoGLCD::dbp.writeCommand(ADC_SELECT_NORMAL);
69
  // ADC Select - Reverse
70
  //MonoGLCD::dbp.writeCommand(ADC_SELECT_REVERSE);
71
72
  HAL_Delay(10);
73
  // Display ON
74
  MonoGLCD::dbp.writeCommand(DISPLAY_ON);
75
76
}

Original von ramime, etwas auskommentiert.

Eigentlich muss ich hier doch nur die einzelnen Pages und Segmente 
vollschreiben ?!
1
void MonoGLCD::update(void) {
2
  uint16_t i = 0;
3
  uint8_t k = 0, j = 0;
4
//  for(k=0; k<2;k++) {    //ADC
5
//    MonoGLCD::dbp.writeCommand(0xA0+k);
6
    for(j=0; j<8;j++) {    //Pages
7
      MonoGLCD::dbp.writeCommand(0xB0 + j);  //selsct Page
8
      MonoGLCD::dbp.writeCommand(0x10);
9
      if(0==k) {
10
        MonoGLCD::dbp.writeCommand(0x00);
11
      } else {
12
        MonoGLCD::dbp.writeCommand(0x04);
13
      }
14
      for(i=0; i < 128 ;i++) {    //Segment
15
//        if(0==k) {
16
//          if(MonoGLCD::upsideDownStatus) {
17
//            MonoGLCD::dbp.writeData(MonoGLCD::graphicBuffer[j * 128 + (128 - i - 1)]);
18
//          } else {
19
            MonoGLCD::dbp.writeData(MonoGLCD::graphicBuffer[(j * 128) + i]);
20
//          }
21
//        } else {
22
//          if(MonoGLCD::upsideDownStatus) {
23
//            MonoGLCD::dbp.writeData(MonoGLCD::graphicBuffer[j * 128 + i]);
24
//          } else {
25
//            MonoGLCD::dbp.writeData(MonoGLCD::graphicBuffer[j * 128 + (128 - i - 1) ]);
26
//          }
27
//        }
28
      }
29
    }
30
  }
31
//}
1
void DisplayBusParallel::writeCommand(uint8_t command) {
2
  DisplayBusParallel::rsLow();  // select Command/Status Register
3
  //HAL_Delay(1);
4
  DisplayBusParallel::write(command);
5
}
6
7
void DisplayBusParallel::writeData(uint8_t data) {
8
  DisplayBusParallel::rsHigh();  // select Data Register
9
  //HAL_Delay(1);
10
  DisplayBusParallel::write(data);
11
}
1
void DisplayBusParallel::write(uint8_t data) {
2
3
  DisplayBusParallel::csLow(); // When CS1B=“L” and CS2=“H”,then the chip select becomes active
4
  DisplayBusParallel::rwLow(); // Read/write select signal.
5
  DisplayBusParallel::eHigh(); // Operation (data read/write) enable signal.
6
7
  HAL_GPIO_WritePin(D0_GPIO_Port, D0_Pin,GPIO_PinState(0x01&(data>>0)));
8
  HAL_GPIO_WritePin(D1_GPIO_Port, D1_Pin,GPIO_PinState(0x01&(data>>1)));
9
  HAL_GPIO_WritePin(D2_GPIO_Port, D2_Pin,GPIO_PinState(0x01&(data>>2)));
10
  HAL_GPIO_WritePin(D3_GPIO_Port, D3_Pin,GPIO_PinState(0x01&(data>>3)));
11
  HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin,GPIO_PinState(0x01&(data>>4)));
12
  HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin,GPIO_PinState(0x01&(data>>5)));
13
  HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin,GPIO_PinState(0x01&(data>>6)));
14
  HAL_GPIO_WritePin(D7_GPIO_Port, D7_Pin,GPIO_PinState(0x01&(data>>7)));
15
16
  //HAL_Delay(1);
17
  DisplayBusParallel::eLow();  // let the LCD-Read the Data
18
  //HAL_Delay(1);
19
  DisplayBusParallel::eHigh(); // Operation (data read/write) enable signal.
20
  DisplayBusParallel::rwHigh(); // Read/write select signal.
21
  //DisplayBusParallel::csHigh(); // When CS1B=“L” and CS2=“H”,then the chip select becomes active
22
}

: Bearbeitet durch User
von Patrick S. (schnibbelwind)


Angehängte Dateien:

Lesenswert?

Moin, hab den Fehler gefunden. Hatte versehentlich die Daten doppelt 
gelatched.

Anbei mein Code. ;-)
IDE: STM32CubeIDE

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.