Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Ü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.

1 - Aufbau einer Zählerschaltung

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
  • 1x  Steckbrett
  • 1x  Arduino UNO Board
  • 1x  7-Segment Anzeige (hier TDSL 5160)
  • 8x  Widerstand, 470 Ohm
  • 1x  Steckernetzteil
Aufgaben
  • Baue die Schaltung nach Schaltskizze auf einem Steckbrett auf.
  • Informiere dich anhand des Datenblattes zu der 7-Segment-Anzeige über die Leistungsdaten des Bausteins.
  • Entnehme dem Datenblatt die Anschlussbelegung der Pin und trage sie zusammen mit den Segmentbezeichnern in eine Tabelle ein.
  • Übertrage das Programm 7_Segment_Test1.ino in den Editor und speichere es ab.
  • Starte das Programm.
  • Überprüfe, ob die Zahlen von 0 bis 9 auf der 7-Segment-Anzeige dargestellt werden.

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.

Abbildung 2 - Datentabelle zur 7-Segmentanzeige TDSL5160

Meine Daten zur 7-Segment-Anzeige (dem Datenblatt entnommen)

Trage in die unten stehende Tabelle die Daten zu deiner 7-Segment-Anzeige ein.

2 - Zifferndarstellung und Arrays

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.

Abbildung 3 - Zuordnungstabelle für die 7 Segmente einer Ziffer

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.

 

 

 

 

 

 

 

 

 

 

Abbildung 4 - Schablone mit einem 1-Bit Fenster über dem Binärcode für die Darstellung der Zahl 4 auf der 7-Segment Anzeige. Die Binärfolge 01101100 entspricht der Zuordnungstabelle (Abb. 3) für die 7-Segment-Anzeige

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.

  • if ((z[0] & fenster) > 0)

Das Arrayelement z[0] wird mit fenster bitweise verglichen.

  • 0 0 1 1 1 1 1 1
  • 0 0 0 0 0 0 0 1
  • -----------------
  • 0 0 0 0 0 0 0 1 ist größer 0

 

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.

3 - Programmablaufplan

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.

Abbildung 5 - Programmablaufplan; rot markiert ist das 1 Bit breite Schablonenfenster, in dem die rot unterlegte Zahl mit der jeweils binären Zahldarstellung der Variablen fenster verglichen wird.

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.

4 - LED-Anzeige mit acht Stellen

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.

Abbildung 6 - 8-stellige 7-Segment-Anzeige mit integriertem MAX7219 Treiber

Die Ansteuerung einer 8-stelligen 7-Segment-Anzeige kann im Prinzip auf zwei verschiedene Arten vorgenommen werden:

  1. über die Nutzung einer Bibliotheksdatei, die alle wesentlichen Funktionen zur Ansteuerung des Moduls enthält. Der Schwerpunkt liegt dabei auf der Dokumentation zur Bibliotheksdatei  und wie man die Funktionen in sein eigenes Programm einbaut.
  2. über die Entwicklung eigener Funktionen, die die Ansteuerung des LED Display Treiberbausteins MAX7219 regeln. Der Schwerpunkt in dieser Übung liegt auf dem Studium des Datenblattes des MAX7219 Treiberbausteins und dem Aufbau eines Workflow für die Erstellung eines eigenen Programms.

 

 

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

Abbildung 7 - Schaltskizze mit 8-stelliger 7-Segment-Anzeige für den Arduino UNO
Abbildung 8 - Schaltungsaufbau mit Arduino UNO und 8-stelliger 7-Segment-Anzeige

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

Abbildung 9 - Programm zur Programmbibliothek HCMAX7219 von Hobby Components

5 - Die Bibliotheksdatei HCMAX7219

Die Bibliotheksdatei enthält ca. 15 Funktionen, von denen ich nur einige wenige anspreche, die im gezeigten Test-Programm benutzt werden.

  • HCMAX7219.Init()

Initialisiert die Bibliothek und sollte zu Beginn eines Programmes gestartet werden.

  • HCMAX7219.print7Seg("Text String", Offset)

Schreibt einen Text in den Ausgabepuffer der Position Offset. Offset gleich 1 beginnt mit der Textausgabe bei Digit 1, Treiber 1.

  • HCMAX7219.Clear()

Löscht den Inhalt des Ausgabepuffers. Anschließend wird die Bibliotheksfunktion refresh aufgerufen und alle LEDs abgeschaltet.

  • HCMAX7219.Refresh()

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:

  • Zeitmesser bauen.
  • Uhr mit Zeitangabe in HH MM SS entwickeln.
  • Zeitmesser mit gekoppelter Lichtschranke für Physikexperimente entwickeln.

---  ---

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.

6 - Ansteuerung des MAX7219

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:

  • verfügt über ein 8x8 statisches RAM
  • belegt nur 3 I/O Pin des Controllers (DIN, LOAD, CLK)
  • ermöglicht Helligkeitskontrolle über ein Kontrollregister
  • hat einen Funktionstest-Modus, der alle 7 Segmente eines Anzeigemoduls einschaltet
  • verfügt über einen internen Multiplexer
  • kann bis zu acht 7-Segment-Anzeigen oder 64 LEDs ansteuern
  • steuert die einzelnen 7-Segment Bausteine im Multiplexbetrieb mit ca. 800Hz an.

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

Abbildung 10 - Alle 14 Registeradressen des MAX 7219
  • No-Op (0x00)

Wird nur bei Nutzung mehrerer MAX7219 (Kaskadierung) beschrieben.

  • Shutdown (0x0C)

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.

  • Decode Mode (0x09)

BCD-Code oder kein Code wählen.

Abbildung 11 - Decode Mode Register mit den vier möglichen Einstellungen
  • Intensity Register (0x0A)

Steuert über PWM die Helligkeit der 7-Segment-Anzeige; 0x00 (minimal) bis 0x0F (maximal).

 

  • Scan Limit Register (0x0B)

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.

 

  • Display Test Register (0x0F)

Dient für einen Funktionstest der angeschlossenen Anzeigemodule.

7 - Propeller Board und MAX7219

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
  • 1x  Prop-BoE  oder Prop-AB mit USB-Verbindungskabel
  • 1x  Steckernetzteil
  • 1x  8-stellige 7-Segment-Anzeige
  • 5x  Steckdraht (female - male)
Aufgaben
  • Baue die Schaltung wie in der folgenden Abbildung auf.
  • Übertrage das Programm DisplayTest1.c in den Editor und speichere es ab.
  • Bevor du das Programm startest, überlege, wie das Programm arbeitet und mache dir Notizen.
  • Starte das Programm und beobachte die Ausgabe auf dem Display. Werden zu Beginn alle Anzeigen eingeschaltet (ca. 1s) und anschließend wieder aus? Werden anschließend nur in der ersten Anzeige die Zahlen von 0 bis 9 und die Zeichen -, E, H, L, und P angezeigt?

Schaltungsaufbau

Abbildung 12 - Schaltungsaufbau mit 8-stelliger 7-Segment-Anzeige für Prop-BoE, Prop-AB und BASIC Stamp

Das Programm DisplayTest1.c

Abbildungs 13 - DisplayTest1.c Programm

Wie arbeitet das Programm DisplayTest1.c?

  • Zeilen 4 - 6

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.

  • Zeilen 34 - 40

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.

  • Zeilen 12 - 32

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!

  • Wandle das Programm DisplayTest1.c so ab, dass die Zahlen von 0 bis 7 von rechts nach links in den acht 7-Segment-Anzeigen stehen (Abb. 8).
  • Wandle das Programm DisplayTest1.c so ab, dass die Zahlen von 0 bis 7 von links nach rechts in den acht 7-Segment-Anzeigen stehen (Abb. 8).
  • Wie man auf dem 8-stelligen Display sieht, werden die alten Zeichen nicht gelöscht, wenn im weiteren Verlauf nur mit ein oder zwei Displays weiter gearbeitet wird. Füge in das Programm eine Programmzeile ein, die bei jedem Start alle Anzeigenelemente löscht (mit einem Leerzeichen füllt).

8 - Arduino und MAX7219

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)

 

  • spi.transfer(val)

Parameter

val  enthält den Wert, der über den Bus an den Baustein übertragen wird.

 

  • spi.setBitOrder(order)

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

 

  • spi.begin()

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

 

  • spi.end()

Beendet den SPI Bus.

Testschaltung mit MAX7219 - 8-stelliger 7-Segment-Anzeige und Arduino UNO
Aufgaben
  • Übertrage das Programm DisplayTest1_Arduino.ino in den Editor und speichere es ab.
  • Schließe die 8-stellige 7-Segment LED Anzeige nach Abb. 7, 8 an das Arduino Board an.
  • Starte das Programm und überprüfe, ob
    -  alle 8 Anzeigen eingeschaltet werden und für ca. 1 Sekunde in diesem Zustand verbleiben.
    -  alle 8 Anzeigen anschließend aus gehen.
    -  die 1. Anzeige die Zahlen von 0 bis 9 und weitere Zeichen zeigt.

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.

Druckversion | Sitemap
© Reinhard Rahner - Gettorf