Displayzelle bekommt falsche Sonderzeichen , IF fehlerhaft ?

Hallo,

ich raff es einfach nicht mehr, Leute.
Sämtliche Debugausgaben stimmen genau so wie sie sein sollen und dennoch wird jede alte Zelle vom Display mit dem neuen Zeichen überschrieben.

Ich wollte statt einem länger werdenden Balken nach rechts eine Treppe bzw. ein Dreieck darstellen.
Zelle 0 wächst nach rechts einstufig, Zelle 1 wächst nach rechts 2stufig usw. Soll so sein, ist es aber nicht.
Wenn die nächste Displayzelle dran kommt werden immer alle vorherigen Zelle mit dem vollen Sonderzeichen der nächsten Zelle überschrieben. Nicht nur mit dem aktuellen direkt nächsten Sonderzeichen.

Jede Zelle hat 5 Pixelspalten, 16 Displayzellen gibt es, also könnte man 0…79 Darstellungen unterscheiden.
Ich lasse zum Test nur bis 24 zählen, was die ersten 5 Displayzellen füllt.

Habe den Code schon drastig reduziert, Debug stimmt immer noch, Fehler finde ich nicht.
Die Frage lautet zum Bsp., warum überschreibt er mir Zelle 0, wenn er doch schon in Zelle 1 gesprungen ist?

Ich habe das Gefühl das schon der nächste Zeichensatz geladen wird und nochmal die alte Zelle beschrieben.
Ich sehe das aber nirgends das es so ist. Laut Code-Reihenfolge, macht er das auch nicht. Laut meinen Augen jedenfall.

Ihr müßtet nur das Display anpassen und schon könnt ihr mit Display und seriellen Monitor zuschauen.

Also falls jemand Lust hat zu gucken … Danke ist sicher.

Edit:
Betreffzeile passender geändert

Displaytest_Sonderzeichen_001.zip (2.37 KB)

Das Ändern des Zeichensatzes ändert die Darstellung aller dieser Sonderzeichen,
auch die der vorher geschriebenen Zellen.

Hi Doc_
so 'n Display hat nur 8 Bytes für Sonderzeichen, 0..7, danach ist Ende im Gelände. In meiner anfänglichen Euphorie vor wenigen Monaten dachte ich auch, man könnte auf dem 20x4-Display die schönsten Grafiken zaubern wie auf 'nem Bildschirm... Dat geht leider nit :confused:

Hallo,

Danke fürs reinschauen. Hmm, sogesehen, leuchtet das erstmal ein.
Nur gibt es noch das Display RAM. 80x8 Bit Display RAM für 80 Character. Für max. 20x4 Anzeigen oder so.

Es wird doch laut meiner Meinung jedes darzustellende/sichtbare Zeichen erst in das Display-RAM geschrieben welches jeder sichtbaren Zelle zugeordnet ist. Also ein Zwischenspeicher für alle Zellen.
Würde bedeuten, laut meiner Meinung, ich schreibe irgendwelche Zeichen in die RAM Adresse 0 bis 4 die Zelle 0 bis 4 zugeordnet sind und dann schreibe ich irgendwelche Zeichen in RAM Adresse 5 bis 9 die Zelle 5 bis 9 zugeordnet sind.

Der feste Zeichensatz umfasst 256 Zeichen, die stehen im ROM, kann also nichts mit dem Display RAM zu tun haben. Müßte auch erst ins Display RAM kopiert werden.

Somit denke ich leider immer noch, dass man durch ständiges umladen der freien 8 Speicherplätze jede sichtbare Zelle anders beschreiben kann.

Und wenn dem so wäre wie ihr meint, kann ja sein, kann sein das ich immer noch falsch liege, dann müßte aber beim umladen des Zeichensatzes die alte Zelle sich mit dem aktuellen Sonderzeichen ändern. Alle alten Zellen werden aber sofort mit dem jeweils letzten Sonderzeichen Nr 4 überschrieben.

Im Display Ram stehen nur die Daten, nicht die angezeigten Bitmuster.

Die Muster werden daraus generiert.

Die ersten 8 Zeichen (0x00-0x07) können mit eigenen Bitmustern belegt werden.

Mein Vorschlag: mache für alle Zeichensätze das volle Zeichen gleich.

Oder besorge dir ein graphikfähiges Display.

Hallo,

Oh oh, Danke, okay, dann geht das nicht anders.
Das nennt man wohl schmerzvolles lernen. Habe gerade nochmal anders probiert. Tatsache, er ändert sofort alle anderen komplett davor mit. Einmal sieht man es deutlicher, beim anderen an gleicher Position gehts zu schnell um es zu sehen.

Wegen dem Vorschlag. Dann bliebe mir nur mein nach links oder rechts länger werdender Balken übrig, also das was ich bisher hatte. Demnach hatte ich zufällig ein Muster wo der Effekt nicht auffiel und dachte es wäre wegen dem RAM. Der obige Effekt mit der länger und höher werdenden Mauer sieht nicht so schön aus.

Du könntest mir nochmal auf die Sprünge helfen. Welche Daten stehen im RAM wenn es nicht die Bitmuster sind?
Hat jede sichtbare Zelle ihren eigenen RAM? Oder doch nicht.

Displaytest_Sonderzeichen_002.ino (3.54 KB)

Jedes Zeichen hat eine Speicherstelle im RAM (ein Byte), das steht der ASCII Kode drin.

Die Muster stehen im ROM, außer den acht Benutzer Zeichen.

Technisch ist das oft so gelöst, dass der RAM Ausgang als Teil-Adresse für den Muster-ROM benutzt wird.
Das macht der Hardware-Multiplexer im LCD Controller für das eigentliche LCD.

Aber du wolltest jetzt sicher keine Vorlesung über Rechnerarchitektur haben, oder?

Hallo,

die Behandlung eines Z80 in der Lehre ist schon viele Jahre her. Nur hatte ich damals noch kein Fabel dafür. Man hatte es eben gelernt und wieder vergessen.

Ich habs jetzt einigermaßen verstanden wie das abläuft. Mehr muß ich erstmal nicht wissen.
Recht herzlichen Dank. Hätte sonst suchen können bis ich schwarz gewurden wäre.

Solange man keine LCD controller bauen, will ist es ja auch irrelevant wie die innen funktionieren. :wink:

Auf S72 des Datenblattes steht noch was von einem ICON-Ram von 80Pixeln. Vielleicht kannst du das auch noch nutzen.

Whandall:
Die ersten 8 Zeichen (0x00-0x07) können mit eigenen Bitmustern belegt werden.

Und werden von 0x08 bis 0x0F (dezimal 8 bis 15) wiederholt. Zeichen 0 entspricht Zeichen 8 Dies wahrscheinlich weil die Adresse nicht gänzlich decodiert wird und 1 Bit fehlt. Wahrscheinlich vereinfacht das die interne Schaltung.

In die Adressen 0x00 bis 0x0F wird RAM eingeblendet. So wird beim Darstellen des Zeichens die Bitzeichnung für die Zeichen 0x00 bis 0x0F nicht aus dem ROM (Caracter Generator ROM , CG ROM) herausgelesen sondern aus dem CGRAM. Der HD44780 hat 2 RAM-Bereiche eben das CGRAm und das DatenRAM wo drinnen Steht welche Zeichen (ähnlich der Ascii Tabelle) dargestellt werden.
Das CGRAm ist aber nicht groß genug um die Bitmuster fpr 16 Zeichen zu beinhalten. Es kann nur 8 Zeichen beherbergen. Darum wird es in den Zeichen 0 bia 15 zweimal eingeblendet.

Grüße Uwe

Hallo,

denke ich auch, muß auch nicht die Motorsteuerung verstehen nur weil ich Auto fahren möchte. :wink:
Aber das Hebelchen welches die Motorsteuerung am Ende befehligt muß man beherrschen. :grin:

Der Icon RAM ist laut meinem Verständnis der Teil vom CG-RAM. Was wiederum auf das gleich hinauslaufen würde.
Vielleicht kann das Whandall erklären.
Für mein angedachte “grafische Darstellung” bräuchte ich Platz für 40 eigene Zeichen, weil sich davon nichts wiederholen würde. Und für links und rechts Ausschlag sogar 80 eigene Zeichen.

@ Uwe, ich habe einen anderen Controller, names ST7036, oben verlinkt.
Nur warum soll Bit 1 fehlen in deiner Darstellung. Es geht doch 2x von 0…7, insgesamt genau 16.

Doc_Arduino:
Der Icon RAM ist laut meinem Verständnis der Teil vom CG-RAM. Was wiederum auf das gleich hinauslaufen würde.
Vielleicht kann das Whandall erklären.
Für mein angedachte "grafische Darstellung" bräuchte ich Platz für 40 eigene Zeichen, weil sich davon nichts wiederholen würde. Und für links und rechts Ausschlag sogar 80 eigene Zeichen.

@ Uwe, ich habe einen anderen Controller, names ST7036, oben verlinkt.
Nur warum soll Bit 1 fehlen in deiner Darstellung. Es geht doch 2x von 0..7, insgesamt genau 16.

Wo sich das RAM befindet und wie es physich aufgebaut ist ist zweitrangig. Wichtig ist allein, daß die beiden Speicherbereiche verschiedene Aufgaben, sprich Funktionen haben und verschieden angesprochen, sprich mit Werten gefüllt werden.
Es sind nicht 16 sondern 1x 8 die wiederholt werden.

Wenn Du fern siehst und ein Sender in der Nacht den Krimi vom Abend wiederholt, hast Du zwar 2 mal Krimis gesehen, aber nur einen Krimi.

b0111 und b1111 sind die gleiche Zahl wenn man das erste, höherwertige Bit ignoriert, nämlich b111.

Wenn das ROM mit 2x 4 Bit adressiert wird, das RAM aber nur 3 AdressBit hat (sind ja nur 8 Speicherzellen) dann wiederholen sich die Speicherstellen des RAM im Adressraum.

Grüße Uwe

Hallo,

okay, soweit erstmal klar.

Für mein angedachte "grafische Darstellung" bräuchte ich Platz für 40 eigene Zeichen, weil sich davon nichts wiederholen würde. Und für links und rechts Ausschlag sogar 80 eigene Zeichen.

Leider habe ich nicht das Display und kann dem Programmablauf nicht entnnehmen, wie das ganze wirklich aussehen soll.
Könntest du zum Mitdenken das ganze mal bildlich darstellen, was auf dem Display zu sehen sein soll.

Hallo,

ist auch schwierig wenn es so nicht umsetzbar ist.
Das Display wäre eigentlich egal, Hauptsache es hat 8 freie Speicherplätze.
Ich versuche mal was darzustellen was nicht darstellbar ist. :slight_smile:
Stelle dir eine Treppe vor mit 8 Stufen.
Diese 8 Stufen nacheinander anzeigen wäre kein Problem, sieht aber recht plump aus.
Deshalb sollte jede Stufe einzeln animiert werden. Spalte für Spalte über alle Zellen hinweg.
Eine Zelle hat 5 Pixelspalten, 16 Zellen gibt es, macht 80 verschiedene Pixelmuster.
Ähnlich wie meine Balkenanimation nur eben mit Stufen.
Balkenanimation
Eine Pegelanzeige nur liegend. Oder so.
Anbei in Excel dargestellt. Ich hoffe das Vorhaben wird ersichtlich.
Für die Balkenanzeige benötige ich nur jeweils 5 Pixelmuster, beide Seiten werden nicht zeitgleich dargestellt, deswegen klappte das so “einfach” auf Anhieb. Hätte ich das damals schon probiert, wäre mir das schon früher aufgefallen.

Habe mich auch nochmal schlau gemacht. Mir lies das keine wirkliche Ruhe. Ich fasse mal zusammen.
Das Display wird mit 30Hz multiplext. Weil es “nur” besagte 80 Byte Display RAM hat.
Dadurch wird jede Änderung im CG-RAM, wo auch die eigenen 8 Sonderzeichen liegen,
sofort auf dem Display sichtbar.
Damit ist alles gut, ich weis Bescheid was ich wissen mußte und gut ist. Sehr Schade.
Es bliebe nur ein Grafikdisplay aber das möchte nun wirklich nicht.
Übrigens wäre meine Balkenanimation wie im Video im Zeichensatz vom DOGM204 schon enthalten.
Mit dem liebäugel ich schon länger.

Da stellt sich die Frage, warum die Controllerhersteller so geizig mit dem Display RAM sind.
Die paar Byte mehr sollten doch möglich sein. Das Display wäre sofort um Welten vielseitiger.

Edit: habs geschafft das Ding aus Excel rauszukopieren als Bild. Das war der unmögliche Plan. :slight_smile:

Treppenaufbau.png

Doc_Arduino:
Da stellt sich die Frage, warum die Controllerhersteller so geizig mit dem Display RAM sind.
Die paar Byte mehr sollten doch möglich sein. Das Display wäre sofort um Welten vielseitiger.

Weil der HD44780 Chip schon über 30 Jahre alt ist und damals jeder Transistor für ein Bit RAM die Chipoberfläche extrem vergrößert hätte und damit verteuert.

Wieso gibt es die RTC ds1307 mit 56 in Worten sechunfünfzig Byte RAM? Warum nicht gleich einige k Byte?

Grüße Uwe

Hallo,

Uwe, jetzt mal ehrlich, es gibt doch nicht nur den HD44780 auf der Welt. Mein Display hat zum Bsp. einen ST7036, der kann schon automatischen Zeilenumbruch. Kann der 44780 nicht. Wie alt ist der 44780 eigentlich? Heutzutage sollte bei einem Displaycontroller kein Multiplexing notwendig sein. Nur weil paar Bytes fehlen. Die müssen ja kein Megabyte einbauen. Ein paar Byte mehr würde völlig reichen. Sodass jede Zelle seinen eigenen Speicher hat. Die Siliziumfläche für das kleine Multiplex Rechenwerk/Schieberegister könnten auch für RAM sinnvoller verwendet werden.

Irgendwie weiß ich es immer noch nicht, wie die Balken aussehen sollen, so dass man sie nicht durch geschicktes umkopieren und nutzen der 8 Zeichen zumindest ähnlich darstellen kann.

Vielleicht solltest du dich bei den Grafikfähigen Displays umschauen (Beispiel).

Doc_Arduino:
Heutzutage sollte bei einem Displaycontroller kein Multiplexing notwendig sein. Nur weil paar Bytes fehlen.

  1. wie würdest du denn die 5 x 8 x 32 Pixels schalten, wenn nicht mit Multiplexing?

  2. die Menge an RAM hat nichts mit der Ansteuerungsart zu tun.