- 12V Akku mit 280 Ah bauen         
Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 54

Thema: LCD Write

  1. #21
    chris152
    Gast
    Anzeige

    Praxistest und DIY Projekte
    edit: aus Datenschutzgründen entfernt

  2. #22
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.01.2004
    Ort
    München
    Alter
    74
    Beiträge
    214
    Also:

    Die Tabelle beschreibt die Bits und die Daten, die das LCD versteht; die Tabelle beschreibt NICHT einen Übertragungsmodus. Nur im 8-bit mode kann man sagen: "ich schicke die Datenbits 00000010 direkt an die pins D7..D0 des LCD (in einem einzigen Takt)".

    Die gesetzten RS bits bei den beiden letzten Zeilen sagen genau das Gegenteil, nämlich: Das sind DATEN. Alle Zeilen davor haben RS=0 und sind deshalb KOMMANDOS.

    Wenn Du die D-Bits "0000 0010" ans LCD schickst, je nach Modus in einem oder in zwei Takten, heisst das für das LCD:
    Entweder
    "Führe das Kommando CursorHome aus", nämlich genau dann, wenn RS=0 und R/W=0
    oder
    "Schreibe HEX 02 ins aktuelle RAM an die aktuelle Position und inkrementiere bzw. dekrementiere die Position dann", nämlich wenn RS=1 und R/W=0
    oder
    "Lies das nächste Zeichen aus dem aktuellen RAM von der aktuellen Position und inkrementiere bzw. dekrementiere die Position dann", nämlich genau wenn RS=1 und R/W=1 (Du darfst dann allerdings keine D-Bits schreiben, sondern muss sie ja lesen, notfalls wieder in 2 Takten).
    oder
    "Zeige mir das Busy Flag", nämlich genau wenn RS=0 und R/W=1 (Du darfst dann wieder keine D-Bits schreiben, sondern muss sie lesen, notfalls wieder in 2 Takten).

    In der Praxis musst Du nie das Busy Flag vom LCD lesen, wenn Du in CBASIC programmierst - Dein Programm ist sowieso immer langsamer als das LCD. Deshalb wirst Du RS=0 und RW=1 nie verwenden.

    Auch "Daten vom LCD lesen" benutzt Du normalerweise nicht -- normalerweise willst Du ja Daten zum LCD schreiben, und nicht nachschauen, was gerade auf dem LCD steht. Deshalb wirst Du auch RS=1 und RW=1 kaum verweden.

    Bleibt also übrig:
    RW=1 (das heisst: Du schreibst was ans LCD),
    und da musst Du halt sagen, was das LCD mit den D-Bits anfangen soll:
    Entweder schickst Du ein Zeichen, das das LCD anzeigen soll (RS=0),
    oder Du schickst ein Kommando, das das LCD ausführen soll, wie z.B. "CursorHome" (RS=1).


    Vielleicht solltest Du Dir die Tabelle etwas anders hinschreiben, nämlich:

    1. Mit R/W gibt man an, ob zum LCD geschrieben wird (R/W=0), oder ob vom LCD gelesen wird (R/W=1, wird selten benutzt).
    Wenn man wirklich mal vom LCD lesen will (R/W=1), darf man natürlich nichts auf die D-Bits schreiben - die will man ja gerade lesen, das müssen also ein Eingabe-Ports sein.

    2. Mit RS gibt man an, welcher Teil des LCD betroffen ist. Betroffen ist entweder das LCD RAM (RS=1), oder es ist ein "LCD Kommando-Register" (RS=0).
    Wenn man ins LCD DD-RAM schreibt (RS=1), muss man in den D-Bits das ASCII-Zeichen angeben, das man anzeigen will; wenn man ausnahmsweise mal aus dem LCD RAM lesen will, darf man natürlich keine D-Bits schreiben, sondern muss sie lesen.
    Wenn man in ein LCD Register schreibt (RS=0), führt man ein Kommando aus, und man muss dann in den D-Bits angeben, welches der 8 Kommandos das sein soll; einige dieser 8 Kommandos haben noch Zusatz-Bits wie z. B. "I/D" bei "EntryModeSet".
    Register lesen geht nicht, nur Busy Flag lesen geht, aber das braucht man in CBASIC nicht.

    3. Die 8 D-Bits übergibt man natürlich nur, wenn man zum LCD schreibt (also nicht, wenn man ausnahmsweise mal vom LCD liest).
    Je nach Mode gehen die 8 bits in einem Takt rüber (8 bit mode), oder in 2 Takten (4 bit mode).
    Welchen mode man benutzt, hängt von der Beschaltung ab: Wenn ausser dem E-Bit und den Steuer-Bits RS und R/W auch noch alle 8 D-Bits beschaltet sind, kann man den 8 bit mode benutzen. Wenn statt dessen nur die D-Bits D4..D7 beschaltet sind, geht (nur) der 4 bit mode, der dann zwar zwei Takte pro Byte braucht, aber dafür schon mit 7 bit-Ports auskommt (im Gegensatz zu 11 bit-Ports für den 8 bit mode).

  3. #23
    Gast
    ok vielmals thx, warum kennst du dich da so gut aus bzw. empfiehl mir ein paar seiten!
    thx

  4. #24
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.01.2004
    Ort
    München
    Alter
    74
    Beiträge
    214
    Na ja, ich mache seit 30 Jahren Software, und da sollte ein LCD schon drin sein. Ausserdem war das weniger eine Software-Frage von Dir , als eine Gedulds-Frage bei mir... (hab's nicht so gemeint: man MUSS so lange fragen, bis man's versteht; und "Verstehen" ist kein Problem des Fragenden, sondern des Anwortenden, denn "Der Empfänger hat immer Recht!")

    Datenblatt-Sammlung für diverse LCDs und den Standard-Controller kannst Du Dir bei Conrad runterladen; aber wenn man das Prinzip mal verstanden hat, ist Deine Seite als Zusammenfassung viel nützlicher.

  5. #25
    Gast
    lcd_param = &H38 : gosub LCD_WRITECMD '8-Bit-Modus aktivieren
    lcd_port = &H02 'mit 8-Bit-Command in 4-Bit-Modus umschalten
    pulse lcd_e '= 2x tog lcd_e
    lcd_param = &H28 : gosub LCD_WRITECMD 'ab jetzt 4-Bit-Modus

    - wieso wird zuerst der 8-bit-modus aktiviert um danach mit dem kommando home in den 4-bit-modus zu wechseln? das is doch das kommando home!!
    - außerdem kann write doch kein 8-bit-kommando schreiben, weil ja geshiftet wird und nur in port 9 bis port 16 geschrieben wird!
    - und wozu ist &H28?

  6. #26
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.01.2004
    Ort
    München
    Alter
    74
    Beiträge
    214
    Einiges dazu findest Du auch in dem langen posting vom 30.01.2004, 15:11, Punkt 7 ("INIT"), anderes nicht, deshalb also:

    Warum zuerst mit &H38 ("FunctionSet") in den 8-bit-mode -- Ich denke mir das so (bin mir aber nicht ganz sicher):
    Niemand kann mit Bestimmtheit sagen, in welchem Modus das LCD beim Aufruf von LCD_INIT ist:
    Eigentlich sollte es selbst einen power-on reset gemacht haben und deshalb im 8-bit-mode sein (ist so definiert);
    manchmal tut es das aber auch nicht (ist so definiert, zb wenn nicht genug Spannung oder sowas da ist);
    wenn aber ein anderer Programm-Zweig schon mal LCD_INIT aufgerufen hat, dann ist es im 4-bit mode.
    Deshalb sollte LCD_INIT so geschrieben sein, dass es sowohl bei aktuell laufendem 4-bit, als auch bei 8-bit mode immer in den 4-bit-mode schaltet.
    EINE Möglichkeit dazu ist (hab nicht gecheckt, ob's die einzige ist):
    Zuerst in den 8-bit mode setzen; dann weiss man woran man ist;
    dann in den 4-bit mode setzen; da will man ja hin;
    dann im 4-bit-mode alles weitere sagen, denn die Routinen braucht man eh.

    Deshalb also zuerst &H38 mit LCD_WRITE_CMD schicken, denn:
    Im 4-bit mode ist das das Command "FunctionSet" (bits 001) mit Parametern DL=1="8-bit-mode" (die folgenden Parameter sind auf der HTML-Seite nicht beschrieben: N=1= "2 Zeilen-Display" und F=0= "5x7 characters in 5x8 Matrix").
    Im 8-bit-mode gibt diese Ausgabe etwas Mist, aus zwei Gründen:
    Erstens gibt LCD_WRITE ja in zwei Takten aus, aber das sind dann im 8-bit-mode für das LCD auch ZWEI Befehle.
    Und zweitens sind ja gar nicht alle 8 Datenleitungen des Port zum LCD durchkontaktiert, sondern nur die niedrigwertigen 4 bits des Port auf die höherwertigen vier Datenleitungen des LCD; die niedrigwertigen DL's des LCD hängen in der Luft.
    Das LCD erhält also irrtümlich zwei Commands:
    &B0011xxxx (FunctionSet, DL=8 bit), und &B1000xxxx (SetDDRAM): Aber OK, ist kein Beinbruch.

    Immerhin: Jetzt sind wir also definitiv im 8-bit-mode.
    Im Gegensatz zu vorhin (Ausgabe mit LCD_WRITE) legen wir jetzt das Byte &H02 DIREKT an den LCD_PORT an. Das ist also NICHT das Command "02=CursorHome" -- wird ja nicht mit LCD_WRITE ausgegeben; sondern:
    Auf grund der Hardware-Kontaktierung stehen im höherwertigen Halbbyte des Port die Steuerleitungen zum LCD (hier: R/W=0 "write", RS = 0 = "RegisterSelect"), und im niederwertigen Halbbyte des Port die 4 HÖHERWERTIGEN Datenbits für's LCD (ist ja so verdrahtet für den 4-bit-mode!!)
    Folglich bedeutet die DIREKTE Portausgabe &H02=&B00000010 für das LCD das Command $B0010xxxx, und das ist "FunctionSet" mit DL=0= "4-bit-mode" (restliche bits sind wieder undefiniert, weil nicht kontaktiert).

    So: Jetzt sind wir also definitiv endlich im 4-bit-mode.
    Das &H28 wird mit LCD_WRITECMD ausgegeben, ist also ein command und bedeutet fast dasselbe wie das vorher das &H02 direkt am Port angelegt, nämlich wieder "FunctionSet" mit DL=0= "4-bit-mode", aber jetzt können wir auch die restlichen bits definiert setzen und damit "2 Zeilen" und "5x8 Matrix" sagen (ähnlich wie vorher &H38 für den 8-bit-mode).


    Falls sich tatsächlich ein Hardware-Entwickler das ABSICHTLICH so VORHER überlegt hatte, kann ich nur sagen: Muss Des-sign? -- Aber lass Dich nicht abschrecken: es gibt auch Einfacheres!

  7. #27
    Gast
    weiß das wer?

  8. #28
    Gast
    Und dann würd ich noch gern wissen, obs egal ist, ob man sich im cg- oder dd-ram befindet, wenn man ein kommando schreibt.
    danke für eure hilfe!!!!

  9. #29
    Gast
    oops sorry, hab net gesehen dass es auf der 2. seite weiterging ..
    warum muss man zweimal in den 4-bit-modus wechseln, einmal mit 8-bit-command und dann nochmal mit &H28?

  10. #30
    Gast
    und vielmals thx, ich hoff es macht dir nix, soviel zu erklärn

Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test