www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD clear funzt scheinbar nicht


Autor: Wolfgang Newbe Banaston (Gast)
Datum:
Angehängte Dateien:

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

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...da fehlt doch noch was (lcdisplay.asm)...

Autor: Wolfgang Newbe Banaston (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
thx
hier ist sie, bitte schön
Wolf

Autor: Wolfgang Newbe Banaston (Gast)
Datum:

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

Autor: hebel23 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Wolfgang Banaston (Gast)
Datum:

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

Autor: hebel23 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: hebel23 (Gast)
Datum:

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

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.