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

16 LEDs über den I2C-Bus ansteuern

Grundlage für die hier vorgestellte Schaltung ist der I2C-LED-Treiberbaustein TLC59116 von Texas Instruments. Über ihn lassen sich 16 LEDs einzeln ansteuern und in ihrer Helligkeit in 256 Schritten individuell einstellen. Über drei Untergruppenansteuerungen lassen sich auch Teile der insgesamt 16 LEDs regeln; ideal, um zum Beispiel kleine Lichtskulpturen zu entwerfen.

Die Fa. ELV hat einen Modulbausatz herausgebracht, auf dem der TLC59116 verbaut ist. Auf der Platine sind die Anschlüsse für 16 LEDs bereits vorgesehen, so dass man dieses Modul sehr gut als Einführungsprojekt für den I2C-Bus unterrichtlich oder privat nutzen kann. Die 16 LEDs müssen aber noch auf der Platine eingelötet werden.

In einer ersten Übung wird die Ansteuerung mit Hilfe eines USB-I2C-Adapters erprobt. In Übung 2 wird unter BASCOM ein ATMega8A programmiert, der verschiedene Lauflichtmuster erzeugt und in den Übungen 3 und 4 wird die Ansteuerung mit einem Arduino UNO und einem RasPi gezeigt. Vorausgesetzt wird, dass die Kapitel I2C besser verstehen 1 - 3 durchgearbeitet wurden.

Übung 1 -- Beschaltung und Ansteuerung von 16 LEDs

Übung 1 - Beschaltung und Ansteuerung von 16 LEDs
Material
  • 1x  I2C-Bus-LED-Treiber (Fa. ELV)
  • 1x  USB-I2C Adapter
  • 1x  USB-Kabel
  • 4x  Steckkabel
  • 1x  PC oder Laptop mit Programm CoolTerm
  • Datenblatt: TLC59116
Aufgaben
  • Verbinde den I2C-Bus-LED-Treiber mit dem USB-I2C-Adapter.
  • Verbinde den USB-I2C-Adapter mit dem PC und starte dort das Programm CoolTerm.
  • Stelle die Baudrate auf 115200 und wähle anschließend das Icon Connect.

Schaltungsaufbau

Abbildung 1 - I2C-Bus-LED-Treiber mit einem TLC59116 Baustein. Die Verbindungskabel sind direkt verbunden mit einem I2C-USB-Adapter.

Bevor es an die Programmierung des Moduls geht, wird ein Zugang zur Ansteuerung der 16 LEDs mit Hilfe des USB-I2C-Adapter Moduls gesucht. Vorher wird - wie immer bei einem neuen IC - das Datenblatt des TLC59116 studiert und es müssen einige Fragen beantwortet werden.

Das Datenblatt des TLC59116 gibt Auskunft
Fragen/ Aufträge
  • Gib die Betriebsspannung des TLC59116 an.
  • Gib die Hardwareadresse des Treiberbausteins an und gib an, wie viele verschiedene Adressen sich einstellen lassen.
  • Wie ist die Slaveadresse aufgebaut und wie lautet sie für den benutzten Baustein im Schreibmodus?
  • Gib die Anzahl der Register des I2C-LED Treibers TLC59116 an.
  • Welche Grundeinstellungen müssen über das Controllregister in welchen Registern vorgenommen werden, bevor mit der Ansteuerung der LEDs begonnen werden kann?
  • Benenne die Ausgaberegister für die LED Ansteuerung.
  • Bei den Anwendungs-Informationen wird im Datenblatt beschrieben, wie sich Daten in ein Register hineinschreiben oder aus ihm herauslesen lassen. Finde heraus, wie man mit dem Autoinkrement-Flag Daten in das Register Mode1 schreiben kann.

Lösungen

  • Die Betriebsspannung des TLC59116 wird vom Hersteller mit 3,3V - 5V angegeben.
  • Die Hardwareadresse des Treiberbausteins lautet bei vier offenen Jumpern (A0 ... A3) auf dem I2C-Bus-LED-Treiber Baustein: 0000.
  • Die Slaveadresse ergibt sich dann zu: 0xC0.
Abbildung 2 - Aufbau der I2C-Slaveadresse des TLC59116 für den Modus Write.
  • Die Anzahl der Register liegt bei 31: 0x00 - 0x1E.
  • Von den beiden vorhandenen Mode-Registern muss Register Mode1 in jedem Fall mit Bit4 = 0 gesetzt werden (S. 16, Datenblatt).
  • Die Ausgaberegister lauten: LEDOUT0 ... LEDOUT3. Dabei gilt:

    LEDOUT0[1:0] -> LED1

    LEDOUT0[3:2] -> LED2

    LEDOUT0[5:4] -> LED3

    LEDOUT0[7:6] -> LED4

    (die Bezeichnung LEDx orientiert sich am Aufdruck der Platine).  Jede LED lässt sich mit 2 Bit individuell ansteuern. Dabei bedeutet 00 (LED aus), 01 (LED an), 10 (LED dimmen), 11 (LED-Gruppen dimmen/blinken). Der Aufbau und die Wirkungsweise für LEDOUTx sind identisch. Mit Hilfe der vier Register werden insgesamt 16 LEDs angesprochen.

  • Um Daten in das Register Mode1 zu schreiben, muss wie folgt vorgegangen werden:

    SC0 aktiviert den I2C-Bus (S) und ruft die eingestellte Slaveadresse (hier: C0) des LED-Treiberbausteins auf. Das nachfolgende Controll-Register legt über XXX das Autoinkrement für das mit [D4:D0] beschriebene Register fest und ist wie folgt aufgebaut:

Abbildung 3 - Das Autoinkrement-Flag X[7] ist nicht gesetzt und das Register Mode1 über seine Adresse 0_0000 angesprochen.

Bit7: Bit5 (XXX) beschreiben die Autoinkrementfunktionen. Dabei gelten folgende Optionen:

Bitfolge Wirkung
000 kein Autoinkrement
100 Autoinkrement über alle Register. D[4:0] geht von 0_0010 (0x02) bis 1_1011 (0x1C).
101 Autoinkrement über die Registeradressen zur individuellen Helligkeitseinstellung. D[4:0] geht von 0_0010 (0x02) bis 1_0001 (0x11).
110

Autoinkrement nur über die globalen Register. D[4:0] geht von 1_0010 (0x12) bis 1_0011 (0x13).

111 Autoinkrement über alle individuellen und globalen Controlregister. D[4:0] geht von 0_0010 (0x02) bis 1_0011 (0x13).

Im nachfolgenden Datenbyte werden die Einstellungen im Register Mode1 (0x00) vorgenommen; ihre Bedeutung im Einzelnen kann im Datenblatt S. 16ff nachgeschlagen werden.

In der zweiten Befehlszeile werden die LEDs einzeln ein- bzw. ausgeschaltet. Dazu wird wiederum das Autoinkremenflag im Controlregister gesetzt und das Ausgaberegister für die ersten LEDs (0x14) aufgerufen [D4:D0].

In den nachfolgenden vier Bytes ist festgelegt, welche LED ein- und welche ausgeschaltet wird. Ein Byte steuert jeweils vier LEDs mit jeweils 2 Bit (siehe Datenblatt).

Damit sind nun alle Fragen beantwortet und die Schaltung kann angeschlossen und erprobt werden.

Aufgabe

  • Gib die in Abb. 3 dargestellte Befehlssequenz in CoolTerm ein. Öffne dazu im Hauptmenü über Connection - Send String das Fenster "Send String" und gib dort die beiden Befehlszeilen ein. Die Kommentarzeilen in eckigen Klammern müssen nicht mit eingegeben werden.
  • Starte die Übertragung mit Send und beobachte, ob LED3 und LED7 auf dem Modulboard leuchten.
  • Leuchten die LEDs nicht, rufe über das Hauptmenü von CoolTerm Options - Serial Port Options auf und drücke die Taste Re-Scan Serial Ports.
  • Überprüfe, ob die Baudrate auf 115200 eingestellt ist.
Abbildung 4 - Ansteuerung der 3. und 7. LED

Die Befehlseingabe unter CoolTerm

Abbildung 5 - Befehlssequenzen unter CoolTerm im Fenster "Send String". Text in eckigen Klammern sind Kommentarzeilen.

Aufgaben zur Vertiefung

  • Programmiere den LED-Treiber so, dass er jede zweite LED, beginnend mit LED1, einschaltet und die anderen ausgeschaltet lässt.
  • Programmiere den LED-Treiber so, dass er jede vierte LED, beginnend mit LED1, einschaltet und die anderen ausgeschaltet lässt.

Übung 2 -- Ansteuerung eines TLC59112 unter BASCOM

In den nachfolgenden beiden Übungen wird ein bestimmtes Lichtmuster mit den 16 LEDs erzeugt. Dazu werden die Ergebnisse aus Übung 1 genutzt. In dieser Übung geht es darum, LED1 auf dem Modulboard einzuschalten.

Damit das funktioniert, müssen die Jumper 2 und 3 auf dem Modulboard gebrückt werden. Die Pull-up Widerstände für den I2C-Bus sind dann aktiviert. Wie das aussieht zeigt Abb. 6. Wird das nicht gemacht, funktioniert der I2C-Bus nicht, da sich die Spannungspegel nicht aufbauen können.

Ansteuerung eines TLC59112 unter BASCOM
Material
  • 1x  USB-ISP-Programmer
  • 1x  Nullkraftsockel für Programmer
  • 1x  AVR Mikrocontroller - ATmega8A
  • 1x  Energiequelle, 5V
  • 1x  I2C-Bus-LED-Treiber-Modul
  • 1x  Steckbrett
  • 1x  USB-Kabel
  • diverse Steckkabel
  • 1x  PC oder Laptop
  • 1x  Software BASCOM
  • Datenblatt TLC59116 aus dem Internet
Aufgaben
  • Trenne alle Kabelverbindungen zwischen Steckbrett und PC.
  • Baue die Schaltung nach Schaltskizze bzw. Verdrahtungsplan auf dem Steckbrett auf.
  • Starte das Programm BASCOM und übertrage das Programm TLC59116_LED1.bas in den Editor.
  • Speichere das Programm ab, überprüfe es auf Syntaxfehler und korrigiere diese gegebenenfalls.
  • Compiliere das Programm und brenne es anschließend in den ATmega8A.
  • Trenne die Kabelverbindung zum Programmer und entnimm den ATmega8A.
  • Setze den Controller in die aufgebaute Schaltung ein und lege die Spannungsversorgung an.
  • Überprüfe, ob LED1 auf dem Modulboard leuchtet.

Schaltungsaufbau

Abbildung 6 - Verbindung des LED-Modulboards mit einem ATMega8A im Nullkraftsockel. Die Spannungsversorgung erfolgt über ein Netzteil, 5Volt.

Das Programm TLC59116_LED1.bas

Wie arbeitet das Programm TLC59116_LED1.bas?

Für den I2C-Busaufbau werden PortC.5 (SCL) und PortC.4 (SDA) benutzt. Die 8-Bit Slaveadresse ist bei offenen Jumpern [A3:A0] 0xC0.

In einer ersten Befehlssequenz (Programmzeilen 26 - 30) werden im Register Mode1 Bits gesetzt (siehe Datenblatt) und in einer zweiten Sequenz (Programmzeilen 31 - 38) die Ausgaberegister für die LEDs (LEDOUT0 - LEDOUT3) gesetzt. Als Ergebnis dieser Setzung leuchtet LED1 auf dem Modulboard auf.

Das Zeitdiagramm

Das Zeitdiagramm zur ersten Befehlssequenz zeigt Abb. 7 und ist selbsterklärend. Es wurde mit einem Picoscope Serie 2000 aufgenommen.

Abbildung 7 - Zeitdiagramm der Befehlssequenz SC0 80 00 P aus dem Programm TLC59116_LED1.bas

Die zweite Befehlssequenz besteht aus insgesamt 6 Byteblöcken.

Abbildung 8 - Zeitdiagramm der Befehlssequenz SC0 94 01 00 00 00 P aus dem Programm TLC59116_LED1.bas.

Übung 3 -- Aufbau eines Lichtmusters

Nachdem der LED-Treiber TLC59116 mit BASCOM zum Laufen gebracht wurde, kommt jetzt eine etwas komplexere Aufgabe. In der folgenden Übung wird ein Lichtmuster mit 16 LEDs erzeugt. Dazu werden die Ergebnisse aus den vorherigen beiden Übungen genutzt. Der Versuchsaufbau aus Übung 2 bleibt bestehen.

Es wird bei dieser Übung immer nur eine LED aufleuchten, da sonst die elektrische Versorgungsspannung des Moduls erhöht werden müsste. Das Programm TLC59116_Lichtmuster.bas kann nur verstanden werden, wenn man sich dazu auch das Datenblatt des TLC59116 anschaut.

Lichtmuster mit 16 LEDs und einem TLC59112
Material
  • 1x  USB-ISP-Programmer
  • 1x  Nullkraftsockel für Programmer
  • 1x  AVR Mikrocontroller - ATmega8A
  • 1x  Energiequelle, 5V
  • 1x  I2C-Bus-LED-Treiber-Modul
  • 1x  Steckbrett
  • 1x  USB-Kabel
  • diverse Steckkabel
  • 1x  PC oder Laptop
  • 1x  Software BASCOM
  • Datenblatt TLC59116 aus dem Internet
Aufgaben
  • Übernimm den Schaltungsaufbau aus Übung 2.
  • Starte das Programm BASCOM und übertrage das Programm TLC59116_Lichtmuster.bas in den Editor.
  • Speichere das Programm ab, überprüfe es auf Syntaxfehler und korrigiere diese gegebenenfalls.
  • Compiliere das Programm und brenne es anschließend in den ATmega8A.
  • Trenne die Kabelverbindung zum Programmer und entnimm den ATmega8A.
  • Setze den Controller in die aufgebaute Schaltung ein und lege die Spannungsversorgung an.
  • Beschreibe das Lichtmuster der 16 LEDs und versuche dir anhand jeder Programmzeile klar zu machen, wie der Prozessor bzw. der LED-Treiber darauf reagiert. Überprüfe deine Vorhersage mit der Anzeige der LEDs.

Das Programm TLC59116_Lichtmuster.bas

Wie arbeitet das Programm TLC59116_Lichtmuster.bas?

Programmzeilen 19-24

Die beiden I2C-Ports für die SCL- und SDA-Leitung werden festgelegt. In diesem Fall C.5 (SCL) und C.4 (SDA). Zur besseren Programmlesbarkeit werden das Controlregister (R_ctrl) und die Bitsetzung für die beiden Mode-Register (R_mode1, R_mode2) mit "sprechenden" Namen versehen. Das Controlregister (Abb. 3) setzt sich aus der Inkrementeinstellung [X7:X5] und der Registeradresse [D4:D0] zusammen. Das Autoinkrement-Flag (MSB) ist auf 1 gesetzt und das anzusprechende erste Register ist das Register Mode1 (0x00).

 

Programmzeilen 26-28

Die im Hauptprogramm benutzten Variablen werden hier definiert und ein Anfangswert festgelegt. Die Variable Block adressiert das Register OUTLED0, das im Datenblatt mit der Adresse 0x14, dezimal 20 oder &B0001_0100 angegeben ist. Der Aufruf von OUTLED0 erfolgt wieder über das Controlregister, bei dem die höchstwertigen drei Bits für die Inkrementeinstellung stehen. Mit gesetztem Inkrementflag ergibt sich so die Adresse 148 (dez.) oder 0x94.

 

Programmzeilen 31-36

Eingebettet in eine Endlosschleife (DO ... LOOP) wird in einem ersten Abschnitt nach dem Absetzen eines Startsignals durch den Master, der LED-Treiberbaustein adressiert (Zeile 32) und über das Controlregister die Einstellungen in den Registern Mode1 und Mode2 vorgenommen. Abgeschlossen wird diese Maßnahme mit einem Stoppsignal.

 

Programmzeilen 38-56

Nach dem Startsignal und dem Aufruf der I2C-Adresse des Slave (LED-Treiberbaustein) wird über das Controlregister das Register OUTLED0 mit gesetztem Inkrementflag aufgerufen. Die nachfolgenden vier Schreibbefehle (Zeilen 41-44) schalten LED01 auf dem Modulboard an; es folgt ein Stoppbefehl und eine Warteschleife von 250 ms.

In Programmzeile 47 werden die Bits einer Binärzahl um 2 Bit nach links verschoben. Aus bisher:

  • 0b0000_0001 (I = 1)

wird neu:

  • 0b0000_0100 (I = 4) 1. Verschiebung

Die Variable Block ändert ihren Wert 148 nicht, da die Entscheidungsabfragen nicht erfüllt sind. Das Programm verbleibt in der Schleife und springt zurück zu Programmzeile 31. Die Variable I hat jetzt den Wert 4, LED01 geht aus und LED02 an.

Nach drei Schleifendurchläufen und drei Bitverschiebungen wird die Variable Block um eins erhöht und das Ausgaberegister OUTLED1 in der gleichen Art angesprochen, wie es bereits für OUTLED0 beschrieben wurde. Das wiederholt sich noch zwei mal, bis OUTLED3 angesprochen und die vier LEDs einzeln nacheinander zum Leuchten gebracht wurden.

Abbildung 9 - Momentaufnahme zum Programm "Lichtmuster".

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf