PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 4 zeilen LCD-display an der m32



inka
04.11.2013, 14:24
@TrainMen:

ich kann mich ganz matt daran erinnern, dass Du in irgend einem thema (ich glaube die solar-ladestation) erwähnt hast, dass Du ein 4zeilen-display verwendest. War es zufällig dieses hier (http://www.amazon.de/gp/product/B00ALNHTVY/ref=oh_details_o03_s00_i01?ie=UTF8&psc=1)? Kompatibel zu HD44780?

gab es probleme mit dem anschluss?

was ich habe, ist folgendes:

1 (GND)
2 (+5V)
3 (Kontrast)
4 (RS)
5 (R/W)
6 (E)
11 (Daten 4)
12 (Daten 5)
13 (Daten 6)
14 (Daten 7)
15 (LED +5V)
16 (LED GND)

musstest Du die lib anpassen?

wäre schön, wenn Du ein paar infos hättest :-)

TrainMen
05.11.2013, 11:36
Hi inka,
ich habe mein 4x16 Display aus einem Bedienpult ausgebaut, was das mal war weiß ich nicht. Jedenfalls ist das Display HD44780 kompatibel. Probleme mit dem Anschluss gab es keine. Wenn Du soweit bist wähle das Kabel nicht zu kurz aus, wähle es so das es auf beiden Seite passt und in verschiedene Ebenen. Denke auch an ein Zugentlastung auf der Display Seite.
Die RP6ControlLib.h und die RP6ControlLib.c muß natürlich auf 4 Zeilen angepasst werden.

inka
18.11.2013, 14:27
hi,

sollte der harwareseitiger anschluss der kontakte (1-14) 1:1 durchgezogen werden, also so?






HD-44780

RP-DSP88

M32




2 zeilen

4 zeilen

LCD connector












1

GND)

VSS

GND


2

+5V

VDD (5V)

VDD


3

Kontrast

Vo

Vo


4

RS

RS

RS


5

R/W

RW

RW


6

E

E

EN


7




DB0

D0


8




DB1

D1


9




DB2

D2


10




DB3

D3


11

Daten 4

DB4

D4


12

Daten 5

DB5

D5


13

Daten 6

DB6

D6


14

Daten 7

DB7

D7


15

LED +5V

LED A (5V)

-


16

LED GND

LED K

-

inka
19.11.2013, 07:17
hallo allerseits,

in einem anderen thread wurde eigeninitiative verlangt. sicher zurecht, die muss man haben. Meine eigeninitiative bewegt sich im bereich try & error, wie hier bei dem display auch :-( ....

ich habe das 4-zeilen display (es ist lt. datenblatt kompatibel zu HD44780) wie im vorhergehendem post angeschlossen, die LCD bleibt dunkel (das 2-zeilen funktioniert aber nach wie vor) ...

Wahrscheinlich habe ich mir das wieder viel zu einfach vorgestellt. Nach der tabelle im letzten post hätte eigentlich die verdrahtung des 4-zeilen displays mit dem M32 displaystecker genauso sein müssen, wie die des 2-zeilen...


das es nicht funktioniert, hängt es zusammen:


- mit der noch nicht angepassten lib, oder sollten hier zumindest die ersten beiden zeilen gehen?

- mit den nicht angeschlossenen kontakten 15/16 (die aber beim 2-zeilen display auch nicht angeschlossen sind)?

- mit irgendwelchen vertauschten / verwechselten / zuviel angeschlossenen kontakten?


ich bin einfach ratlos...

Dirk
19.11.2013, 08:03
Hi inka,

Anschluß müßte so ok sein.
Die fehlenden LED-Anschlüsse sind nicht das Problem.

Die RP6ControlLib muss natürlich auf 4x20 geändert werden (Tipps z.B. hier (https://www.roboternetz.de/community/threads/40957-LCD-am-RP6-Control-M32)!), wobei sie aber eigentlich auf deinem LCD auch so etwas zeigen könnte.

Ausnahme: Wenn dein 4x20-LCD eine andere Initialisierung braucht, müßte man die Funktion initLCD() anpassen. Das geht nur mit Datenblatt.

In dem o.g. Thread (https://www.roboternetz.de/community/threads/40957-LCD-am-RP6-Control-M32) ist eine an den KS0073 angepaßte Init-Funktion enthalten. Probier die evtl. mal aus.
Sonst hilft nur: Datenblatt vom KS0066 lesen und passende Init-Funktion schreiben. Mir hilft auch immer diese Seite (http://ww1.myke.com/lcd.htm) mit vielen Infos rund um LCDs.

inka
19.11.2013, 12:58
@Dirk,

ich habe noch einmal überlegt:

der RP weiss doch beim einschalten nichts von der controllib.c oder h? trotzdem wird das 2-zeilen display beleuchtet und der RP meldet sich...

Und das 4-zeilen display blebibt dunkel - deutet soetwas nicht eher auf ein hardwareproblem?

Dirk
19.11.2013, 18:02
Hi inka,

das RP6-LCD wird beleuchtet, weil ja die Hintergrundbeleuchtung funktioniert.

Bei deinem 4x20-LCD hast du ja LED +5V/GND nicht angeschlossen, also bleibt es dunkel. Daraus kann man noch kein "Hardwareproblem" schließen.
Du kannst ja LED +5V/GND anschließen, dann müßte die Hintergrundbeleuchtung funktionieren.

Vielleicht entdeckst du dann ja auch, dass sich doch etwas auf dem 4x20-LCD tut. Wenn ja: Beschreib das mal!
Übrigens: Es kann sein, dass du das Kontrast-Poti auf der M32 ganz an einen Anschlag (Richtung GND) drehen must, um überhaupt was zu sehen.

inka
20.11.2013, 14:30
Hi Dirk,

also hardwaremässig geht es jetzt:
- die hintergrundbeleuchtung funktioniert
- nach dem hinweis auf den poti (habe den noch nie verwendet / verwenden müssen) sind auch die ausgaben auf den ersten beiden zeilen sichtbar.

ich habe hier noch einmal die änderungen in der controLib.c + h, die den treiberchip KS0073 betreffen) zusammengefasst:
(Ich würde ganz gerne die änderungen für den KS0066 hier an einem platz festhalten wollen, sollten fehler drinn sein, bitte um einen hinweis)

die initalisierung


von:
void initLCD(void)
{
//delayCycles(34000); No need for Power ON delay as usually the
// Bootloader should have been executed before...
setLCDD(0b0011);
delayCycles(18000);
setLCDD(0b0011);
delayCycles(5500);
setLCDD(0b0011);
delayCycles(5500);
setLCDD(0b0010);
delayCycles(5500);
writeLCDCommand(0b00101000);
delayCycles(5500);
writeLCDCommand(0b00001000);
delayCycles(5500);
writeLCDCommand(0b00000001);
delayCycles(5500);
writeLCDCommand(0b00000010);
delayCycles(5500);
writeLCDCommand(0b00001100);
delayCycles(5500);
}

in:
void initLCD(void)
{
//delayCycles(34000); No need for Power ON delay as usually the
// Bootloader should have been executed before...
setLCDD(0b0011);
delayCycles(18000);
setLCDD(0b0011);
delayCycles(5500);
setLCDD(0b0011);
delayCycles(5500);
setLCDD(0b0010);
delayCycles(5500);
writeLCDCommand(0b00101100); //0=0: reverse off, 1=0: scroll off, 2=1: RE=1, 3=0: Lines = 1, 4=1: Set 4-Bit Mode,
delayCycles(5500);
writeLCDCommand(0b00001001); //4 Lines
delayCycles(5500);
writeLCDCommand(0b00101000); //RE wieder auf 0
delayCycles(5500);
writeLCDCommand(0b00001000); //0=0: Blink off, 1=0: cursor off, 2=0: display off
delayCycles(5500);
writeLCDCommand(0b00000001); //Clear display
delayCycles(5500);
writeLCDCommand(0b00000010); //Home Pos
delayCycles(5500);
writeLCDCommand(0b00001100); //Display on
delayCycles(5500);
}



showScreenLCD_P:


von:
void _showScreenLCD_P(const char *line1, const char *line2)
{
clearLCD();
writeNStringLCD_P(line1);
setCursorPosLCD(1, 0);
writeNStringLCD_P(line2);
}

in:
void _showScreenLCD_P(const char *line1, const char *line2, const char *line3, const char *line4)
{
clearLCD();
writeNStringLCD_P(line1);
setCursorPosLCD(1, 0);
writeNStringLCD_P(line2);
setCursorPosLCD(2, 0);
writeNStringLCD_P(line3);
setCursorPosLCD(3, 0);
writeNStringLCD_P(line4);
}


setCursorPosLCD:


von:
void setCursorPosLCD(uint8_t line, uint8_t pos)
{
pos |= 128;
if(line==1) pos += 0x40;
writeLCDCommand(pos);
}

in:
void setCursorPosLCD(uint8_t line, uint8_t pos)
{
pos |= 128;
if(line==1) pos += 0x40;
else if(line==2) pos += 0x14;
else if(line==3) pos += 0x54;
writeLCDCommand(pos);
}

showScreenLCD_P:


von:
//void _showScreenLCD_P(const char *line1, const char *line2);
in:
void _showScreenLCD_P(const char *line1, const char *line2, const char *line3, const char *line4);



define showScreenLCD:


von:
//#define showScreenLCD(__line1,__line2); ({_showScreenLCD_P((PSTR(__line1)),(PSTR(__line2)) );})
in:
#define showScreenLCD(__line1,__line2,__line3,__line4); ({_showScreenLCD_P((PSTR(__line1)),(PSTR(__line2)) ,(PSTR(__line3)),(PSTR(__line4)));})



char lcd_tmp_buffer:


von:
char lcd_tmp_buffer[17];
in:
char lcd_tmp_buffer[21];

hier die char buffer[17]; in char buffer[21];

void writeIntegerLengthLCD(int16_t number, uint8_t base, uint8_t length)
{
char buffer[21];
itoa(number, &buffer[0], base);
int8_t cnt = length - strlen(buffer);
if(cnt > 0) {
for(; cnt > 0; cnt--, writeCharLCD('0'));
writeStringLCD(&buffer[0]);
}
else
writeStringLengthLCD(&buffer[0],length,-cnt);
}



dieses testprogrämmchen:


#include "RP6ControlLib.h"


int main(void)
{


initRP6Control();

initLCD();

while(true)
{

clearLCD();
//showScreenLCD(" RP6Control M32", " ladestation_1", "test zeile 3", "test zeile 4");
showScreenLCD(" test_zeile_1", " test_zeile_2", "test_zeile_3", "test_zeile_4");

mSleep(1500);
clearLCD();
mSleep(1500);


}


return 0;
}


bringt diese ausgabe:
26769

beim anklicken des "http://ww1.myke.com/lcd.htm" kommt nur "http://ww2.qfind.net/?_inv", also gibt es die seite nicht (mehr?)?

ich denke die initialisierung stimmt so nicht, ich glaube, ich habe die anderen änderungen korrekt übertragen, jetzt werde ich also das datenblatt des KS0066 wälzen...

Dirk
20.11.2013, 16:42
Hi inka,

Glückwunsch, das sieht schon sehr gut aus.

Die Initialisierung stimmt auch.

Anpassen must du nur noch die Funktion setCursorPosLCD:
Probier mal:

pos |= 128;
if(line==1) pos += 0x40;
else if(line==2) pos += 0x14;
else if(line==3) pos += 0x54;

... und achte darauf, dass jede Zeile richtig ausgegeben wird.
Nimm dazu einen Text, der für alle 4 Zeilen unterschiedlich ist und alle 20 Zeichen füllt.

inka
21.11.2013, 08:09
hi Dirk,

danke, es funktioniert!

habe den code geändert (auch in der zusammenfassung)...
26776