Hallo, als Einsteiger in AVR GCC habe ich nach ein paar Tests mit Codebeispielen ein Problem bekommen, für dass ich keine Erklärung habe. Aus dem Buch, AVR-Mikrocontroller in C prorammieren, habe ich u.a. eine Routine von der CD übernommen, um eine Uhrzeit auf dem LCD-Display auszugeben. Dazu verwende ich ein Board von MyAVR light V1.03 mit ATMega8 und dem Displaymodul MyAVR LCD V2.4.. Wenn ich nun in der zweiten LCD-Zeile einen Text ausgebe, so funktioniert das auch. Doch nach einem Hardware-Reset per Taster wird dann nur noch die Zeile1 ausgegeben. Möglicherweise wird das Display ja nicht mit resetet, doch so wirklich habe dafür keine Erklärung? Erst nach Power off/on ist die zweite Zeile wieder da. Kann mir ein Erfahrener vielleicht einen Tip geben, wo ich das Problem suchen kann? Das Buch finde ich für einen Einsteiger wie mich übrigens sehr hilfreich, da es die Beispiele sehr gut dokumentiert. Es enthält auch interessante Schaltungen, die man für eigene Projekte leicht abändern kann. Über einen Tip von Euch, wo ich suchen muss wäre ich wirklich dankbar. Gruß, Andreas
Wenn Reset und Power Off - On verschiedenes Verhalten erzeugen, dann kann es sein, das das Verhalten nicht nur von der Startadresse sondern auch von dem Speicherinhalt abhängt. Denn das ist nämlich der einzige relevante Unterschied: Das beim Reset nicht das RAM gelöscht wird, beim Power Off-On aber wohl. Der Quellcode könnte helfen Näheres darüber zu sagen.
Seien Display-Initialisierung kann auch schuld sein, wenn das Display beim Warmstart falsch re-initialisiert wird (Stichwort Homing-Sequenz ;) ), aber ohne Schaltplan und Software stochern wir hier auch nur im Nebel.
@ Dennis S. >Seien Display-Initialisierung kann auch schuld sein, wenn das Display >beim Warmstart falsch re-initialisiert wird (Stichwort Homing-Sequenz ;) Willst Du damit sagen, das zwei identische Initialisierungsequenzen für das LCD (natürlich evtl. abhängig vom Typ) nicht jedesmal zu dem gleichen Zustand des LCD führen? Denn wenn Du sagst, "kann auch schuld sein", dann heisst das doch, das der Unterschied nicht in dem evtl. unterschiedlichen Ablauf von Reset und Power-Cycle liegt sondern diese gleich sein können, also auch auch die Initialisierungssequenz des LCD und diese trotzdem unterschiedliche Endzustände des LCD bewirken. Ich frag' nur um der Erkenntnis willen. Soll keine Kritik sein oder so.
Guru schrieb: > @ Dennis S. > >>Seien Display-Initialisierung kann auch schuld sein, wenn das Display >>beim Warmstart falsch re-initialisiert wird (Stichwort Homing-Sequenz ;) > > Willst Du damit sagen, das zwei identische Initialisierungsequenzen für > das LCD (natürlich evtl. abhängig vom Typ) nicht jedesmal zu dem > gleichen Zustand des LCD führen? Genau das meine ich: Ich dachte, dass das Display bestimmt HD44780-kompatibel ist und er auf den 4-Bit-Modus wechselt. Wenn er dann nach dem Prozessor-Reset nochmal Kommandos reinpumpt, denkt er vielleicht, dass das Display im 8-Bit-Modus ist, wodurch je 4 Bit des Kommandos duch das nächste Kommando verstümmelt werden. Die Initialisierungsroutine, die ich hier in einem Datenblatt gefunden habe, bezieht sich auch nur auf das Einschalten, nicht auf eine Reinitialisierung. (Allgemein: Die Initialisierung sollte also eine Homing-Sequenz enthalten, die das Display aus jedem beliebigen Zustand in einen einzigen Zustand überführt, von dem aus man dann in den Zielzustand wechselt. Die Automatentheorie lässt grüßen.)
@ Dennis S. >Ich dachte, dass das Display bestimmt HD44780-kompatibel ist und er auf >den 4-Bit-Modus wechselt. Wenn er dann nach dem Prozessor-Reset nochmal >Kommandos reinpumpt, denkt er vielleicht, dass das Display im >8-Bit-Modus ist, wodurch je 4 Bit des Kommandos duch das nächste >Kommando verstümmelt werden. Nun gut. Als Vermutung ist das sicherlich zulässig aber doch nur unter der zusätzlichen Voraussetzung, das die Initialisierungssequenz aus dem von mir oben angedeuteten Grund unterschiedlich abläuft. Warum sollte andernfalls beim zweitenmal die Umstellung auf 4 Bit Interface unterbleiben? Ich dachte eher daran, das Du von LCD gehört hast, die nach zwei identischen Initialisierungssequenzen, einmal nach dem Reset und einmal danach, irgendwann während des Laufs, ohne Reset oder Power-Cycle, in unterschiedliche Zustände geraten. Na gut. Jedenfalls lese ich aus deiner Antwort heraus das Dir sowas nicht bekannt ist. Wenn das so korrekt ist: >Die Initialisierungsroutine, die ich hier in einem Datenblatt gefunden >habe, bezieht sich auch nur auf das Einschalten, nicht auf eine >Reinitialisierung. dann könnte man jedenfalls gleichfalls annehmen, dass Initialisierung und Reinitialisierung bei dem fraglichen Display gleich sind. Die nochmalige initialisierung eines schon initialisierten Displays also zum selben Zustand führt. Träfe das auch auf das hier vom TO verwendete Display zu, so kann dann der RAM Inhalt tatsächlich dafür sorgen, das die Init-Sequenz unterschiedlich abläuft.
Guru schrieb: > Nun gut. Als Vermutung ist das sicherlich zulässig aber doch nur unter > der zusätzlichen Voraussetzung, das die Initialisierungssequenz aus dem > von mir oben angedeuteten Grund unterschiedlich abläuft. Warum sollte > andernfalls beim zweitenmal die Umstellung auf 4 Bit Interface > unterbleiben? Hatte ich vergessen zu schreiben: Genau, ich gehe – wie du meintest – davon aus, dass die gleiche Sequenz zu verschiedenen Zuständen führt. > Ich dachte eher daran, das Du von LCD gehört hast, die nach zwei > identischen Initialisierungssequenzen, einmal nach dem Reset und einmal > danach, irgendwann während des Laufs, ohne Reset oder Power-Cycle, in > unterschiedliche Zustände geraten. > Na gut. Jedenfalls lese ich aus deiner Antwort heraus das Dir sowas > nicht bekannt ist. Ist mir bisher nicht vorgekommen, weil ich diese HD44780 bisher nur im 8-Bit-Modus betrieb. > Wenn das so korrekt ist: >>Die Initialisierungsroutine, die ich hier in einem Datenblatt gefunden >>habe, bezieht sich auch nur auf das Einschalten, nicht auf eine >>Reinitialisierung. > dann könnte man jedenfalls gleichfalls annehmen, dass Initialisierung > und Reinitialisierung bei dem fraglichen Display gleich sind. Die > nochmalige initialisierung eines schon initialisierten Displays also zum > selben Zustand führt. Würde ich vorsichtig sein, aber du hast Recht: Die angegebene Initialisierungssequenz ist genau so geschrieben, dass sie das Display auf jeden Fall erst in den 8-Bit-Modus bringt, um dann evtl. in den 4-Bit-Modus umzuschalten. Hab's mir gerade nochmal im wachen Zustand angeguckt. ;) > Träfe das auch auf das hier vom TO verwendete Display zu, so kann dann > der RAM Inhalt tatsächlich dafür sorgen, das die Init-Sequenz > unterschiedlich abläuft. Ja, das mochte ich auch nicht ausschließen, passiert auch häufig.
@ Dennis S. >> Nun gut. Als Vermutung ist das sicherlich zulässig aber doch nur unter >> der zusätzlichen Voraussetzung, das die Initialisierungssequenz aus dem >> von mir oben angedeuteten Grund unterschiedlich abläuft. Warum sollte >> andernfalls beim zweitenmal die Umstellung auf 4 Bit Interface >> unterbleiben? >Hatte ich vergessen zu schreiben: Genau, ich gehe – wie du meintest – >davon aus, dass die gleiche Sequenz zu verschiedenen Zuständen führt. Hm. Ist Dir bewusst, das sich die beiden Absätze in dem Punkt widersprechen. Der obere (von mir) setzt voraus, das die Sequenzen unterschiedlich sind, im zweiten aber schreibst Du, Du gehst Du von gleichen Sequenzen aus. Dein zweiter Beitrag Beitrag "Re: Reset ist nicht Power on?" wiederum schildert zwei verschiedene Sequenzen. Irgendwie unlogisch. Naja. Lassen wir es. Ist nicht wirklich wichtig, denke ich.
Guru schrieb: > Hm. Ist Dir bewusst, das sich die beiden Absätze in dem Punkt > widersprechen. Der obere (von mir) setzt voraus, das die Sequenzen > unterschiedlich sind, im zweiten aber schreibst Du, Du gehst Du von > gleichen Sequenzen aus. > Dein zweiter Beitrag Beitrag "Re: Reset ist nicht Power on?" > wiederum schildert zwei verschiedene Sequenzen. Ja, hab das anders interpretiert. Meine Idee war, dass die gleiche gesendete Sequenz verschieden vom Display interpretiert wird. Passiert aber nur, wenn man sich nicht an die angegebene Initialisierungssequenz hält. Also Andreas, wir warten auf Details.
Hi > Meine Idee war, dass die gleiche >gesendete Sequenz verschieden vom Display interpretiert wird. Passiert >aber nur, wenn man sich nicht an die angegebene Initialisierungssequenz >hält. Geht doch ganz einfach: Lass mal das obligate Warten (>=15ms beim HD44780) vor der Initialisierung weg. Nach einem Reset bei eingeschalteter Betriebsspannung funktioniert es. Bei einem Power-Up nicht. MfG Spess
Tja. Das ist auch eine Möglichkeit. Na, mal sehen was der TO schreibt.
Hallo, danke für die rege Resonanz. Leider bin ich erst heute wieder an den Computer gekommen. Ich habe Euch mal die Sourcen rangehängt, damit Ihr sehen könnt, welches Problem ich da entdeckt habe. Betroffen ist der Breich: lcd_init(); lcd_send(COMMAND, LCD_CLEAR); lcd_set_cursor (1, 4);lcd_write ("10:00:00"); lcd_set_cursor (2, 4);lcd_write ("Hallo"); Das Hallo ist nach einem Reset nicht mehr im Display. Wohl aber nach einem Power On des Moduls. Wenn Ihr auch den hex-file benötigt, schreibt mir das bitte. Viele Grüße, Andreas
seufz Wir sind so gute Hellseher. Es ist lcd_init(void). Wahrscheinlich hast du ein Datenblatt gelesen, in dem keine Initialisierungsroutine angegeben wurde, die (wie vorher beschrieben) wirklich in jedem Fall das gewünschte Ergebnis erzielt (habe eben nech HD44780 gesucht und ein Datenblatt bei Sparkfun gefunden, wo auf Anhieb keine ordentliche Initialiserungsbefehlsfolge ersichtlich war, daher der Link zu einem anderen Datenblatt). Implementiere bitte die Initialisierungsroutine aus https://www-vs.informatik.uni-ulm.de/wiki/pub/Main/GpsLogger09/Displaytech_LCD.pdf bevor du auf auf den 4-Bit-Modus schaltest (ja, wirklich das gleiche Wort dreimal senden, danach auf 4-Bit-Modus wechseln). Ist nicht effizient, funktioniert aber garantiert. Was passiert bei dir? LCD ist im 4-Bit-Modus, wenn du den Controller zurücksetzt, der µC re-initialisert das LCD, geht vom 8-Bit-Modus aus, sendet ein Wort -> LCD denkt, es hat nur 4 Bit und wartet auf die nächsten 4 Bit -> LCD sieht von nun an nur noch Müll vom µC kommen. Nebenbei: Die Implementation in den Header zu tun ist schlechter Stil und führt früher oder später zu Problemen. ;)
Danke für den Hinweis in der richtigen richtung. Ich habe nun in der LCD_display.h folgendes geändert: // initialize LCD Controller void lcd_init() { // Set Port to Output LCDPORT = 0x00; LCDDDR = 0xFF; _delay_ms(50); // Wait for LCD // 4-bit Modus config sbi(LCDPORT, LCD_PIN_D5); cbi(LCDPORT, LCD_PIN_D4); // 4-Bit Modus start sbi(PORTD, LCD_PIN_E); cbi(PORTD, LCD_PIN_E); // 2 Lines, 4-Bit Mode lcd_send(COMMAND, 0x28); lcd_send(COMMAND, LCD_OFF);lcd_send(COMMAND, LCD_CLEAR); lcd_send(COMMAND, 0x06);lcd_send(COMMAND, LCD_ON); // 2 Lines, 4-Bit Mode lcd_send(COMMAND, 0x28); lcd_send(COMMAND, LCD_OFF);lcd_send(COMMAND, LCD_CLEAR); lcd_send(COMMAND, 0x06);lcd_send(COMMAND, LCD_ON); } Es funktioniert nun damit! Die letzte Sequenz // 2 Lines, 4-Bit Mode wird nun zweimal gesendet und dann klappt es. Ich habe außerdem auch mit ein paar 50 ms delays zwischen den Zeilen der ersten Sequenz versucht, doch ohne Erfolg. Eigentlich bin ich mir aber sicher, dass es nur eine Timingfrage ist und die Sequenz nicht unbedingt zwei mal erforderlich ist. Hätte es Sinn, mit längeren Delays zu testen oder gibt es dann ein Timeout vom Display? Mir fiel auch auf, dass sich der Kontrast im Display ändert, wenn nur eine Zeile geschrieben wird bzw. die zweite nicht erscheint. Das nur so nebenbei. Außerdem läuft meine Uhr noch sichbar zu langsam (geschätzte halbe Sollgeschwindigkeit). Das könnte daran liegen, dass ich noch nicht die richtigen Fuses für den externen Takt des Prozessors gesetzt habe. Das macht die Software MyAVR_Progtool zum flashen des Programms nicht gerade übersichtlich. Da werde ich mich aber noch rein arbeiten. Gruß, Andreas
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.