Grafik-VF-Display bleibt dunkel

  • Moin Moin!

    Ich möchte an meinem Raspi 3 dieses Display zum Laufen bringen: https://learn.adafruit.com/graphic-128x64-vfd / https://cdn-shop.adafruit.com/datasheets/GP9002A+Appnote.pdf Es ist ein vollgrafikfähiges VF-Display von Futaba, angesteuert via SPI und einen GPIO-Ausgang zum Ändern der Betriebsart (Kommando / Daten empfangen). Ein passendes Kabel habe ich gemäß o.a. Anleitung fabriziert (auch wenn sie sich auf einen Arduino bezieht) und ein wenig C++-Code geschrieben:

    Nur: Das Display zeigt nichts an! :@ Ich habe schon die Pinbelegung und natürlich die SW gecheckt, doch alles, was ich zurückbekomme, ist ein unlesbarer Wust (8 Bytes) an Daten, welche mir der SPI-Anschluss zurückliefert. Der Trafo des Displays wird warm (die Kathoden werden also aufgeheizt), doch angezeigt wird nix. Könnte es vielleicht ein elektrisches Problem sein? Die +5V Vcc bekommt das Display über eine StromPi-Platine und ein zerlegtes USB-Kabel. Die habe ich verifizieren können: 5,6 V, von denen ~4,8 V am Display-Eingang ankommen. Ist vielleicht die Spannung vom SPI und GPIO-Anschluss das Problem? Der Raspi hat ja 3,3 V, der Arduino aber 5 V. Das Datenblatt des Displays nennt als min. High-Level 0,7 × Vcc, also 3,5 Volt. Knapp daneben also?!

    Brauche ich damit einen Pegelwandler, um aus den 3,3-V-Signalen des Raspis 5-V-Signale zu machen? Diesen etwa: http://www.watterott.com/de/Level-Shifter Danke für jeden zweckdienlichen Tipp!

  • Hier noch die Ausgabe des Programms:

    Diese kryptische Zeichenkette (immer die selbe!) kriege ich als Rückantwort über den SPI-Anschluss.
    Automatisch zusammengefügt:

    OK, ich glaube, ich hab's:

    Es haben an zwei Stellen die Anweisungen zum Setzen des GPIO-Anschlusses auf HIGH gefehlt. Deswegen hat das Display die Inputs nicht als Befehle, sondern als Daten gewertet. Den Fehler machte ich zwar nur 1×, kopierte ihn aber mit. :(

    UPDATE: Zu früh gefreut! Das Display zeigt im Grafikmodus lediglich einen Pixelschnee, den ich durch das Variieren der Grafikdaten nicht ändern kann, und im Textmodus rein gar nichts. Einen Pegelwandler 3,3 auf 5 Volt habe ich angeschlossen, doch geholfen hat das leider nicht. Auch ein paar nanosleep-Befehle im C++-Code (um die im Datenblatt beschriebenen kurzen Pausen zwischen den Befehlen umzusetzen) halfen überhaupt nicht.

    UPDATE #2: Kann es sein, dass der Wechsel von HIGH auf LOW zu schnell vonstatten geht, sodass beim Display diese Wechsel nicht mehr alle ankommen?

    Einmal editiert, zuletzt von Oldsmobile (10. Juli 2016 um 18:57)

  • nanosleep-Aufrufe durch gpioDelay-Befehle ersetzt (weil ein nanosleep meist ~70 µs Wartezeit mit sich brachte) und ein paar weitere Verbesserungen vorgenommen. Leider immer noch kein Erfolg:


    vfd.h hat sich jetzt freilich auch geändert:

    Hätte da jemand eine Idee…? :denker:

  • OK, nach kurzem Studium des Displaytreibers für den Arduino und ein wenig Rumprobieren glaube ich zu wissen, wo der Hund begraben liegt: in der Bit-Endianness des Displays! Es ist nämlich Little Endian (LSB), während die SPI-Schnittstelle im MSB-Modus /* der angeblich auch der Standardfall bei SPI ist */ arbeitet. Da pigpio aber von Haus aus nur MSB unterstützt, müssen sämtliche Daten und Befehle quasi rechts-nach-links geschrieben werden, wofür es immerhin ein passendes Codeschnipsel gibt: http://stackoverflow.com/questions/2602…-bits-in-a-byte

    Ein erster Versuch verlief durchaus erfolgreich. Das Endergebnis poste ich, wenn ich es habe.

    UPDATE: Hier das Ergebnis! Man muss nur jedes einzelne Byte verkehrt rum auf den SPI schreiben, um LSB zu emulieren. Etwas Recherche förderte auch ein passendes Codeschnipsel zu Tage:

    Code
    char vfd::Reverse (char b)
    {
      b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
      b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
      b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
      return b;
    }

    Was in die buffer-Variable geschrieben wird, muss dann halt durch die Reverse()-Methode gezogen werden:

    Code
    buffer [0] = Reverse (0x01);

    Damit ist der Fall von meiner Seite aus gelöst. Traurig nur, dass pigpio über keine passende Einstellung (beim spiOpen() schon) verfügt. Doch immerhin kann ich jetzt weiterentwickeln. :D

    Einmal editiert, zuletzt von Oldsmobile (11. November 2016 um 21:55)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!