mikrocontroller.net

Forum: Compiler & IDEs LCD - 4Bit - Textausgabe


Autor: gaston (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Walter (Gast)
Datum:

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

Autor: gaston (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gaston (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gaston (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Peter Dannegger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei mal meine 4Bit-Version.

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


Peter

Autor: A.K. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gaston (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Volkmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin Munske (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.