Forum: Mikrocontroller und Digitale Elektronik LCD clear funzt scheinbar nicht


von Wolfgang Newbe Banaston (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle!
Hab das STK500 und ein Display kompaktibel zu HD44780.
Der Plan von mir war das nach dem einschalten der Spannung eine Stopuhr
zu zählen begint. Soll ein mini Bordcomputer werden, fürs Auto.
So weit so gut. Es funktioniert. Die meiste Zeit ist der MC im
idle-Modus. Aufgeweckt durch den Timer1-Interrupt, wird BCD-mässig eine
eins im Datenspeicher hinzuaddiert und dann am Display angezeigt. Das
Display wird gelöscht, dann in einem Unterprogramm die Stunden, Minuten
und Sekunden neu angezeigt.
Kurioserweise, funktioniert das nicht immer. Bis Sekunde Sieben ist
alles klar. Immer bei Sekunde 8, egal ob das 00:01:08, 00:02:18 oder
00:01:58 ist, geht scheinbar die clear Funktion ins Leere. Am Display
sieht man 00:00:0700:00:08 zB. Erst bei Sekunde 9 wird das Display
korrekt gelöscht und wieder die Zeit richtig angezeigt.
Zuerst dachte ich an den Interrupt. Aber das ganze Programm benötigt
nur 6077,5us. Den Rest der Sekunde verbringt der MC mit idlen. Da kann
es also keine Überschneidung geben.
Beim debbugen ist mir nichts aufgefallen. Allerdings kann man ja leider
das Display nicht debbugen.
Ich bin mit meiner Weißheit am ende. Habt ihr eine Idee, oder habt
etwas ähnliches schon erlebt?
Danke
Wolfgang

von Henning (Gast)


Lesenswert?

...da fehlt doch noch was (lcdisplay.asm)...

von Wolfgang Newbe Banaston (Gast)


Angehängte Dateien:

Lesenswert?

thx
hier ist sie, bitte schön
Wolf

von Wolfgang Newbe Banaston (Gast)


Lesenswert?

Schade, weiss scheinbar auch keiner was das sein könnte.
aber gut. kann damit leben.
aber anderes problem.
die ganze geschichte braucht 999440us. rein rechnerisch, geht die uhr
dann bei 8 minuten nur 268ms falsch. nach meiner messung gerade eben
sinds aber 38 sekunden.
das ist das erste. das zweite ist, ich wollte ein delay einfügen das
eben ein paar us noch zusätzlich verstreichen lässt. so weit so gut.
193us delay ist schnell geschrieben. das in mein programm eingefügt. 3
mal. rechnerisch 579us also müsste unterm strich im simulator 1000019us
rauskommen. tut es aber nicht. es bleibt bei 999440us ich kann so viele
nop und 193 delay einfügen wie ich will. kann mir das jemand erklären.
ich denk mal das muss am timer1 liegen, aber kann mir nicht vorstellen
wie.
danke für antworten
wolfgang

von hebel23 (Gast)


Lesenswert?

Hallo Wolfgang,

also ich hab mir den Source jetzt zwar nicht im Detail angesehen. Mir
ist aber aufgefallen, dass Du die Ansteuerung des Displays über
Warteschleifen machst. Das kann man zwar machen - die bessere Variante
(und die elegantere) ist aber auf jeden Fall das Busy-Flag im HD44780
abzufragen.
Das eigentliche Problem ist aber wahrscheinlich, dass Du die Interrupts
während der Schreibzyklen nicht sperrst. So kommt es früher oder später
dazu, das ein Interrupt in Deinen Schreibzyklus reinpfuscht und schon
ist das Timing pfutsch.
Ich könnte mir vorstellen, dass da das Problem liegt.

Gruß Andreas

von Peter D. (peda)


Lesenswert?

Hast Du auch bedacht, daß manche Befehle längere Wartezeiten benötigen
?

Allerding habe ich "Display Clear" wieder rausgeschmissen. Es ist
doch ein erhebliches Flackern zu erkennen, bis der neue Text wieder
eingeschrieben ist.

Deshalb erstelle ich erst den neuen Text komplett im RAM und
überschreibe dann den alten Text damit.


Peter

von Wolfgang Banaston (Gast)


Lesenswert?

Hallo, und danke für die Tipps.
@ Andreas.
Ich habe das LCD nach dem Tutorial hier auf der Webseite angeschlossen.
Da wird RW auf Ground gelegt. Wird bei meiner nächsten Bastelstunde von
mir berücksichtigt.
Auf die Idee den Interrupt zu sperren, bin ich wirklich nicht gekommen.
Lt. AVRStudio dauert, mit Interruptabarbeitung, die ganze Sache nur
etwas mehr als 6000us (Bin in der Arbeit, kann darum leider nicht die
genaue Zahl sagen, oder schnell nach messen). In der restlichen Zeit
idled der AVR rum. Da auch der Timer jedesmal neu initialisiert wird,
habe ich eigentich ausgeschlossen das der Interrupt den Aufruf von
lcd_clear verhindert. Allerdings habe ich nicht jeden durchlauf
gemessen. Das muss ich morgen nachhollen.
Mal sehen was da rauskommt. Muss auch zugeben, dass ich noch gar nicht
gewusst habe, dass man den Interrupt auch sperren kann.

@Peter
natürlich habe ich im Datenblatt gelsen das manche Befehle auch zB 5ms
brauchen. Die Schleife ist auch vorhanden. Ich habe mich an Vorlagen
aus Büchern, bzw. Internet gehalten, möglich das es da manchmal etwas
knapp wird. Werde das auch noch mal überprüfen. Leider habe ich kein
gescheites Datenblatt für die Nummer auf dem LCD gefunden. Soll ein
KS00?? von Samsung sein. Aber die Initalisierungroutine im Datenblatt
hat nicht funktioniert.  Kompaktibel zu HD447780 sollte es sein.
Gelaufen ist es auch dann schliesslich, aber ob es 100% kompaktibel
ist, keine ahnung.

Vielen Dank Leute
Schönen Tag noch
Wolfgang

von hebel23 (Gast)


Lesenswert?

Hallo Wolfgang,

ohne gesperrten Interrupt wird Deine lcd_clear-Routine schon
aufgerufen. Es kann aber eben passieren, das der Interrupt genau in dem
Moment ausgelöst wird, während Du einen Befehl sendest (z.B. beim
Toggeln von E). Und dann kann das Timing mit dem HD44780 durcheinander
kommen. Am einfachsten ist, Du schreibst einfach an den Anfang jeder
LCD-Routine ein "cli" und am Ende ein "sei" und schon ist zumindest
der Fehler ausgeschlossen.

Gruß Andreas

von Peter D. (peda)


Lesenswert?

Soweit ich das erinnere, sind alle Zeitbedingungen nur Minimalzeiten.

Ein Strecken an jeder beliebigen  Stelle durch einen Interrupt ist also
völlig ohne Bedeutung.

Wenn Du Probleme hast, die Delayzeiten ordentlich zu berechnen und auch
nicht mein Delaymacro in der Codesammlung nehmen willst, dann nimm doch
einen Timer.


Peter

von hebel23 (Gast)


Lesenswert?

Hallo Peter,

ja das stimmt schon. Ich hab halt über eine sehr lange Dauer die
Erfahrung gemacht, dass es doch zu Problemen füren kann. Im Haus meiner
Eltern läuft seit etwa 4 Jahren ununterbrochen eine Alarmanlage mit
mehreren HD44780 - Display`s die ich zunächst nur mit Warteschleife und
ohne Interruptsperre betrieben habe. Nach ein Paar Wochen Laufzeit kam
es dann manchmal zu dem oben beschriebenen Problem. Seit dem die Sache
mit Busy-Flag und Interruptsperre läuft, gibts keine Probs mehr.

Viele Grüße 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.