Über den Aufbau und die Ansteuerung einer 7-Segment-Anzeige wurde hier an zwei Stellen bereits geschrieben -> 7-Segment-Anzeige und BASIC Stamp, 7-Segment-Anzeige und Propeller Controller.
In diesem Projekt wird eine 7-Segment-Anzeige TDSL 5160 von Vishay beschaltet und als einfacher Zähler programmiert. Anschließend wird eine 8-stellige 7-Segment-Anzeige als Zeitnehmer bzw. als Uhr programmiert.
Zwischen jedem LED-Segment einer 7-Segment-Anzeige und einem Arduino I/O Pin muss ein Strombegrenzungs-Widerstand eingebaut werden um die I/O-Kanäle des Kontrollers nicht zu überlasten. Werden alle sieben I/O Pins gleichzeitig auf 1 (3,3 Volt) gesetzt, leuchten alle Segmente der Anzeige auf, es fließt ein Maximalstrom, der die vorgegebenen Belastungsdaten des Arduino-Kontrollers nicht überschreiten darf. Jeder Widerstand zwischen 100 Ohm und 1 kOhm kann als sogenannter Vorwiderstand genommen werden. Dabei gilt: je geringer der Widerstandswert, desto heller leuchtet die LED, desto größer ist aber auch der Stromfluss. Im Versuch werden Widerstände von 470 Ohm genommen.
Zählerschaltung mit einer TDSL5160 7-Segment-LED-Anzeige | |
Material |
|
Aufgaben |
|
Schaltskizze und Schaltungsaufbau
Die hier vorgenommene Pinbelegung ist willkürlich und kann jederzeit abgeändert werden. Mit ihr wird das Prinzip der Ansteuerung gezeigt. Wichtig ist, ob es sich bei dem vorliegenden Baustein um einen mit gemeinsamer Kathode oder Anode handelt -> siehe Datenblatt des Herstellers. Bei gemeinsamer Kathode wird diese mit GND auf dem Arduino Board verbunden, bei gemeinsamer Kathode mit dem 3,3V Anschluss. Der TDSL-5160 ist nach Datenblatt mit einer gemeinsamer Kathode ausgestattet.
Meine Daten zur 7-Segment-Anzeige (dem Datenblatt entnommen)
Trage in die unten stehende Tabelle die Daten zu deiner 7-Segment-Anzeige ein.
Wie schafft man es nun, die Ziffern von 0 bis 9 auf der 7-Segment-Anzeige anzeigen zu lassen? Hilfestellung gibt die Datentabelle (Abb. 2). Es muss herausgefunden werden, welche der 7 Dioden in einer 7-Segment Anzeige bei einer bestimmten Zifferndarstellung ein- bzw. ausgeschaltet werden müssen.
Ein Raster mit acht Spalten verschafft die Übersicht, welche Segmente einer Anzeige bei welcher Zifferndarstellung eingeschaltet werden. Nehmen wir zum Beispiel die Ziffer 3. Die Segmente a, b, c, d und g müssen aufleuchten, damit diese Ziffer auf dem Display erscheint. In die untenstehende Tabelle werden in den Spalten a, b, c, d und g entsprechend Einsen geschrieben, der Rest wird mit Nullen aufgefüllt. Auf diese Weise bekommt man für jeder der 10 Ziffern eine bestimmte binäre Darstellung.
In einem Programm werden die zehn binären Zahlen in einem Array z[10] abgelegt und anschließend die I/O Ports des Arduino auf OUTPUT geschaltet, die mit der LED-Anzeige verbunden sind. Etwas trickreich ist dann die Umsetzung der Zifferndarstellung auf dem 7-Segment-Display. Am Beispiel der Darstellung der Ziffer 4 auf der 7-Segment-Anzeige soll die Idee verdeutlicht werden.
Über die achtstellige Binärzahl 01101100 wird eine Schablone mit einem Fenster von 1 Bit Breite gelegt (Abb. 4). Schiebt man diese Schablone von rechts nach links über die Ziffernfolge 01101100, dann sieht man jeweils nur ein Bit. Jede Position in der binären Darstellung entspricht einem bestimmten Segment in der Anzeige. Zum Beispiel entspricht Bit 1 dem Segment e, Bit 2 dem Segment d bei der benutzten Schaltung. Eine 1 bedeutet, dass LED Segment geht auf HIGH, während eine Null entsprechend das LED Segment auf LOW setzt.
Das Programm 7_Segment_Test1.ino
Wie arbeitet das Programm?
Die Variable fenster (das Schablonenfenster) wird auf die Position 1 gesetzt und das Array z mit den 10 Binärzahlen der jeweils anzusteuernden Segmente der 7-Segment-Anzeige gefüllt.
In der Methode setup() werden die I/O Pin 2 bis 9 auf OUTPUT gesetzt. Ob man das in einer Schleife macht, wie hier vorgestellt, oder einzeln, Schritt für Schritt, muss jeder selbst entscheiden.
Die Methode loop() enthält zwei ineinander geschachtelte Schleifen. Die äußere Schleife mit dem Laufparameter ziffer kümmert sich um die darzustellenden Ziffern von 0 bis 9, während die innere Schleife mit Laufparameter seg jedes der acht Segmente (inklusive des Punktes) einer Anzeige anspricht.
Die innere Schleife wird zuerst abgearbeitet, da ist ziffer in der äußeren Schleife 0 und fenster = 1.
Das Arrayelement z[0] wird mit fenster bitweise verglichen.
Da die Relation z[0] & fenster > 0 wahr ist, verzweigt das Programm zu
digitalWrite(seg, HIGH);
fenster = fenster << 1;
seg ist zu diesem Zeitpunkt 2, deshalb wird das Segment am I/O Port 2 des Arduino auf HIGH gesetzt. Anschließend wird die 1 der Binärzahl 00000001 um eine Position nach links verschoben; das ergibt 00000010 (das ist das verschiebbare 1-Bit breite Fenster der Schablone).
seg wird um eins erhöht und ist jetzt 3. Der bitweise Vergleich ergibt bei der Relation wieder ein WAHR und das Programm verzweigt erneut zu
digitalWrite(3, HIGH);
fenster = fenster << 1;
Auch das Segment am I/O Port 3 des Arduino wird auf HIGH gesetzt und die 1 in der Bitfolge von fenster wieder um eine Position nach links verschoben. Dieser Vorgang setzt sich so lange fort, bis die innere Schleife abgearbeitet ist und die Ziffer 0 auf dem Display erscheint - alle LED der Umrandung sind auf HIGH, nur das Segment g ist auf LOW.
Jetzt erhöht die äußere Schleife ihren Laufparameter um 1 und der eben beschriebene Vorgang wiederholt sich.
Der folgende Programmablaufplan für die Methode loop() zeigt an Hand der Belegungen der im Programm benutzten Variablen, wie sich deren Werte bei jedem Schleifendurchlauf verändern.
Die Schleifen werden nach dem hier vorgestellten Muster wiederholt durchlaufen und schalten die entsprechenden LED-Segmente ein bzw. aus.
Nachdem wir eine LED-Anzeige so weit gebracht haben, dass auf ihr die Ziffern von 0 bis 9 dargestellt werden können, werden im folgenden Projekt acht 7-Segment-Anzeigen betrachtet, auf denen die Uhrzeit oder die Minuten Sekunden und Millisekunden einer Zeitmessung angezeigt werden sollen.
Bei dem eingesetzten Modul handelt es sich um 2 Blöcke von je 4 LED Anzeigen, die über einen MAX7219 Baustein angesteuert werden. Im Internet kann man diesen Baustein für 2 - 3 Euro erwerben.
Die Ansteuerung einer 8-stelligen 7-Segment-Anzeige kann im Prinzip auf zwei verschiedene Arten vorgenommen werden:
Die zweite Möglichkeit setzt gute Programmierkenntnisse voraus, macht unabhängig von einer Bibliothek, die andere geschrieben haben und verschafft einem selbst einen guten Einblick in die Arbeitsweise des Bauteils.
Beginnen wir mit Option 1 und dem Arduino UNO. Dazu muss die Bibliotheksdatei
HCMAX7219 von Hobby Components aus dem Internet heruntergeladen werden.
Der Schaltungsaufbau gestaltet sich einfach und ist mit 5 Verbindungskabeln schnell erledigt.
Schaltskizze und Schaltungsaufbau
Das Programm
In diesem Programm wird zuerst ein Text "Bitte nicht stoeren!!!!" als Lauftext auf dem Display ausgegeben, gefolgt von einer Zeitdarstellung in Stunden, Minuten und Sekunden. Die Sekunden werden von 0 bis 59 hochgezählt. Das Anzeigeformat: hh mm ss
Die Bibliotheksdatei enthält ca. 15 Funktionen, von denen ich nur einige wenige anspreche, die im gezeigten Test-Programm benutzt werden.
Initialisiert die Bibliothek und sollte zu Beginn eines Programmes gestartet werden.
Schreibt einen Text in den Ausgabepuffer der Position Offset. Offset gleich 1 beginnt mit der Textausgabe bei Digit 1, Treiber 1.
Löscht den Inhalt des Ausgabepuffers. Anschließend wird die Bibliotheksfunktion refresh aufgerufen und alle LEDs abgeschaltet.
Aktualisiert alle verbundenen Driver mit dem Inhalt des Ausgabepuffers.
Eine vollständige Darstellung aller Funktionen findet man auf den Seiten von Hobby Components.
Ausblicke
Mit Hilfe der Funktionen aus der Bibliothek lassen sich verschiedene Aufgabenstellungen umsetzen:
--- ---
Der oben beschriebene zweite Ansatz über die Entwicklung eigener Funktionen, die den Treiberbaustein MAX7219 ansteuern und damit individuelle Programmlösungen zulassen, ist aufwändiger aber auch lehrreicher.
Der IC MAX7219 ist ein seriell anzusteuernder Display Treiber, der sich für die Aufgabe, acht 7-Segment-Anzeigen anzusteuern, hervorragend eignet. Voraussetzung ist bei diesem Baustein, dass die Anzeigeelemente eine gemeinsame Kathode haben. Die Leistungsmerkmale des MAX7219 in Kurzform:
Dem Datenblatt lassen sich die folgenden Informationen entnehmen
DIN Eingang für die seriellen Daten vom Controller. Erwartet werden 16-Bit Pakete.
CLK Takteingang, der vom Controller generiert wird. Steigende Flanken veranlassen das Einlesen von Daten in ein Schieberegister des MAX7219. Bei fallender Flanke werden die Daten an DOUT ausgegeben. Maximal zulässig ist eine Taktrate von 10 MHz.
LOAD Nach jedem 16-Bit Datenpaket, das der MAX7219 erhalten hat, wird ein kurzer negativer Impuls angelegt. Bei steigender Flanke werden die Daten in das vorher angesprochene Register geladen.
Datenformat
Die an DIN seriell eintreffenden 16-Bit Datenpakete werden mit jeder steigenden Flanke des Taktsignals (CLK) in ein internes 16-Bit Schiebregister abgelegt; unabhängig von den Ereignissen, die auf LOAD passieren.
Anschließend werden diese Daten mit steigender Signalflanke an LOAD(CS) in ein Kontroll- oder Digitregister (Digit 0, ..., Digit 7) geschrieben. Nach 16 CLK-Takten muss LOAD auf HIGH gehen.
Die im Schieberegister abgelegten Daten werden dann am Ausgangspin DOUT des MAX7219 mit der fallenden Flanke des Taktgebers ausgegeben.
Insgesamt gibt es 14 Register, die einzeln über ihre Adresse angesprochen werden.
Registeradressen
Wird nur bei Nutzung mehrerer MAX7219 (Kaskadierung) beschrieben.
Ein LOW in 0x0C setzt alle Anoden einer 7-Segment-Anzeige auf GND; die LEDs werden ausgeschaltet. Die Daten bleiben bei einem Shutdown erhalten. Eine 1 in 0x0C legt alle Anoden der 7-Segment Anzeige wieder auf die internen Steuerleitungen.
BCD-Code oder kein Code wählen.
Steuert über PWM die Helligkeit der 7-Segment-Anzeige; 0x00 (minimal) bis 0x0F (maximal).
Legt die Anzahl der Digits (wie viele 7-Segment-Anzeigen) fest. Möglich sind die Werte von 0x00 bis 0x07. Die Helligkeit nimmt mit der Zahl der Digits ab; die Abtastrate liegt bei 8 angeschlossenen Digits bei 800Hz.
Dient für einen Funktionstest der angeschlossenen Anzeigemodule.
Mit Hilfe der Daten und einem Blick auf das Zeitdiagramm des MAX7219 im Datenblatt kann jetzt mit dem Programmieren begonnen werden. Als Controllerboard wird diesmal ein Prop-BoE oder ein Prop-AB genommen und gezeigt, wie man sich seine eigenen Zugriffsfunktionen an Hand der Daten aus dem Datenblatt entwickeln kann.
Ansteuerung einer 8-stelligen 7-Segment-Anzeige mit dem Prop BoE | |
Material |
|
Aufgaben |
|
Schaltungsaufbau
Das Programm DisplayTest1.c
Wie arbeitet das Programm DisplayTest1.c?
Die Anschlüsse 9, 10 und 11 werden über die Textersetzung direkt nach den Anschlussbelegungen auf dem 8-stelligen 7-Segment-Anzeige-Board benannt.
In Zeile 10 erfolgt eine FORWARD-Deklaration einer Funktion an_MAX. Schauen wir uns zunächst diese Funktion genauer an.
Die Parameter der Funktion sind: p_out, p_clk, _bit und _data, alle vom Typ integer. p_out und p_clk beschreiben die I/O Ports, die mit DIN bzw. CLK des 8-stelligen Moduls verbunden sind und _bit gibt die Anzahl der zu übertragenden Bits an. _data steht für die an das Modul zu übertragenden Daten. Die Funktion setzt den I/O Port cs auf LOW und überträgt anschließend Daten an den 8-digit Anzeigemodul. Dabei wird das MSB zuerst übertragen. Nach Abschluss der Übertragung wird die Leitung cs sofort wieder auf HIGH gesetzt.
Im Hauptprogrammteil main() wird in Zeile 14 das Display Testregister (0x0F) für eine Sekunde in den Testbetrieb geschaltet und anschließend wieder auf Normalbetrieb zurückgesetzt.
In Zeile 18 wird im Decode Register die Einstellung so gewählt, dass alle Digits der Anzeige im BCD-Code arbeiten. Anschließend wird über das Intensity Register die Leuchtintensität der einzelnen Anzeigen auf geringste Intensität (00) gesetzt (Zeile 19).
Das Scan Limit Register beschränkt die Ausgabe auf das erste Anzeigenelement 0 (Zeile 20) und setzt anschließend über das Shutdown Register die Anzeige in den normalen Betrieb.
Die Endlosschleife (Zeilen 24 - 31) regelt die Ausgabe der Zahlen und Zeichen. Die Schleife wird 16-mal durchlaufen und an die erste 7-Segment-Anzeige (0x01) werden die Inhalte der Variablen i übergeben; das sind die Zahlen von 1 bis 16.
Nun lassen sich bekanntlich auf einer einstelligen Anzeige keine zweistelligen Zahlen, wie zum Beispiel 10, 11 oder 12 darstellen. Ein Blick in das Datenblatt des MAX7219 Bausteins (S. 8) verrät, dass die Zeichen -, E, H, L und P statt der Zahlen 10, 11, 12, 13 und 14 ausgegeben werden. Die Zahl 15 wird im Display als "blank", also Leerzeichen, dargestellt und bleibt für uns unsichtbar.
Jetzt kommst du!
Die Ansteuerung des MAX7219 über den Arduino UNO erfolgt ähnlich wie bei den Propeller Controllern, mit dem Unterschied, dass beim UNO diesmal der SPI-Bus benutzt wird, der mit vier Pin vorbelegt ist. Von dem Bus werden drei Leitungen benutzt: MOSI, SCK und SS, die im Programm über die Bibliotheksfunktionen aus dem Ordner SPI.h angesprochen werden.
Die Funktionen der Bibliothek SPI.h (ein Auszug)
Parameter
val enthält den Wert, der über den Bus an den Baustein übertragen wird.
legt fest, ob die auf den Bus gelegten Bits beginnend mit dem MSBFIRST (most significant bit) oder LSBFIRST (least significant bit) übertragen werden sollen.
Parameter
order LSBFIRST oder MSBFIRST
Initialisiert den SPI Bus, indem die I/O Pin SCK, MOSI und SS als OUTPUT gesetzt werden. SCK und MOSI werden auf LOW und SS auf HIGH gezogen.
MOSI: Master Out Slave In; die Masterverbindung, über die Daten an die Slaves übertragen werden.
SCK: Serial Clock
SS: Slave Select - der Pin, über den der Master ein Bauteil ein- bzw. ausschalten kann. HIGH bedeutet, kein Kontakt mit Master; LOW bedeutet, Kommunikation mit dem Master.
Auf dem Arduino UNO Board sind folgende I/O Pin als SPI Ports vorbelegt:
MOSI: Pin 11
SCK: Pin 13
SS: Pin 10
Beendet den SPI Bus.
Testschaltung mit MAX7219 - 8-stelliger 7-Segment-Anzeige und Arduino UNO | |
Aufgaben |
|
Das Programm DisplayTest1_Arduino.ino
In Abschnitt 7 wurde bereits auf die verschiedenen Register und wie sie anzusprechen sind eingegangen. Die Programme Prop-C und Arduino-C ähneln sich sehr stark, obwohl beim Arduino auf den SPI-Bus und die damit verbundenen Befehle zugegriffen wurde. Eine erneute Besprechung für dieses Programm entfällt.