Forum: Mikrocontroller und Digitale Elektronik HD44780 - Datenmüll


von Joel B. (Firma: µGFX) (tectu)


Lesenswert?

Nabend,

Ich wende mich heute nach drei Nächten voller Verzweiflung an euch. Nach 
langer Zeit möchte ich mal wieder so ein 16*2 Display verwenden, welche 
ich schon früher zu AVR Zeiten extrem viel benutzt habe.

Das Display hängt mit allen 8-bits am Port eines STM32 Microcontrollers. 
Der Code unten wird entsprechen ausgeführt. Das Display zeigt an:

1
[ ] [ ] [ ] [ ] [ ] [ ] [G] [F] [E] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
2
3
[ ] [_] [G] [F] [E] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]


das '_' ist hierei die Position des Cursers der auch schön blinkt. Das 
lustige ist nun, das bei jedem Reset oder PowerOn das ganze weiter nach 
rechts geschiftet wird und dann irgend wann mal wieder die Zeichenkette 
"GFE" nachrückt.... Ich weiss wirklich nicht was ich falsch mache, doch 
es muss irgend ein ganz dummer Fehler sein.
Die Ports werden anständig als PushPull Outputs deklariert.
Ich habe auch drei verschiedene LCDs getestet, sie zeigen alle die 
selben Symptome.
Die Initialisierungswerte habe ich aus dem Datenblatt - Initialisieren 
tut's sich soweit ja auch.

main.c
1
  tdispInit();
2
  tdispHome();
3
  tdispClear();
4
  tdispDrawChar('A');
5
  tdispDrawChar('B');
6
  tdispDrawChar('C');


highlevel code:
1
bool_t tdispInit(void) {
2
  init();
3
}
4
5
void tdispClear(void) {
6
  write_cmd(0x01);
7
}
8
9
void tdispHome(void) {
10
  write_cmd(0x02);
11
}
12
13
void tdispDrawChar(char c) {
14
  write_data(c);
15
}


driver code:
1
void write_cmd(uint8_t data) {
2
  setpin_rs(FALSE);
3
  setpin_rw(FALSE);
4
5
  write_bus(data);
6
7
  setpin_e(TRUE);
8
  delayMicroseconds(1);
9
  setpin_e(FALSE);
10
  delayMicroseconds(5);
11
}
12
13
void write_data(uint8_t data) {
14
  setpin_rs(TRUE);
15
  setpin_rw(FALSE);
16
17
  write_bus(data);
18
19
  setpin_e(TRUE);
20
  delayMicroseconds(1);
21
  setpin_e(FALSE);
22
  delayMicroseconds(5);
23
}
24
25
void init(void) {
26
  delayMilliseconds(50);
27
28
  write_cmd(0x38);
29
  delayMilliseconds(64);
30
31
  write_cmd(0x0f);  
32
  delaypMicroseconds(50);
33
34
  write_cmd(0x01);
35
  delayMilliseconds(5);
36
37
  write_cmd(0x06);
38
  delayMicroseconds(50);
39
}


lowlevel routinen:
1
/* enable pin */
2
void setpin_e(bool_t state) {
3
  if(state)
4
    SetPin(GPIOE, 2);
5
  else
6
    ClearPin(GPIOE, 2);
7
}
8
9
/* rs pin */
10
void setpin_rs(bool_t state) {
11
  if(state)
12
    SetPin(GPIOE, 0);
13
  else
14
    ClearPin(GPIOE, 0);
15
}
16
17
/* rw pin */
18
void setpin_rw(bool_t state) {
19
  if(state)
20
    SetPin(GPIOE, 1);
21
  else
22
    ClearPin(GPIOE, 1);
23
}
24
25
void write_bus(uint8_t data) {
26
  WritePort(GPIOD, data);
27
}


Könnt ihr mich bitte ins Licht führen? :D


~ Tectu

von Till M. (at832)


Lesenswert?

Hallo,

du hast warscheinlich vergessen das LCD am anfang des Programms zu 
Löschen
(Bildschirminhalt löschen)!!

MFG, Till

von Joel B. (Firma: µGFX) (tectu)


Lesenswert?

Hallo Till und danke für deine Antwort.

Wie du siehst wird tdispClear() aufgerufen welche das Display mittels 
des 0x01 Kommandos löschen soll. Zudem erklärt das nicht warum ich weder 
ABC noch überhapt falsche Buchstaben sehe und der Curser im Wald ist.

von troll (Gast)


Lesenswert?

Testweise mal die delays massif verlängert?

von Till M. (at832)


Lesenswert?

Oh,sorry hab ich übersehn ;)!!
MFG, Till

von Davis (Gast)


Lesenswert?

Könnte da z. B. zwei Datenleitungen vertauscht sein?

A 41

B 42

C 43


G 47

F 46

E 45

von MagIO (Gast)


Lesenswert?

Ich glaube das Display wird im 4 bit Modus betrieben und das mit dem 
shift ist auch relativ klar:

  write_cmd(0x38);

entspricht
FUNCTION SET -> │ 0 │ 0 │ 1 │ DL│ N │ F │ * │ * │
Sets interface data length (DL), number of display line (N) and 
character font(F).                                                  │


  write_cmd(0x06);

entspricht
ENTRY MODE SET -> │ 0 │ 0 │ 0 │ 0 │ 0 │ 1 │I/D│ S │
Sets cursor move direction (I/D), specifies to shift the display(S)
These operations are performed during data read/write.

              │

von Joel B. (Firma: µGFX) (tectu)


Lesenswert?

@MagIO: Laut drei verschiedener Datenblätter ist die 
initialisierungsroutine für ein 16*2 display im 8-bit modus:

00111000
00001111
00000001
00000110

Ich weiss ja nicht, aber bei mir gibt das:

0x38
0x0f
0x01
0x06

von Joel B. (Firma: µGFX) (tectu)


Lesenswert?

@troll: Ich hab mal die timings alle zehnmal grösser gemacht... Selbes 
problem.

von Karl H. (kbuchegg)


Lesenswert?

Ich tipp auch darauf, dass mit deinen Datenleitungen was nicht stimmt.
Klingel die doch mal durch und check die auf Kurzschlüsse zwischen den 
Leitungen.

von Joel B. (Firma: µGFX) (tectu)


Lesenswert?

Meh, also ich hab die Leitungen jetzt alle mal durchgeklingelt und auch 
mal nen toggle draufgejagt und geguckt ob das auf der platine des LCDs 
ankommt. Sieht soweit gut aus :(

Ich glaub ich verdahte das mal von grund auf neu.

von John (Gast)


Lesenswert?

Mr. Anderson schrieb:
> [ ] [_] [G] [F] [E] [ ]

Wenn der Cursor links von deinen drei ausgegebenen Zeichen blink, dann 
schreibt das LCD von rechts nach links.

bit 3 ist anscheinend immer high:
A: 01000001
E: 01000101

B: 01000010
F: 01000110

C: 01000011
G: 01000111

von Joel B. (Firma: µGFX) (tectu)


Lesenswert?

Ich glaubs nicht... diese chinakabel... den sollte man einfach nicht 
trauen. Dank dem Tipp von John hab ich mal das kabel getauscht, nun 
gehts .__.
Es war wohl so das ich beim messen durch Schrägbelastung immer kontakt 
gemacht habe.

Vielen Dank für euere hilfe, Leute!

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.