HD44780 - Datenmüll

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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.