Forum: Compiler & IDEs LCD - 4Bit - Textausgabe


von gaston (Gast)


Angehängte Dateien:

Lesenswert?

Guten aben!
..habe mich inzwischen ein wenig in C eingearbeitet (danke nochmal für
eure Starthilfe!).
Nun jedoch noch zwei Fragen zum angehängten Programm:
1.Wieso krieg ich nur Müll aufs LCD rausgeschrieben wenn ich mein
stk500 einschalte? Nach dem ersten mal reseten werden die Texte richtig
ausgegeben.
2.Warum läss mir WinAVR keine Code-verschachtelung bei der
Variablenübergabe wie z.B. die Folgende zu?

while (*string != '\0')
  {
-> lcd_send((*string >> 4)   | RS_MASK);
-> lcd_send((*string & 0x0f) | RS_MASK);
   string++;
   delay_ms(1);
  }

weitere (formelle) Verbesserungshinweise sind natürlich wilkommen.
danke für eure Hilfe

von Walter (Gast)


Lesenswert?

was geht denn da nicht?
Wie sind denn lcd_send und string deklariert?

von gaston (Gast)


Lesenswert?

hallo
wenn der controller&lcd frisch eingeschalten werden (0V->5V) bringt das
display nur wirre zeichen aber nicht den text aus den arrays. wenn ich
dann einmal resete funktionierts. bei öfterem reseten kann es aber
passieren, dass wieder irgendwelcher text/hieroglyphen (ASCII zeichen
und vom lcd frei erfundene punktmuster:-)) ausgegeben werden.

2. war nur ein beispiel, aber lcd_send erwartet einen uint8_t wert und
*string zeigt auf die adresse eines arrays (wo ein charzeichen steht).

merci
mfg

von Jörg Wunsch (Gast)


Lesenswert?

Dein erstes Problem klingt nach einem LCD-Initialisierungs-Problem.
Die Dinger brauchen in der Initialisierung ein bestimmtes Timing,
selbst wenn man das READY-Signal pollen kann.  Habe ich selbst auch
schon verhunzt.  HD44780-Clones verschiedener Hersteller reagieren
verschieden empfindsam hier.

Für dein zweites Problem habe ich einen kompletten `parse error'.
Ich
verstehe weder wirklich, was dein Ziel ist noch dein Problem dabei.

von gaston (Gast)


Lesenswert?

<<Die Dinger brauchen in der Initialisierung ein bestimmtes Timing>>

ja ich hab das Timingdiagramm bei der Wahl der Zeiten beachtet. Aber es
scheint, dass die delays beim ersten mal booten nicht richtig laufen.
wenn dem so ist, würde dies das Verhalten evtl erklären. gibts da ne
erklärung?
andere Frage: kann man den reset auch per software auslösen? oder diese
startschwierigkeiten sonst irgendwie umgehen?

<<Für dein zweites Problem habe ich einen kompletten `parse error'>>

anstatt..:
...
 zeichen >>= 4;
 zeichen &= 0x0f;
 zeichen |= RS_MASK;
 lcd_send(zeichen);
...
wollte ich den Wert so übergeben:
...
 lcd_send(((zeichen >> 4) & 0x0f) | RS_MASK);
...
damit sich der Wert von 'zeichen' in meinem main nicht verändert.
aber das schluckt der compiler nicht.

von A.K. (Gast)


Lesenswert?

> ja ich hab das Timingdiagramm bei der Wahl der Zeiten beachtet.

Sorry, aber da ist nicht viel Stimmiges drin. Nicht die Zeiten, nicht
die Inhalte.

- E sollte für min 0,5 Mikrosekunden aktiv sein. Nicht Millisekunden.

- In der Anfangsphase ist das LCD nicht auf 4-Bit-Betrieb eingestellt.
lcd_command kann zu diesem Zeitpunkt nicht verwendet werden.

- Die Initialisierung verlang nach dem 1. Byte eine Wartezeit von
4,1msec. Ist: 2msec.

- Die Steuerbytes in der Initialisierung haben keinerlei Ähnlichkeit
mit der vorgeschriebenen Sequenz.

von gaston (Gast)


Lesenswert?

jetzt versteh ich gar nichts mehr

@A.K.
-soll ich für das Initialisieren alle 8 datenleitungen anhängen oder
wie machst du das sonst?
-das 2msec delay habe ich inzwischen auf korrigiert, hat leider nichts
gebracht. Aber zu grosse Zeiten sollten laut meinem datenblatt keine
rolle spielen (hab sie trotzdem mal, erfolglos, angepasst).
-welches datenblatt verwendest du? die steuerbits sollten eigentlich
schon stimmen - die initialisierung funktioniert nach dem reset..

von Peter Dannegger (Gast)


Angehängte Dateien:

Lesenswert?

Anbei mal meine 4Bit-Version.

Wichtig sind beim Init die beiden 100µs Wartezeiten, im HD44780
Datenblatt fehlt eine !


Peter

von A.K. (Gast)


Angehängte Dateien:

Lesenswert?

> soll ich für das Initialisieren alle 8 datenleitungen anhängen

Ins Datasheet schauen lohnt sich. In der Initialisierungsphase
interessiert der HD44780 sich nur für D4..D7. Der E-Puls vom zweiten
Nibble hingegen stört.

> welches datenblatt verwendest du?

Diverse, darunter naheliegenderweise das vom HD44780. Anbei ein
Ausschnitt der interessanten Seite (4bit Initialisierung). Daraus geht
beispielsweise hervor, dass erst einmal ein paar 8bit Inits rausgehen,
bevor auf 4bit geschaltet wird. Und auch das muss man zweimal machen,
erst einmal 8bittig für 4bit, danach nochmal 4bittig für die unteren 4
Bits.

von Walter (Gast)


Lesenswert?

zu deinem 2.Problem:

2.Warum läss mir WinAVR keine Code-verschachtelung bei der
Variablenübergabe wie z.B. die Folgende zu?

while (*string != '\0')
  {
-> lcd_send((*string >> 4)   | RS_MASK);
-> lcd_send((*string & 0x0f) | RS_MASK);
}

Das lässt sich mit winAVR problemlos compilieren (ohne die Pfeile am
Anfang natürlich)

Grüsse
Walter

von gaston (Gast)


Lesenswert?

@Walter - hab ichs mir doch gedacht.. bei mir funzts nicht. gibt es im
compiler diesbezüglich einstellungen die ich übersehen habe?

@A.K & peter - Danke für eure Hilfe. Ich hatte tatsächlich datenblätter
von einem lcd bei dem der erste teil der initialisierung nicht dabei ist
(steht aber trotzdem hd44780 kompatibel :-/). Das lcd läuft jetzt etwas
zuverlässiger. d.h. jetzt kann ich mich drauf verlassen dass es nach
dem ersten reset das richtige ausspuckt. anscheinend stimmt mit meinen
delays vor dem ersten reset wirklich etwas nicht. idee?

gaston

von A.K. (Gast)


Lesenswert?

Ich kapier die Frage jetzt nicht so recht, ausserdem ist ziemlich offen,
wie dein Code mittlerweile aussieht.

von Jörg Wunsch (Gast)


Lesenswert?

> bei mir funzts nicht

Dann zitiere hier bitte Fehlermeldungen (plus die exakt zugehörige
Codezeile, so wie sie jetzt gerade aussieht).  Kristallkugeln sind
knapp dieser Tage.

Selbstverständlich schluckt ein C-Compiler einen Ausdruck in einem
Funktionsaufruf, folglich auch der GCC.

,,WinAVR'' ist kein Compiler.  Es ist ein Softwarepaket, das diverse
Einzelsoftware zusammenstellt.

von Volkmar (Gast)


Lesenswert?

@gaston:

Wenn es nach dem ersten Einschalten nicht funktioniert, dann tippe ich
mal darauf, daß der LCD-Controller länger zum Initialisieren benötigt,
der AVR aber schon seine ersten Befehle schickt. Dies kann mit der
Spannungsversorgung und Reset-Behandlung zusammenhängen. Probier doch
mal deutlich längere Wartezeiten vor Deiner LCD-Initialisierung. Oder
ein anderer Test: Was passiert, wenn Du beim Einschalten die
Reset-Taste gedrückt hälst und erst später losläßt?

Volkmar

von Benjamin Munske (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe auch mal versucht mein Display anzusteuern, aber selbst die
initialisierung läuft schon schief, da das Display nach wie vor einen
Balken in der oberen Zeile anzeigt. Irgendwie habe ich das Gefühlt,
dass ich da noch etwas vergessen habe - könnte sich das bitte jemand
anschauen und mir einen Tipp geben?

von Peter Dannegger (Gast)


Lesenswert?

@Benjamin


Was sollen denn diese mysteriösen PORTC-Maskierungen ???

Schau Dir mal meinen Code an.
Da sind Funktionen für Delay, Nibble-Ausgabe und Byteausgabe.

Da kann man dann ordentliche Wert übergeben und braucht nicht wild
umher zu maskieren, das kein Mensch kapiert, was da passiert.


Peter

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.