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 | |
Material |
|
Aufgaben |
|
Schaltungsaufbau
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 |
|
Lösungen
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.
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:
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
Die Befehlseingabe unter CoolTerm
Aufgaben zur Vertiefung
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 |
|
Aufgaben |
|
Schaltungsaufbau
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.
Die zweite Befehlssequenz besteht aus insgesamt 6 Byteblöcken.
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 |
|
Aufgaben |
|
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:
wird neu:
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.