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
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
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.
<<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.
> 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.
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..
Anbei mal meine 4Bit-Version. Wichtig sind beim Init die beiden 100µs Wartezeiten, im HD44780 Datenblatt fehlt eine ! Peter
> 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.
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
@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
Ich kapier die Frage jetzt nicht so recht, ausserdem ist ziemlich offen, wie dein Code mittlerweile aussieht.
> 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.
@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
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?
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.