Forum: Mikrocontroller und Digitale Elektronik LCD Adressen


von Andreas (Gast)


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

von Benedikt K. (benedikt)


Lesenswert?

Andreas wrote:
> Hat jemand ne Idee woran das liegen könnte.

Naja, ich würde mal sagen an deiner Software...

Was meinst du mit Durcheinander ?

von Andreas (Gast)


Lesenswert?

Na an der Software ändert sich nichts und bei den ersten 14 klappt es 
auch.

von Benedikt K. (benedikt)


Lesenswert?

Bist du sicher, dass der 15. Wert auch richtig geschrieben wird ?

Wenn irgendwo Probleme auftreten würden, dann normalerweise beim 8. Wert 
(da Übergang 1. -> 2. Zeile), oder beim 40. Zeichen (da der 44780 2x40 
Bytes Speicher hat).
Alles andere würde ich auf die Software schieben.

von Andreas (Gast)


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.

von Benedikt K. (benedikt)


Lesenswert?

Wenn es so kompliziert ist, kannst du dann ausschließen, dass du 
wirklich keinen Softwarefehler gemacht hast ? Stackoverflow usw. ?

von Andreas (Gast)


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.

von holger (Gast)


Lesenswert?

>nein kann nichts falsch sein

Wenn du meinst. Ich schliesse mich Benedikt an.
Damit stehts 2:1 ;)

von Jochen M. (taschenbuch)


Lesenswert?

>nein kann nichts falsch sein
Ööhmmm, und warum funktioniert es dann nicht?

Einfache Antwort:
Wenn nichts falsch sein kann, gibt es auch keine Handlungsbedarf.
Also alles so lassen wie es ist.

>>Damit stehts 2:1 ;)
Nein, 3:1

Jochen Müller

von Andreas (Gast)


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.

von Karl H. (kbuchegg)


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.

von Jochen M. (taschenbuch)


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

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

So hir ist der Programmausschnitt ich hoffe ihr könnt euch reinfitzen.

von holger (Gast)


Lesenswert?

Na da wissen wir ja wenigstens das es sich um einen PIC handelt.
Die Frage ist nur welcher ?

von Andreas (Gast)


Angehängte Dateien:

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.

von Jochen M. (taschenbuch)


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

von Andreas U. (Gast)


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.

von Jochen M. (taschenbuch)


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

von Andreas U. (Gast)


Angehängte Dateien:

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.

von Andreas U. (Gast)


Lesenswert?

Die warezeiten hab ich auch verlängert bringt aber nichts. Ich habe 
jetzt 3ms bei Steuerbefehlen und 1ms bei Daten. Gefordert sin 1,6ms und 
50µs.

von tastendrücker (Gast)


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.

von Andreas U. (Gast)


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?

von tastendrücker (Gast)


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
            ^^^^^^^^

von Jochen M. (taschenbuch)


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

von Andreas U. (Gast)


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!*

von Jochen M. (taschenbuch)


Lesenswert?

Ok, jetzt wird es klarer.
Hast Du es mal mit dem manuellen Shift probiert, also bei jedem 
Buchstaben gezielt manuell zu shiften? Tritt das Problem dann an der 
selben Stelle auf?

Jochen Müller

von Andreas U. (Gast)


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?

von gast (Gast)


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

von Thilo M. (Gast)


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.

von tastendrücker (Gast)


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.

von Andreas U. (Gast)


Angehängte Dateien:

Lesenswert?

So Ich hab endlich den Fehler Gefunden. Ich hatte eine Fehhler in der 
Anfangsadresse.
Ich habe das funktionirende listing noch mal mit angehängt fals nochmal 
jemand sowas braucht.
Danke nochmal für die vielen Antworten!
Gruß Aschi!

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