LCD-Dot-Matrix-Displays an I2C

Bei vielen Projekten sind schnell alle Pins eines µC’s mit i/O Peripherie oder der ICSP-Schnittstelle belegt. Zum Schluss bleibt einem dann leider nichts mehr, als auf die üblichen Bussysteme wie SPI oder I2C zurück zu greifen. Das Problem ist nur, dass ein übliches Display dann nur Parallel versteht. Doch warum hier schon aufgeben?

Die einfachste Lösung besteht aus einem Schieberegister, einer Taktleitung und einer Datenleitung. Man füttert einfach mit dem Takt das Register und übernimmt dann über eine weitere Leitung die Daten. Problem nur an der Lösung: Es ist meiner Meinung nach nicht wirklich erweiterbar, oder zumindest nicht einfach. Zwar habe ich diese Lösung zum Beispiel auf Ulrich-Radig.de, doch ist ja nicht immer alles super, was andere machen. Schliesslich hat diese Lösung den kleinen Fehler, das man für jedes weitere Display, oder ähnliche Peripherie einen weiteren Pin des µC belegt, oder anders lösen muss. Für mich bringt eine solche Lösung zu viele neue Probleme.

Die bessere Lösung, zumindest aus meiner Sicht, ist ein 8- oder 16-Bit-I2C-Port-Expander, die sich adressiert sauber schalten lassen. Zudem braucht man nur die zwei Signale vom I2C, als auch Masse von einer externen Baugruppe zur nächsten zu führen, wenn man sein Projekt um gleichartige Peripherie erweitern möchte.
Mit der 8-Bit Version lässt sich eine 4-Bit Ansteuerung realisieren. Geht man auf 16-Bit, kann man den vollen 8-Bit-Modus nutzen und hat noch Platz für Tasten. Hält man gewisse Timings mehr als ein und verzichtet auf das Auslesen des Controlers/Speichers, könnte man auch auf das R/W-Signal verzichten, zumal das hin und her-schalten von Ausgangs- zu Eingangsport ein wenig umständlich ist.

Will oder muss man Strom sparen, sollte man sich noch was wegen der Hintergrundbeleuchtung des Displays überlegen. Zum einen kann man einen freien Pin des Expander nutzen, oder man setzt einen I2C-Bus-LED-Treiber ein, der die LED nach belieben nicht nur ein und aus schalten kann, sondern auch gleich noch nach belieben dimmen. Jedoch steigt der Aufwand mit der Menge der ICs.

Der Lösungsansatz

Entschieden habe ich mich hier für die letztere Variante, da sich so mit einer vieradrigen Leitung die Kommunikation samt Versorgung einer Bedieneinheit realisieren lassen. Platziert man nun noch alles geschickt auf einer Leiterplatte, kann man es wunderbar hinter eine Frontplatte montieren und brauch sich um das Thema Bedieneinheit keine Sorgen mehr machen. Schliesslich muss die Einheit nur noch mithilfe eines passenden Kabels mit der Hauptplatine verbunden werden und kann über dem selben Bus noch einiges anderes anschliessen, zum Beispiel einen Kartenleser für I2C-Chipkarten als Zugangskontrolle.

Jedoch noch kurz einmal einen Schritt zurück, denn noch ist es nicht so weit.

Das Display wird nun über die einen 8-Bit mit Daten und über einige Bits der anderen acht mit Steuerbefehlen gespeist. Da es flexible bleiben soll, beschränke ich mich nicht auf das reine übergeben von Daten, sondern auch auf die Option, Daten vom Display zu lesen. So spendiere ich nun drei Bits für die Steuerleitungen und zudem noch ein Bit für die Beleuchtung, da man dann doch eher im Code spart und die Dimmfunktion nicht gerade wichtig ist. Zumal sind die Chips auch nicht ganz billig.

Wer nun aufgepasst hat, der weiss, dass noch vier Bits offen sind. Diese vier werden zu Eingängen für die Taster. Fünf Eingänge wäre schöner um einen Tast-Joystick, wie er in vielen Handy zu finden ist, nutzen zu können, jedoch reichen bei einem reinem Zeilen-Display vier Taster vollkommen. Zwei auf der Unterseite für Vor und Zurück, zwei weitere an der Seite für Hoch und Runter, um in einem Menü hoch und runter wählen zu können.

Zum Schluss bleibt nur die Frage: Was macht man mit dem Kontrast? Eine Idee war ein DA-Wandler, jedoch ist der schlecht zu bekommen, oder einfach zu teuer. Ein Port-Expander mit 8-Bit zum DA-Wandler um zubauen war auch nicht gerade billig und ein wenig zu übertrieben. Ein einfacher Trimmer reicht meines Erachtens vollkommen, denn die meisten Displays sollten vom Kontrast stabil bleiben, dass ein einmaliges einstellen der passenden Spannung mittels Trimmer meistens für sehr lange reichen sollte. Zwar habe ich bisher noch keine Testreihen mit Verhalten bei starken Temperaturschwankungen gemacht, jedoch bleibt wohl in den allermeisten Fällen die Umgebungstemperatur recht human, zumal eher die Trimmer schwanken.

Schaltplan und Funktion

Über SV1 kommt das I2C-Signal und wird direkt für weitere Geräte zu SV2 durchgeschleift.SV1 und SV2 sind hier als eine 5-Pin-Stiftleiste vorgesehen, da bei einigen µC von MicroChip die SPI- und I2C-Schnittstelle deckungsgleiche Pins gebrauchen, wobei SPI einen Pin mehr nutzen. Neben den Datenleitungen ist auch noch die Betriebsspannung zu finden, womit die externe Peripherie gespeist werden kann(es sollte jedoch die Leistungsgrenze des Versorgenden beachtet werden!). Da nicht alle Projekte immer auf 5V, sondern auch mal auf 3,3V laufen, ist direkt nach dem Eingang die Betriebsspannung über SV4 gebrückt um eine Möglichkeit zu haben, eine externe Versorgungsspannung ein zu schleusen. Bei Speichern ist es meist überflüssig, da sie oft einen recht kleinen Energiebedarf haben und zudem noch mit kleinen Spannungen arbeiten.

Der schon angesprochene Port-Expander IC2 ist hier ein PCA9555D(SO24-Package). Der Datenport des Display, Pin7-Pin14 IC1, ist an die 8-Bit des MS-Byte(IO1-x) von IC2 angeschlossen worden, da immer erst das LS-Byte zuerst übertragen wird, was die Option bietet, über bestimmte Timings Zeit in der Übertragung zu sparen. Wenn man sich das Datenblatt seines Displays nochmal genauer betrachtet, wird man das passende dazu finden.

Auf dem LS-Byte sind neben den Steuerleitungen die Tasten und die Hintergrundbeleuchtung zu finden. Letztere ist einfach über einen BC547 mittels IO0-3 geschaltet. Die Tasten S1-S4 belegen IO0-4 – IO0-7 und sind zusätzlich mit Pullup-Widerständen beschaltet.

Zu guter Letzt dienen JP1 für die Einstellung der unteren 3 Adressbits und JP2 als Möglichkeit das Interrupt-Signal zu verwerten. Zwar ist im Falle eines reinen I2C-Bus Pin 4 von SV1 bzw. SV2 frei, jedoch ist auch nicht immer sicher, was für Peripherie noch an diesem Bus angeschlossen ist. Da auch nicht jeder Chip, der an diesen I2C-Bus angeschlossen ist, über einen Interrupt-Ausgang verfügt, finde ich diese Lösung am sinnvollsten.

Die Kommunikation in der Theorie

Ohne ein wenig überlegen geht es nicht ganz. Denn nun geht die Kommunikation µC<->Display, auch wenn sie sicher in den meisten Anwendungen simplex ausfallen dürfte, über eine weitere Schicht. Und wie es in der Technik meistens so ist, will nicht nur das Display richtig initialisiert sein, sondern auch der PCA9555.

Erst die Konfiguration, dann die Kommunikation

Zur richtigen Konfiguration schickt man ihm nach dem Steuerbyte die einzelnen Zuweisungen für die Ein- bzw Ausgänge. Es funktioniert eigentlich recht simple und genauso wie bei jedem Pic: Jede 1 ist ein Ausgang und jede 0 ein Eingang????????. So ergibt sich also als Konfiguration: 0000 1111 und 1111 1111.

Wenn das geschafft ist, schickt man die üblichen Informationen an das Display und kann die Taster abfragen. Wie man das Display konfiguriert, sollte in dem Beipackzettel oder dem Datenblatt stehen. Meistens ist es jedoch eine einfache Prozedur von vier Befehlen und ein bisschen Wartezeit. (HIER BITTE NOCHMAL NACHGUCKEN UND DAS 08/15 DISPLAY KONFIGURIEREN!!!)

Hello World

Wenn nun alles richtig läuft, kann man anfangen das Display voll zu schreien. Ansich funktioniert es wie eh und je, nur eben immer über den PCA9555. Wie bei jedem Start einer Kommunikation kommt erst die Adresse. Bei dem Zugriff auf das Display wir das R/W-Bit auf 0 gesetzt, da man nun ja Daten auf die Ports senden möchte. Danach übermittelt man erst immer die Zustände der Steuerleitungen und dann die der Datenleitungen. Wenn man danach einen Moment wartet, kann man in den folgenden zwei Byte Enable wieder auf 0 setzen, wiederholt einfach das zweite Byte und beginnt bei dem nächsten Zeichen mit der Prozedur wieder von vorne.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.