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.
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 :-)
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 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.
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.
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.
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.
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?
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.
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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.