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