1602 LCD Fehlverhalten

  • Hallo zusammen,
    Ich bin diesem Tutorial gefolgt: http://tutorials-raspberrypi.de/raspberry-pi-l…y-16x2-hd44780/
    und habe den vorgeschlagenen Code abgetippt: http://www.tutorials-raspberrypi.de/wp-content/upl…hd44780_test.py .

    Problem ist wohl die Main-Funktion: Der statische Text wird problemlos angezeigt. Die erste for-Schleife funktioniert auch. Jedoch springt bei jedem Durchlauf der zweiten for-Schleife der 'Zeiger' an eine beliebige(?) Position und der Text wird teilweise auch in der ersten Zeile des Display angezeigt (gleichzeitig). Wie lässt sich dieses Fehlverhalten erklären und wie lässt es sich beheben? :s
    Vielen Dank schon mal voraus :danke_ATDE:

    Coaster-Moritz

  • Das ist kein Fehlverhalten, sondern genau das, was das Skript machen soll. In der ersten for-Schleife wird msg1 auf der ersten Zeile des Displays "durchgeschoben" und die zweite Zeile ist leer. In der zweiten for-Schleife wird msg1 in Zeile 1 angezeigt und msg2 wird in Zeile 2 durchgeschoben.
    Da du das aber als Fehlverhalten bezeichnest, musst du uns noch sagen, was genau du denn erreichen willst

  • Der Text wird nicht 'durchgeschoben', er kommt an zufälligen Stellen zum Vorschein, springt hin und her, ist teils außerhalb des Bildes (nicht wie geplant), die Zweite Zeile erscheint in beiden Teilen des Display und dann plötzlich nicht mehr, etc.
    Vielleicht habe ich mich zu unpräzise ausgedrückt. Als Ziel habe ich das Verhalten, wie du es beschreibst. Manchmal funktioniert es auch wie geplant. Warum aber nicht immer, weiß ich nicht.

  • Ich habe den Code jetzt wie folgt verändert:


    Manchmal wird der erste Schleifendurchlauf korrekt durchgeführt, manchmal beginnen die "Spinnereien" schon nach dem ersten Block in der Schleife, in jedem Fall aber beim 2. Schleifendurchlauf.
    An sich werden die richtigen Texte angezeigt, jedoch an der falschen Stelle (s.o.).
    Es gibt wohl ein Problem mit dem Einstellen der Curserposition im Speicher des Display.
    Die Beschreibung des Display hinterlege ich als Anhang. Es ist ein HD44780-kompatibles Display von Reichelt mit blauem Hintergrund für 9,99€.
    Leider funktioniert der Editor hier bei mir nicht ganz richtig und ich konnte den Link nicht einfügen.

  • wird wohl eher an einer falschen Config liegen, die Position der 2ten Zeile legt man nach Datenblatt in der Software fest!

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Moin,
    als erstes, ich kann kein python! Aber ich habe selbst Displays in Betrieb, die ich, in C geschriebene Programme anspreche.

    Ich denke das nicht immer die Cursorposition richtig gesetzt wird. Die Displayadressen 0x80 und 0xc0 sind Schieberegisteradressen.
    Will sagen der Cursor wird immer weitergeschoben. Dann kann es auch passieren das der Inhalt von Zeile 1 in Zeile 2 auftaucht.

    Vorschlag

    Ja, ich weiss nicht eingerückt.
    Beim ersten Befehl wird alles im Display gelöscht und der Cursor auf Anfang gesetzt.
    Der zweite Befehl setzt nur den Cursor wieder auf Anfang

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Hallo DG8BR.


    Ich denke das nicht immer die Cursorposition richtig gesetzt wird. Die Displayadressen 0x80 und 0xc0 sind Schieberegisteradressen.


    ...kann zwar Python einigermaßen, aber Einspruch euer Ehren.

    Erstmal ist die Init-Sequanz iwie faul.

    Code
    def display_init():
    lcd_send_byte(0x33, LCD_CMD)
    lcd_send_byte(0x32, LCD_CMD)
    lcd_send_byte(0x28, LCD_CMD)
    lcd_send_byte(0x0C, LCD_CMD)  
    lcd_send_byte(0x06, LCD_CMD)
    lcd_send_byte(0x01, LCD_CMD)


    ...der will 3x die 0x3x am Anfang, und das in ner bestimmten Zeitfolge. (Init-Sequenzen gibt's zuhauf im-net)
    Der Rest ist... na ja

    Da ist nix mit Schieberegister.
    Diese 0x80 und 0xc0 sind die Startadressen der 2 Zeilen.
    Man kann also ein Zeichen ohne zu "shiften" exakt an Pos. Y,X schreiben.

    Nach der Initialisierung gilt vereinfacht folgendes Prinzip:
    DDRA set (D)isplay(D)ata( R)am(Adress) set...
    DDRA write (D)isplay(D)ata( R)am(A)dress write...
    Also: Adresse setzen, raus das Zeichen an diese Adresse.

    Display shift/Cursor shift etc. ist was anderes... was zum spielen.

    gruß root

    Edited once, last by root (July 13, 2016 at 1:59 AM).

  • Moin,
    @root. Da hast du recht mit dem Adressen. Da ich aber keine Lust hatte , nachzuprüfen ob nun geshiftet oder Adressen gezielt angesprochen werden, habe ich dies Aussage gemacht.
    Ausserdem deutet das Verhalten des Displays genau auf Shiften hin.
    Das mit dem Init ist mir auch aufgefallen, aber eine Blick in das Datenblatt hat es nicht bestätigt.

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Moin,
    ich weiss das alle Lc-Display's so initialisiert werden. Aber das Datenblatt von electronic assembly sagt das nicht.
    Aber es schadet sicherlich nicht, 0x33 drei mal zu schicken.

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Ich habe jetzt noch etwas herumprobiert, verschiedene init-Sequenzen verwendet, usw.
    Eine Lösung hab ich jedoch nicht gefunden. Ich schätze, das Display ist einfach nicht in Ordnung, wenn der selbe Code doch auf einigen verschiedenen Webseiten vorgestellt wird und es bei anderen offensichtlich funktioniert. Ich überlege, mir jetzt ein paar andere LCDs der selben Größe bei AliExpress zu bestellen, ist das empfehlenswert oder ist davon abzuraten? Finanziell hat man dort ja nichts zu verlieren.

  • Moin,
    du hast in deinem ersten Beitrag geschrieben, das der statische Text richtig erscheint.
    Also erste Zeile

    Code
    Es scheint zu

    und in der zweiten Zeile

    Code
    funktionieren :


    Weiter schriebst du das

    Code
    Dies ist ein

    auch noch in der ersten Zeile steht.
    Aber steht es so

    Code
    Es scheint zu Dies ist ein

    oder

    Code
    Dies ist ein


    Was ich wissen will, wird der erste Test überschrieben oder angefügt??
    Wenn du es nicht sehen kannst, weil es zuschnell ist, dann mach dieses

    Code
    time.sleep 4

    grösser.

    Um auf deine letzte Frage zurück zu kommen.
    Das Display zeigt ja was an, aber ich denke das dein Script nicht richtig funktioniert.
    Aber letztendlich ist es deine Entscheidung.

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Heute hab ich mich nochmal dran gesetzt und hatte vor, nochmal das Verhalten zu beobachten und auf DG8BR's Frage

    Quote

    Was ich wissen will, wird der erste Test überschrieben oder angefügt??

    zu antworten. Da habe ich nochmal den Originalquelltext eingegeben. hd44780_test.py

    Ich hatte nämlich so viel am Code verändert, dass ich ohne Kommentare nicht mehr durchblickte (Ich weiß, ich weiß......).
    Ich habe beobachtet, dass die erste Zeile überschrieben wird und nicht der neue Text an den Alten angehängt wird.
    Als ich nochmals die Ratschläge durchgearbeitet habe und zu

    Quote

    Läuft das Skript vielleicht doppelt? Oder greift noch ein anderer Prozess auf die entsprechenden GPIOs zu?

    kam, hab ich mir mal die Ergebnisse für

    Code
    lsmod

    angesehen, waren da doch tatsächlich die beiden Module w1-gpio und w1-therm aufgelistet, die ich für einen DS18B20-Temperatursensor in

    Code
    /etc/modules

    eingefügt hatte und vor beginn des Projektes auskommentiert hatte. Da w1-gpio auf den GPIO4 (register select des Display) zugreift, gab es wohl die beschriebenen Komplikationen. Ich habe die Module mittels

    Code
    modprobe -r

    manuell entladen und plötzlich funktionierte alles problemlos. Ich habe mir die Datei nochmal angesehen und die immer noch auskommentierten Module komplett entfernt. Neustart und sie wurden trotzdem noch geladen.
    Ich werde wegen diesem neu entdeckten Problem mal ein neues Thema im richtigen Thread eröffnen.
    Vielen Dank für die Hilfe! :danke_ATDE:

  • Moin,
    ok, das wäre also geklärt.
    1-wire wird über raspi-config eingestellt. Schau dir das nochmal an.

    Und wenn fertig, bitte deinen Thread als erledigt markieren. Danke!

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!