Forum: Mikrocontroller und Digitale Elektronik Reset ist nicht Power on?


von Andreas B. (videotechniker)


Lesenswert?

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

von Guru (Gast)


Lesenswert?

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.

von Dennis S. (bzzzt)


Lesenswert?

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.

von Guru (Gast)


Lesenswert?

@ 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.

von Dennis S. (bzzzt)


Lesenswert?

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.)

von Guru (Gast)


Lesenswert?

@ 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.

von Dennis S. (bzzzt)


Lesenswert?

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.

von Guru (Gast)


Lesenswert?

@ 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.

von Dennis S. (bzzzt)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Guru (Gast)


Lesenswert?

Tja. Das ist auch eine Möglichkeit. Na, mal sehen was der TO schreibt.

von Andreas B. (videotechniker)


Angehängte Dateien:

Lesenswert?

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

von Dennis S. (bzzzt)


Lesenswert?

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. ;)

von Dennis S. (bzzzt)


Lesenswert?

Ach ja, die Wartezeiten zwischen den Befehlen sind auch wichtig ;)

von Andreas B. (videotechniker)


Lesenswert?

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
Noch kein Account? Hier anmelden.