LCD Adressen

Gast #868013
Lesenswert?

Hallo!

Ich hab einen LCD Display LCD161A von Reichelt mit 2x8 Zeichen die in
einer Zeile angeordnet sind.
Der Displayschift ist aktivirt und die Zeichen sollen alle von rechts
nach links über den Display wandern. Am Anfang geht alles gut. Aber nach
14 Zeichen kommen die neuen Zeichen nicht mehr auf dem Display an. Hat
jemand ne Idee woran das liegen könnte. Sind die Adressen des DD-RAM
durcheinander?

gruß Andreas
Gast #868075
Lesenswert?

Na ja is ja bissel komplizierter.
Springe erst zur hinterstern Stelle und schreibe dort einen Wert rein. 
Dann Springe ich zur 8. Stelle und schreibe dort einen Wert rein. Der 
Displayschift ist immer abwechselt an und aus damit es immer blos eine 
Stelle Weiter rückt. Dieses Wird unendlich wiederholt und die Adresse zu 
der ich Sprinnge um eins erhöht. Da dran ist auch bei der 14. Stelle 
nichts anders drann aber ab da kommen keine neuen Zeichen mehr hinten 
an.
Gast #868092
Lesenswert?

nein kann nichts falsch sein ist ein und diselbe schleife die 
immerwieder wiederholt wird. Ich denke das die Adressen der auf dem 
Display nicht mehr Stimmen. Also das nach b'10111110' nicht b'10111111' 
kommt sonder irgeneine andere Adresse.
Gast #868131
Lesenswert?

Dake für eure antworten die haben mich echt weitergebracht.
Versteht ihr überhaubt das Problem. Die Sofware geht bis zur 14. Stelle 
ohne Probleme und bei der 15. macht sie das selbe und es funktioniert 
trotzdem nicht.
Bitte nur noch sinnvolle Ratschläge. Danke.
#868134
Lesenswert?

Andreas wrote:
> Versteht ihr überhaubt das Problem.

Ich gebe zu, dass die Lösungsversuche etwas durch die Blume
waren.

Daher jetzt Klartext:
Poste endlich mal dein Programm!

Bei der Fehlersuche fängt man immer beim Naheliegendsten an.
Auch wenn ein Problem im LCD-Prozessor nicht ausgeschlossen werden
kann, so ist das Naheliegendste immer noch, dass du im Programm
einen Fehler hast. Erst wenn das ausgeschlossen werden kann,
macht es Sinn nach anderen Fehlerursachen zu forschen.

Ausserdem ist die Beschreibung dessen, was du da mit dem LCD
veranstaltest, zumindest für mich, etwas zu dürftig. Ich kann
mir noch nicht wirklich vorstellen was du da machst, bzw. wie
das Fehlerbild eigentlich aussieht.
#868136
Lesenswert?

>>Dake für eure antworten die haben mich echt weitergebracht.
>>Versteht ihr überhaubt das Problem. Die Sofware geht bis zur 14. Stelle
>>ohne Probleme und bei der 15. macht sie das selbe und es funktioniert
>>trotzdem nicht.
>>Bitte nur noch sinnvolle Ratschläge. Danke.

NUN REISS DICH BITTE MAL ZUSAMMEN, OK?
Sinnvolle Antworten hast Du GENUG bekommen:
1) Das Display macht KEINEN Adress-Umbruch mitten in der Zeile. Punkt.
2) Also liegt es an Deiner Software oder am Timing. Punkt.
3) Es gibt KEINE andere Möglichkeit. Punkt.

Wann zu wirst DU endlich etwas sinnvolles tun, und die Software 
vorzeigen.
Alles andere führt zu nichts.

Jochen Müller
Gast #868159
Lesenswert?

Ich verwende einen P16F873 an 4MHz
Den Display steuer ich über 4-bit modus an
Die Pinbelegung ist folgende:
;RB0  E
;RB1
;RB2  RS
;RB3  R/W
;RB4  DB4
;RB5  DB5
;RB6  DB6
;RB7  DB7
Anbei noch das ganze Programm wem das lieber ist.
Vielen Dank schonmal für die vielen bemühungen.
Angehängte Dateien:
#868480
Lesenswert?

Andreas,

Ich konnte aus Zeitgründen nur kurz über den Quelltext fliegen, 
vielleicht später nochmal in Ruhe.
Falls es ein 44780 Controller auf dem Display ist, dann hast Du aber 
meiner überschlägigen Meinung nach den Display-Shift nicht aktiviert. 
Dazu müsste im CommandMode auf jeden Fall BIT-4 irgendwo gesetzt werden, 
das sehe ich im Quelltext auf den ersten Blick nicht nicht.

Du hast lediglich die Schreibrichtung von rechts nach links geschaltet, 
mit dem DisplayShift hat das aber nichts zu tun.

Aber selbst wenn, würde das für eine Art Laufschrift, oder was das 
werden soll nicht reichen, denn der Displayspeicher ist nicht als 
Ringpuffer gebaut. Du kannst da also die Displayposition nicht beliebig 
oft shiften, irgendwann musst das das ganze mal auf 0 zurücksetzen.

Jochen Müller
Gast #869130
Lesenswert?

Also der Displayshif ist an. Für die ersten 14 Zeichen fuktioniert ja 
auch alle perfekt.
Das der LCD keinen Rigpuffer hat ist mir bekannt. Meine frage ist ja 
auch wann und wo ich wieder an einer anderen stelle anfangen muss. Wie 
gesagt ab dem 14. Zeichen kommen hinten keine Neuen mehr an.
#869177
Lesenswert?

Probiere mal 2 Dinge:

1) wenn Du ohne DisplayShift ganz normal auf das Display schreibst, 
gehen dann alle Stellen, arbeitet im Display alles perfekt?

2) verlangsame das Timinig, vielleicht ist das so hart an der Grenze, 
dass das Display beim Shiften zwischendurch mehr Zeit benötigt und 
dadurch alles durcheinader kommt.

Und zeige mir zur Kontrolle im Quellcode mal die Stellen, wo Du das 
DisplayShift aktivierst. Welchen Controller hat das Display?

Jochen Müller
Gast #869186
Lesenswert?

Im Katalog steht zum Controller: LSI KS0070B oder komp.
Die 16 Zeichen kommen einwandfrei wenn ich den Display ausschalte.
Mit dem Displayschift ist ein Fehler in meinem kommentar im Programm 
gewesen. Hat also keine auswirkung auf das Programm. Wird in der 
Displayrotine erst aus und dann wieder angesaltet. Hab nochmal alles 
berichtigt.
Angehängte Dateien:
Gast #869217
Lesenswert?

>Dazu müsste im CommandMode auf jeden Fall BIT-4 irgendwo gesetzt werden,
>das sehe ich im Quelltext auf den ersten Blick nicht nicht.

Sehe ich auch so. Dein Code:

   movlw  b'00000110'  ;Display not shift!!
   :
   movlw  b'00000111'  ;Display shift an !!


In (einem KS0070B) Datenblatt sehe ich aber:

------
5) Cursor or Display Shift
   RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    0  0   0   0   0   1  S/C R/L  ×   ×
  :
 Table 4. Shift Patterns According to S/C and R/L bits
 S/C R/L Operation
  0   0 Shift cursor to the left, AC is decreased by 1
  0   1 Shift cursor to the right, AC is increased by 1
  1   0 Shift all the disp. to the left, cursor moves according to the 
disp.
  1   1 Shift all the disp. to the right, cursor moves according to the 
disp.
-------

DB4 ist immer '1' um Cursor- oder Display-Shift zu schalten.
Gast #869227
Lesenswert?

Ja das ist der Befehl und den Display unm eine Stelle zu verschieben. 
Ich schalte aber den Automatischen Displayschift immer an und aus. Dafür 
müste mein Befehl Stimmen.
Oder kann ich das nicht so machen?
Gast #869282
Lesenswert?

Wenn ich mir das Datenblatt ansehe,

  RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
   0  0   0   0   0   1  S/C R/L  ×   ×
          ^   ^   ^   ^   ^   ^   ^   ^


müsste das Shift Ein-/Ausschalten aber so aussehen:


;        DB 76543210
   movlw  b'00010000'  ;Display shift off
            ^^^^^^^^

;        DB 76543210
   movlw  b'00011000'  ;Display shift left
            ^^^^^^^^

;        DB 76543210
   movlw  b'00011100'  ;Display shift right
            ^^^^^^^^
#869331
Lesenswert?

Naja,

ICH persönlich habe es aufgegebe zu verstehen, was der OP will.
Das wird mir echt zu mysteriös.

BEISPIELE:
>>Ich schalte aber den Automatischen Displayschift immer an und aus.
>>Also der Displayshif ist an.
Was denn nun? An, Aus, oder an-aus?

>>Die 16 Zeichen kommen einwandfrei wenn ich den Display ausschalte.
Also wenn das Display AUS ist, zeigt es die Zeichen 
an???????????????????
HÄ?

Ausserdem ist nach wie vor kein DisplayShift im Quellcode aktiviert, 
auch nicht für kurze Zeit. Bit4 ist IMMER Null.

Jochen Müller
Gast #869657
Lesenswert?

>>>Ich schalte aber den Automatischen Displayshift immer an und aus.
>>>Also der Displayshif ist an.
> Was denn nun? An, Aus, oder an-aus?
Der displayshift ist abwechselt an und aus weil ich an zwei stellen 
einen Buchstaben reinschreiben muss und der Display dabei nur um eine 
Stelle weiterrücken darf.


>>>Die 16 Zeichen kommen einwandfrei wenn ich den Display ausschalte.
> Also wenn das Display AUS ist, zeigt es die Zeichen
> an???????????????????
> HÄ?
sorry ich meine wenn der Displayshift aus ist.


> Ausserdem ist nach wie vor kein DisplayShift im Quellcode aktiviert,
> auch nicht für kurze Zeit. Bit4 ist IMMER Null.
Dieser befehl von dem ihr die ganze zeit reded ist das einmalige 
verschieben des Displays.

In meinem Datenblatt steht:
shift:
       S/C  0 curser move
            1 Display shift
       R/L  0 left
            1 right
       Damit wird der Display einmalig verschoben

es gibt aber noch einen anderen befehl:
Entry mode set:  RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
                  0  0   0   0   0   0   0   1  I/D SH
                 I/D 0 decrease
                     1 increase
                 SH  0 Display is not schift
                     1 Display is shift
Der Display wandert also automatisch
und *diesen Displayschift verwende ich in Meinem Programm!*
Gast #870397
Lesenswert?

Also ich hab das jetzt mit dem manuellen schift probiert. Is aber auch 
nicht besser. Auch hir kommen dei ersten Zeichen ohne Probleme. Das 16. 
erschein aber dann nicht mehr auf dem Display.
Wo kan den da noch was falsch sein?
Gast #870407
Lesenswert?

also ich hab jetzt auch nicht ganz verstanden was du willst, aber klingt 
irgendwie nach laufschrift oder so. auf jeden fall ist es bei den 
meisten displays so, dass du z.b zwar nur 16 zeichen auf einer zeile 
anzeigen kannst, der puffer aber z.b bis 40 geht. wenn du nun also 
rotierst und 16 zeichen da stehen, dann schiebst du die restlichen 24 
"leerzeichen" auch wieder vorne rein
Gast #870440
Lesenswert?

Ich habe mir jetzt nicht den ganzen Thread durchgelese, evtl. wurde 
darauf schon hingewiesen (Datenblatt Seite 7 ganz unten):
1. Zeile Adresse 0x00..0x07
2. Zeile Adresse 0x40..0x47

Ich habe so ein 4x20-Zeichen-Teil von Displaytec, da fängt die erste 
Zeile bei 0x80 an, die zweite bei 0xc0.

Ich denke mal, dass es an sowas liegen muss.
Gast #870484
Lesenswert?

>Also ich hab das jetzt mit dem manuellen schift probiert. Is aber auch
>nicht besser. Auch hir kommen dei ersten Zeichen ohne Probleme. Das 16.
>erschein aber dann nicht mehr auf dem Display.
>Wo kan den da noch was falsch sein?

So wie ich das Datenblatt verstehe, hat das Display (der KS0070B) pro 
Zeile intern Platz für 24 Byte:

Zeile 1
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16  17 18 19 20 21 22 23 24
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D OE OF  10 11 12 13 14 15 16 17

Zeile 2
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16  17 18 19 20 21 22 23 24
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F  50 51 52 53 54 55 56 57

Mein Gedanke:

Wenn Du ein 2x8 Display hast und in der Zeile 1 mit Display-Shift (left) 
an die rechteste Position (Pos.8/0x07) schreibst, bekommt die Position 8 
anschliessend eine höhere Adresse(->0x08). Wenn du das 16 mal machst, 
hat die Pos. 8 des Displays die Adresse 0x17. Weiter kann man eben nicht 
schieben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren