HD44780 - Datenmüll

OP (Firma: µGFX) #2992704
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
OP (Firma: µGFX) #2992768
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.
Gast #2992810
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.

              │
OP (Firma: µGFX) #2992915
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren