LCD20x4 (Chipset HD44780) an C128 Userport = keine Funktion

  • Moin,


    ich stehe vor einem mir nicht lösbarem Problem.


    Folgender Aufbau:
    Ein 4 Zeilen á 20 Zeichen Display hängt am Userport:


    D4 Pin #11 <--- Pin #C = Pokebyte 1 (Datenleitung 1)
    D5 Pin #12 <--- Pin #D = Pokebyte 2 (Datenleitung 2)
    D6 Pin #13 <--- Pin #E = Pokebyte 4 (Datenleitung 3)
    D7 Pin #14 <--- Pin #F = Pokebyte 8 (Datenleitung 4)
    RS Pin #4 <--- Pin #K = Pokebyte 64 (Befehl / Datenregister)
    E Pin #6 <--- Pin #L = Pokebyte 128 (Übernahmeimpuls)


    Stromversorgung kommt vom Versuchsaufbau via 7805er.


    Softwarelösung:
    4bit Modus, daher wildes nibblen:


    Initialisierung:
    R/W, RS, Data
    Ab hier 8bit-Befehle, die unteren Werte haben keine Bedeutung:
    0,0,0011xxxx = 8bit
    0,0,0011xxxx = 8bit
    0,0,0011xxxx = 8bit
    0,0,0010xxxx = 4bit


    Ab hier 4bit-Befehle, 2er Gruppen
    0,0,0010 = FunctionSet, 4bit, zweizeilig, 5x8 Darstellung
    0,0,1000
    0,0,0001 = Kursor anzeigen, nach rechts schreiben
    0,0,0100
    0,0,0000 = Laufrichtung Kursor, kein Shift
    0,0,0110
    0,0,0000 = Display einschalten, Kursor einschalten, blinkend
    0,0,1111
    0,0,0000 = Display löschen
    0,0,0001
    0,0,0000 = Kursor auf Pos. 1
    0,0,0010


    Beim anliegenden Datensignal erfährt das Display ein Impuls, die Datenleitungen werden erst danach gelöscht. Laut Datenblatt werden die Daten mit der fallenden Flanke übernommen.


    Ergebnis: ab und zu verschwinden die bekannten schwarzen Kästchen in Zeile 1 (bei 20x4er auch in Zeile 3), sonst ist kein Erfolg zu besichtigen.
    Meiner Kenntnis nach sollte der Kursort auf Pos1,1 blinken, kam aber noch nie vor.
    Auch beim Senden eines Zeichens geschieht nichts.


    Die selbe Prozedur hatte ich beim Picaxe 18M2+ schon durch, da läuft das anstandslos, auch zur Kontrolle, ob das Display evtl. defekt ist.
    Die Userportausgangsspannung beträgt zwar ~ 4,8V, allerdings sollte das für ein Highsignal völlig ausreichen.
    Zu schnell kann das Programm auch nicht laufen, da in Basic geschrieben. Die max. Wartezeiten sind irgendwo bei 15ms angegeben, zu langsam kann es nicht sein da ich nirgends eine Deadline als Zeitangabe gelesen habe.


    Ein LCD anzusteuern ist echt nicht so schwer, aber ich komm nicht dahinter, wo es beim Computer klemmt.


    Vielen herzlichen Dank für die Hilfen, Patrick

  • Die erste Frage, die sich mir stellt: Ist es DER HD44780-Chipsatz oder ein Kompatibler?


    Was mir schon an Kompatiblen untergekommen ist mit voellig anderen Timings ist echt erschreckend. Ich nehme an, dass kompatibel in diesem Zusammenhang nur pin- bzw. befehlskompatibilitaet bedeutet.


    Falls Du Dir aber wirklich sicher bist, dass es kein Timing-Problem ist, was hast Du an Messgeraeten? Oszi oder Logikanalysator?


    Grundsaetzlich habe ich das hier gefunden, wo zu lesen ist, dass Basic auf Dauer zu langsam ist: http://www.forum64.de/wbb3/boa…cd-am-userport-ansteuern/ Dort wurde wohl auch schon eine Assembler-Routine entwickelt. Du musst das Rad also evtl. nicht neu erfinden.
    Ueber den Link habe ich nun auch rausgefunden, dass Stefan67: sich gut mit den Displays auskennt(oder kannte, der Thread ist ja schon 9 Jahre alt). ;)


    Gruss
    Thomas

    -------------------------------------------------------------------------------------------------------------------


    Ich bin immer auf der Suche nach Ersatzteilen und Elekronikrestposten.
    Bitte an mich denken, wenn Ihr über Angebote stolpert!

  • Jau, ist 'nen kompatibler. Der Erfahrung von Picaxe nach war das aber ziemlich wurscht, wenn die Steuerung insgesamt langsam war. Wie ich oben bemerkte, die min. Wartezeiten muss man einhalten wegen busy, wenn darüber ist das grad egal.


    Dass man das in Basic nicht machen sollte wegen Schneckenthempo ist mir auch bewusst, in ASM habe ich mich noch nicht eingefunden ;)


    Ach ja, nen Oszi habe ich leider keines mehr, allerdings eine kleine visuelle Hilfe:


    Von der Logik stimmt das (eigendlich)

  • Schau doch mal, wie der Chipsatz genau heisst und ob es da ein eigenes Datenblatt fuer gibt. Das hatte ich auch schon bei diversen BilligDisplays.


    Ansonsten sind die Assembler-Routinen aus dem F64 wohl extra fuer Basic-Programmierer gemacht, so dass man sie per SYSxxx aufrufen kann (ich hoffe ich hab mich beim ueberfliegen nicht verlesen :) )

    -------------------------------------------------------------------------------------------------------------------


    Ich bin immer auf der Suche nach Ersatzteilen und Elekronikrestposten.
    Bitte an mich denken, wenn Ihr über Angebote stolpert!

  • D3 Pin #04 <--- Pin #C = Pokebyte 1 (Datenleitung 1)


    Ich kenne die verwendete Programmiersprache nicht, wundere mich aber zunächst über das aus der Reihen tanzende "D3" - sollte da u.U. D4 verwendet werden?


    Was mich auch wundert - auch wenn das LCD in einem 4 bit Modus betrieben wird, müssen die Bits doch weiterhin auf den oberen Bits "ausgeliefert" werden, wenn das LCD dort angeschlossen ist ?(

  • Was mich auch wundert - auch wenn das LCD in einem 4 bit Modus betrieben wird, müssen die Bits doch weiterhin auf den oberen Bits "ausgeliefert" werden, wenn das LCD dort angeschlossen ist ?(


    Das ist nich richtig. Der 4Bit-Modus dient ja genau dazu, Datenleitungen einzusparen: http://www.mikrocontroller.net…schluss_an_den_Controller
    Vielleicht wuerde ich aber die unbenutzten PINs einfach unbenutzt lassen und nicht auf GND legen.


    Das mit D3 hab ich fuer einen Tippfehler gehalten, macht ja so keinen Sinn.

    -------------------------------------------------------------------------------------------------------------------


    Ich bin immer auf der Suche nach Ersatzteilen und Elekronikrestposten.
    Bitte an mich denken, wenn Ihr über Angebote stolpert!

  • Da habe ich einen Tippfehler verschlimmbessert, jetzt sollte es der aktuellen Sachlage gleichkommen ^^


    PS:


    Die unteren Pins vom Datenkanal werden freigelassen. Übertragen wird erst das höherwertige Nibble, dann das untere. Beide sollen jeweils mit einem Enablesignal bestätigt werden.

  • aeh, da steht immer noch D3! Das muss D4 heissen! Die oberen 4 Bits sind D4-D7.


    Aber da die Pins nun stimmen ist das wohl immer noch ein Tippfehler.

    -------------------------------------------------------------------------------------------------------------------


    Ich bin immer auf der Suche nach Ersatzteilen und Elekronikrestposten.
    Bitte an mich denken, wenn Ihr über Angebote stolpert!

  • Bearbeiten geht nun nicht mehr :D Aber ich denke das blickt schon einer

  • Ich hab es geaendert.

    -------------------------------------------------------------------------------------------------------------------


    Ich bin immer auf der Suche nach Ersatzteilen und Elekronikrestposten.
    Bitte an mich denken, wenn Ihr über Angebote stolpert!

  • Also weiterim Text. Welcher Chip drauf rum lümmelt kann ich nicht sagen, Rückseite sag nicht viel aus.

  • Timing und Initialisierung bei den LCD Controller ist oft sehr unterschiedlich und entscheident ueber die Funktion. Da kann ich guenner zustimmen.
    Hast du den R/W angeschlossen oder fest auf GND gelegt?


    Wichtig ist, dass das E Signal erst gesetzt wird wenn die Steuerleitungen (R/W, RS) stabil sind und nach dem E auch stabil bleiben. Die Daten muessen nur bei der fallenden Flanke stabil sein.
    Ich hab schon einige Leute fluchen hoeren, weil sie das E aus dem gleichen Adressdekoder wie das R/W und RS benutzt haben.


    Wo hast du die Init-Sequenz her?
    In diesem Datenblatt ist es anders beschrieben.


    Weiterhin viel Erfolg
    Florian

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Nur der vollstaendigkeithalber, es hoert sich zwar so an, aber ich frage nochmal explizit: Kontrast ist korrekt, so dass Du auch was sehen wuerdest, wenn es was zu sehen gibt?


    In diesem Display ist laut diesem http://www.qc-lcd.com/Upload/file/20138519401472480.pdf ein KS0066 Chipsatz.


    Im Datenblatt des KS0066 findet man die Angaben, dass der Flankenwechsel maximal 20ns dauern darf.


    Mit PB7 als Busy-Signal arbeitest Du aber? Kannst Du nicht mal deinen Code anhaengen?

    Files

    -------------------------------------------------------------------------------------------------------------------


    Ich bin immer auf der Suche nach Ersatzteilen und Elekronikrestposten.
    Bitte an mich denken, wenn Ihr über Angebote stolpert!

  • Also Antworten nach der Reihe:


    R/W ist fest auf GND, ich will ja nichts lesen.


    Zum E-Signal; Ich habe das folgend gelöst:
    POKE 56577,1
    POKE 56577,1+128
    POKE 56577,1


    Was du mit dem Adressdekoder meinst kann ich eben nicht nachvollziehen


    Die Init-Sequenz habe ich mir aus dem Ärmel geschüttelt, eine Vorgabe ergab aber den selben Misserfolg


    Der Kontrast passt, der Picaxe ist parallel installiert, wird für den Betrieb am Userport logischerweise abgezogen


    Dann die 20ns: Ist damit die Gesamtzeit zwischen High und wieder Low gemeint? dann wird das mit rumgepoke wohl eh nichts

  • Gemeint ist nur der Wechsel von einem Zustand zu einem anderen. Laut Datenblatt muss bei 2.7-4.5V die Flanke innerhalb von 25ns von H auf L und umgekehrt sein.
    Bei 4.5-5.5V sind es nur noch 20ns.


    Im Moment habe ich leider keine Moeglichkeit das zu messen. Aber interessant finde ich das Thema schon, da ich mich auch schon oefters mit diesen Displays rumgeaergert habe.


    Ich hab jetzt auch endlich mal ergoogeltgruendet, was ein Picaxe ist. ;) Ich bin da eher der AVR-Typ. Ok, also an einem Microcontroller funktioniert es.


    Leider muss ich jetzt wieder ein bisschen konzentriert arbeiten. Ich werde das Thema aber weiter verfolgen.



    NACHTRAG: Beim Picaxe nutzt du auch was selbstgemachtes oder greift du auf eine fertige lib zu?

    -------------------------------------------------------------------------------------------------------------------


    Ich bin immer auf der Suche nach Ersatzteilen und Elekronikrestposten.
    Bitte an mich denken, wenn Ihr über Angebote stolpert!

  • Zum E-Signal; Ich habe das folgend gelöst:
    POKE 56577,1
    POKE 56577,1+128
    POKE 56577,1


    So meinte ich das. Signale setzten und dann erst das E Signal setzten, ruecksetzten und weiter.
    Ich denke zwischen den POKEs vergeht genug Zeit.


    Was du mit dem Adressdekoder meinst kann ich eben nicht nachvollziehen


    Musst du nicht.
    Andere Leute haben die Steuersignal UND das E gleichzeitig aus einer Schaltung generiert und sind eben deswegen auf die Nase gefallen.


    Da ich in der Ansteuerung keinen Fehler erkennen kann, solltest du die Init-Sequenz nochmal checken und modifizieren.
    Z.B. wird in dem o.g. Datenblatt zwischen den ersten Zugriffen einige Millisekunden Pause angegeben. Das schafft ein POKE wahrscheinlich nicht. An so was bin ich auch schon mal haengen geblieben. Und hier verhalten sich die Controller auch sehr unterschiedlich, auch wenn kompatibel oder im Datenblatt das gleiche steht. Und lieber laenger warten.


    Vielleicht versuchst du doch mal das BusyFlag zu lesen, oder wenigstens ueber eine LED anzeigen lassen.
    Wenn das Busy nach einem Zugriff nicht weggeht, brauchst du nicht weiter testen.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • also:


    lt. dem Datenblatt ist die Initsequ. eine andere als in verschiedenen Foren


    RS|R/W|D7|D6|D5|D4


    000011 8bit modus


    000011 8bit modus


    000011 8bit modus

    000010 4bit modus


    000010 4bit modus, 5x8, 1line
    000000


    000000 Glotze an mit cursor
    001110


    000000 eingabemodus
    000110


    100100 daten losschicken, in diesem fall nen "H"
    101000


    Der rote Abschnitt wird in den Unterlagen weggelassen, im Netz steht aber laufend, dass das LCD die 3 8bit-modusbefehle braucht
    Hinter meinen 3pokes habe ich eine forschleife als delay eingebaut, da sollte selbst das lahmste Modul zufrieden sein.


    nunja, ein H erscheint nicht

  • Nimm doch mal das von mir verlinkte Datasheet.
    Erstens stehen die ersten 3 8bit modus auch drin und evtl. wichtig definierte Delays.


    Wenn moeglich besorg dir ein Datasheet des Displays.
    Wir reden die ganze Zeit vom Controller. Wir wissen nicht wie der Displayhersteller den Controller mit dem LCD verdrahtet hat.
    Hab gerade mal geschaut. Sieht nicht so schlimm aus bei dem Controller. So viele Register hat der nicht. Bei einem anderen Display war das mal viel komplizierter.


    Wenn das Display an einem anderen Controller laeuft, musst du im schlimmsten Fall einen LA o.ae. bemuehen oder die Software reengineeren.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Also ...


    Der LCD-Controller ist wie weiter oben beiläufig erwähnt ein "QC2004A", dazu finde ich nur ein windiges Datenblatt mit nötigen Spannungen, Pins etc. (siehe unten)
    Projekt_C=128_USERPORT2LCD_Datenblatt_fuer_QC2004A.pdf


    Ich habe die vorgegebene Init-Sequenz von dem PDF umgesetzt, dazu wird jedem Signal mehr als ausreichend Zeit gelassen, sich daran zu gewöhnen. Ergebnis ist kein neues: Defaultzustand wechselt in leer, dann ist feierabend, es tut sich garnichts.


    Falls nötig, drucke ich morgen das Listing aus, wenn ich jetzt den Nadler losschicke bin ich ein toter Mann :D

  • Sieht doch gut aus.
    M.E. macht das Display was du ihm sagst: Es ist aus.
    Schalt es doch einfach mal ein:
    41050 V1$="10 0000 1100" (Leerzeichen im String wegen der Lesbarkeit!)
    Datasheet KS0066 S. 27, Display on


    Und Zeile 22440 kannste loeschen.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Hm, offenbar habe ich nun ein ganz anderes Problem:



    Spontan eine Idee?


    EDIT: Passiert nach dem Einschalten.


    EDIT2: Ich habe wohl (kA wie) den CIA gegrillt, wenn ich den Ausbaue läuft der Kasten wieder. Entweder hatte er zuvor schon 'ne Macke oder ich war es.


    Also erstmal suchen, woher ich den bekomme

  • Spontan eine Idee?


    Der Bildschirmspeicher wird anscheinend nicht initialisiert. Wahrscheinlich laeuft der Rechner gar nicht richtig hoch.
    Aber ich hab keine Ahnung von Commodore Rechnern. Da kann ich dir nicht helfen.



    den CIA gegrillt, ... woher ich den bekomme


    Versuch's doch mal einen NSA. :-)

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Bekomme die Tage ein neuen Käfer.
    Um die Dummheit nicht wieder zu begehen, bau ich ein neues Userportmodul mit Optokopplern, sollte man ja sowieso machen aber neee, der Herr weis es besser ^^

  • Optokoppler halte ich für übertrieben. Ein 74LS245 ist dagegen immer sinnvoll.


    Optokoppler sind auch deutlich langsamer. Auch können dann Flankensteilheiten Probleme bereiten.


    Optokoppler machen erst dann Sinn, wenn du z.B. wegen hoher Ströme unterschiedliche Netzteile / unterschiedliche Massen benutzen musst.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Sodala, nun habe ich ein Satz 74LS245er in der Tasche.
    Ich habe das oben bebilderte Modul mal im ausgebauten bzw. ohne Commodore gemessen: Das feuert von sich aus gute 2 Volt in die Schnittstelle rein. Das dürfte wohl das Problem des CIA-Todes gewesen sein. Möglicherweise war es auch die Ursache, warum das Display faxen machte. Mal abwarten.


    Zunächst baue ich mir dann die Tage eine neue Schaltung mit dem oben genannten Baustein zusammen, dann melde ich mich wieder


    Danke soweit für die gute Hilfe von allen Beteiligten!

  • Du meinst das Modul auf den Bildern rechts, das anscheinend am Rechner haengt und aus dem die fliegende Verdrahtung zum Breadboard geht.


    Das feuert von sich aus gute 2 Volt in die Schnittstelle rein.


    Dann erklaere erstmal was in dem Modul drin ist.


    TTL-Inputs geben immer eine Spannung bzw einen Strom raus. Ja, ich meine raus. Wenn du den TTL-Input mit einem Amperemeter gegen GND misst, solltest du 400 uA messen. Das ist eine Standard TTL-Last. Kann bei LS auch weniger sein.
    Ich hab gerade bei TI nachgeschaut: Eine Standard TTL-Last hat bei Low sogar 1,6mA. LS hat die 0,4mA.


    Also die gemessenen 2V koennen ganz normal sein.


    Schoenen Feiertag
    Florian

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Da stecken zwei SN7404N drin. Diese Schalten bei einem Highsignal die LED dann an. Allerdings laufen die LEDs schon beim Einschalten alle an, obwohl kein Signal anlegt.
    Da das Signal nach meiner Kenntniss nur in eine Richtung laufen kann, ging ich davon aus dass keine Spannung zurück läuft.


    Ich habe Zuhause kein entsprechend hochwertigen Multimeter für diesen MEssbereich.