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

I2C Bus besser verstehen (3)

Für die folgenden Versuche kommt ein neues Modul zum Einsatz, auf dem sich vier 7-Segment-Anzeigen, ein Temperaturmodul und vier Taster befinden. In einem ersten Schritt wird die Anzeige über den I2C-USB-Adapter und das Programm CoolTerm vom Computer aus angesteuert und später für den ebenfalls auf dem Board befindlichen Temperatursensor genutzt.

In einer weiteren Übung wird gezeigt, wie sich das Board auch als Arduino Shield mit dem Arduino UNO einsetzen lässt.

Die I2C-7-Segmentanzeige

Das hier vorgestellte Modul gibt es bei der Fa. ELV als Bausatz zu kaufen. Das Löten der Komponenten auf der sehr gut gearbeiteten Platine geht problemlos. Ein wenig Löterfahrung sollte man aber schon mitbringen. Die mitgelieferte Bau- und Bedienungsanleitung informiert umfassend. Mitgeliefert werden auch 6- und 8-polige Buchsenleisten, so dass sich bei Bedarf dieses Board auch als Arduino Shield einsetzen lässt. Auf dem Board integriert und seitlich etwas herausgeführt ist ein Temperatursensor MCP9801, 4 Drucktaster und ein Reset-Button. Die Verbindung zur Außenwelt wird über eine 2x6-polige Stiftleiste links von den 7-Segment-Anzeigen hergestellt.

 

 

 

 

 

 

Abbildung 1

I2C-7-Segment-Anzeige mit vier Tastern und einem Temperatursensor MCP9801. Das Modul kann auch als Arduino Shield verwendet werden.

 

 

 

 

 

 

Abbildung 2

Blick auf die Unterseite des 7-Segment-Moduls. Gut zu sehen sind die vier Brücken, mit denen sich die I2C-Adresse einstellen lässt.

Versuch 1 - Ansteuern einer I2C-7-Segment-Anzeige

Versuch 1

Material

  • 1x  I2C-7-Segment-Anzeige
  • 1x  USB-I2C Adapter
  • 1x  USB-Kabel
  • diverse Steckkabel
  • 1x  PC oder Laptop mit Programm CoolTerm
  • Datenblatt vom IC SAA1064T

 

Aufgaben

  • Verbinde das I2C-7-Segment-Anzeigemodul mit dem USB-I2C-Adapter.
  • Verbinde den USB-I2C-Adapter mit dem PC und starte dort das Programm CoolTerm.
  • Stelle die Baudrate auf 115200 ein und wähle anschließend in der Iconzeile Connect.
  • Gib im Terminalfenster ein Fragezeichen (?) ein und warte auf die Rückmeldung des Rechners.

 

Wenn alle Verbindungen richtig gesetzt, die Baudrate korrekt eingestellt und auch sonst keine Fehler vorhanden sind, erscheint im Terminalfenster ein Text, der ähnlich dem in Abb. 3 dargestellten aussieht. Erst wenn die Verbindung hergestellt ist, kann der Kontakt über den I2C-Bus mit den einzelnen Elementen hergestellt werden. Gestartet wird mit der Ansteuerung der vier 7-Segment-Anzeigen. Informationen liefert das Datenblatt des IC SAA1064.

Abbildung 3 - Informationen des USB-I2C-Interface im Terminalfenster nach Eingabe von "?".

Erweiterte Aufgabenstellung

  • Stelle auf dem Display die Zahlenfolge 1 ... 4 dar.
  • Stelle auf dem Display die Zahlenfolge 9 ... 6 dar; die Helligkeit der Anzeigenelemente sollte etwas stärker sein als im vorherigen Versuch.

Aus dem vorherigen Kapitel 2 - I2C bessser verstehen - wissen wir, wie man über die Eingabe von Befehlssequenzen über ein Terminalfenster ein I2C-Modul anspricht. Dieses Wissen wird auf das neue 7-Segment-Modul angewendet. Zusätzlich werden Informationen aus dem Datenblatt über das Verhalten des 4-Digit-LED Treiberbausteins SAA1064 eingeholt.

Dem Datenblatt sind zu entnehmen (S. 336ff):

 

Slave Adresse

Abbildung 4 - Format einer Slaveaddress nach dem Datenblatt des IC SAA1064

Das Format einer Slave-Adresse im Modus Write ist nach dem in Abb. 4 gezeigten Schema aufgebaut (obere Zeile). Das höherwertige Nibble (0111) ist werksseitig vorgegeben, das niederwertige Nibbel richtet sich nach der auf der Platine eingestellten Situation. Werksseitig sind A1 und A0 auf 0 eingestellt, deshalb lautet die Slave-Adresse 0x70.

Eingeleitet wird die Befehlseingabe mit einer Startsequenz S; abgeschlossen wird das Byte mit einem ACK-Bit 0.

Instructionbyte

 

Abbildung 5 - Format eines Instructionbytes

Über das Instructionbyte wird zunächst das Controlregister angesprochen. Nach dem Datenblatt muss dazu die Subadresse 00 eingegeben werden. Für die drei Bits SC, SB und SA gibt es folgende Zuordnungen:

SC SB SA Subadresse Funktion
0 0 0 00 Controlregister
0 0 1 01 Digit 1
0 1 0 02

Digit 2

0 1 1 03 Digit 3
1 0 0 04 Digit 4
1 0 1 05 reserviert
1 1 0 06 reserviert
1 1 1 07 reserviert

Über das nachfolgende Controlbyte werden anschließend der Anzeigemodus und die Helligkeit der 7-Segment-Anzeigen eingestellt.              

Controlbyte

 

Abbildung 6 - Format des Controlbyte. Das MSB ist beliebig wählbar.

Die Bedeutung der einzelnen Bits sind in der nachfolgenden Tabelle dargestellt bzw. lassen sich dem Datenblatt des ICs entnehmen. Das MSB, das in der Tabelle mit X gekennzeichnet ist, kann beliebig gesetzt werden; ich setze das MSB hier auf 0.

X C6 C5 C4 C3 C2 C1 C0 Funktion
0 1/0 1/0 1/0         steuert die Helligkeit
0       1/0      

1: alle Segmente an; Test

0: alle Segmente aus

0         1/0    

1: Segmente 2+4 an

0: Segmente 2+4 aus

0           1/0  

1: Segmente 1+3 an

0: Segmente 1+3 aus

0             1/0

0: static mode

    Digit 1+2 an

1: dynamic mode

    nacheinander werden 1+3

    und 2+4 eingeschaltet

Nach Eingabe der Grundeinstellungen im Controlregister, werden mit einer zweiten Befehlssequenz die Ziffern an die 7-Segmentanzeigen übergeben und sichtbar gemacht. Es sollen im folgenden Beispiel die Ziffern/Zeichen  315A sein.

Dazu wird erneut das Slaveaddress- und das Instructions-Byte aufgerufen und anschließend die gewünschten Ziffern eingegeben. In diesem Fall: 315A. Bei einer 7-Segment-Anzeige müssen dazu die folgenden LED-Segmente eingeschaltet oder auf HIGH gelegt werden:

3  A, B, C, D, G

1  A, B

5  A, C, D, F, G

A A, B, C, E, F, G

Jedes Zeichen auf einem 7-Segment-Display wird in ein Register geladen. Für jedes Display steht ein eigenen Dataregister zur Verfügung. Die Codierung für die Ziffernfolge 315A zeigt die folgende Tabelle.

Ziffer/Zeichen DP G F E D C B A Hexadezimalzahl
3 0 1 0 0 1 1 1 1 4F
1 0 0 0 0 0 1 1 0 03
5 0 1 1 0 1 1 0 1 6D
A 0 1 1 1 0 1 1 1 77

Gibt man diese Werte in das Terminalfenster von CoolTerm ein und drückt auf den Button SEND, erscheinen die vier Zeichen auf dem Display.

Versuch 2 - Der Temperatursensor MCP9801

Versuch 2

Material

  • 1x  I2C-7-Segment-Anzeige
  • 1x  USB-I2C Adapter
  • 1x  USB-Kabel
  • diverse Steckkabel
  • 1x  PC oder Laptop mit Programm CoolTerm
  • Datenblatt vom IC SAA1064T und vom IC MCP9801.

 

Aufgaben

  • Verbinde das I2C-7-Segment-Anzeigemodul mit dem USB-I2C-Adapter.
  • Verbinde den USB-I2C-Adapter mit dem PC und starte dort das Programm CoolTerm.
  • Stelle die Baudrate auf 115200 ein und wähle anschließend das Icon Connect.
  • Gib im Terminalfenster ein Fragezeichen (?) ein und warte auf die Rückmeldung des Rechners.
  • Gib die nachfolgend beschriebenen Befehlssequenzen im Terminalfenster von CoolTerm ein, übertrage sie an den Sensor und notiere die Rückgabewerte.

Umsetzung der Aufgabe

Im Datenblatt wird nach der Slaveadresse des Temperatursensors gesucht, die auf S. 9 beschrieben ist. Für das Schreiben der Slaveadresse wird das R/W-Bit auf 0 gesetzt.

Abbildung 7 - Slaveadresse 0x90 für den Temperaturmodul MCP9801

Zum Auslesen der Temperaturdaten muss in einem weiteren Schritt zunächst das Temperaturregister über einen sogenannten Registerpointer angesprochen werden. Dies erfolgt nach Datenblatt (S. 14) über:

Abbildung 8 - Registerpointer des Temperaturmoduls MCP9801

Die Befehlssequenz S90 00 P spricht das Temperaturregister des Sensor MCP9801 an. Das Auslesen der Daten übernimmt eine zweite Befehlssequenz S91 02 P. Da es sich jetzt um einen READ-Befehl handelt, wird das R/W Bit im Adressregister auf 1 gesetzt und somit aus der Adresse 90 eine 91. Anschließend müssen die Anzahl der zu lesenden Bytes benannt werden. In unserem Fall zwei. Ein Byte für die Vorkomma-, ein Byte für die Nachkommastelle.

Gib diese beiden Zeilen in das Terminalfenster von CoolTerm ein und betrachte den Rückgabewert im Monitorfenster.

Abbildung 9 - Eingabe der Befehlszeilen im Übertragungsfenster von CoolTerm. Kommentare müssen in Klammern gesetzt werden.

Die ersten beiden Messungen ergeben jeweils einen Wert von 0x1B 0x80. Die erste Hexadezimalzahl (1B) steht für den Vorkommawert, die zweite (80) für den Nachkommawert. Die Umrechnung in einen Dezimalwert ergibt für 0x1B den Dezimalwert 27 und die 0x80 steht für 0,5. Der Temperaturmesswert wird also mit 27,5 °C angegeben. Durch einfaches Auflegen eines Fingers auf die Oberfläche des Sensors erhöht sich die Temperatur schnell und der angezeigte Wert verändert sich.

Versuch 3 - Inertialsensor LSM330

Im folgenden Versuch wird gezeigt, wie man mit Hilfe des USB-I2C-Adapters sehr schnell Zugriff auf die Arbeitsweise eines 6-Achs-Bewegungssensors erhalten kann. Der LSM330DLC ist ein solcher Sensor, der eigentlich zwei verschiedene Systeme enthält: einen Beschleunigungs- und einen Drehratensensor (Gyroskop). Man bezeichnet solche Sensoren auch kurz als Inertialsensoren. In modernen Mobilephones findet man sie ebenso wie in der Robotik und in Flugkörpern (Quadrocoptern etc.).

Für den folgenden Versuch wird ein 6-Achsen-Bewegungssensor-Modul der Fa. ELV benutzt, auf dem sich ein LSM330DLC-IC befindet. Es verfügt über eine 3-Draht- und eine 4-Draht-SPI- sowie eine I2C-Schnittstelle.

 

Pinbelegung des 6-Achs-Bewegungssensor-Moduls

Die Pinbelegung des Moduls ist der Bau- und Bedienungsanleitung entnommen.

 

 

 

 

 

 

 

 

 

 

 

 

Abbildung 10 - Pinbelegung des 6-Achs-Bewegungssensor-Moduls mit einem LSM330 (Inertialsensor mit 3D Beschleunigungs- und 3D Gyroskopsensor).

Dabei bedeuten:

CS_A              Beschleunigungssensor: SPI enable; hier unbeschaltet

CS_G              Gyroskop: SPI enable; hier unbeschaltet

SCL                 I2C: Taktleitung

SDA                I2C: Datenleitung

SDO_A           Beschleunigungssensor: I2C LSB der Geräteadresse

SDO_G           Gyroskop: I2C LSB der Geräteadresse

DEN_G           Gyroskop: Data enable

GND               Masse

INT1_A; INT2_A       Beschleunigungssensor: Interruptsignal; hier unbeschaltet

INT1_G, INT2_G       Gyroskop: Interruptsignal; hier unbeschaltet

EN                   Enable: Bewegungssensor; hier unbeschaltet

UPull              

+Uin                Spannungsversorgung

 

Von den vorhandenen Pins werden nur vier Verbindungen zum USB-I2C-Interface benötigt. Die beiden Sensoren (Beschleunigung und Gyroskop) werden über die interne Adresse angesprochen.

Versuch 3 - Daten aus einem Inertialsensor-Modul auslesen
Material
  • 1x  6-Achsen-Bewegungssensor-Modul
  • 1x  USB-I2C Adapter
  • 1x  USB-Kabel
  • diverse Steckkabel
  • 1x  PC oder Laptop mit Programm CoolTerm
  • Datenblatt LSM330DLC
Aufgaben
  • Verbinde das 6-Achsen-Bewegungssensor-Modul  mit dem USB-I2C-Adapter.
  • Verbinde den USB-I2C-Adapter mit dem PC und starte dort das Programm CoolTerm.
  • Stelle die Baudrate auf 115200 ein und wähle anschließend das Icon Connect.
  • Öffne über Connection - Send String in CoolTerm ein Eingabefenster und gib die in Abb. 12 dargestellten Befehlszeilen ein.
  • Übertrage anschließend mit Send die Daten über den I2C-Bus an den Slave und notiere die im Terminalfenster zurückgegebenen Werte.
  • Wiederhole den vorherigen Schritt, verändere aber vorher die Neigung des Sensors.

Schaltskizze und Schaltungsaufbau

Der Sensor befindet sich auf einer briefmarkengroßen Platine und lässt sich über seine zwei Pinleisten auf einem Steckbrett einfach und schnell verkabeln (Abb. 11).

Abbildung 11 - Verdrahtung des 6-Achsen-Bewegungssensor-Moduls mit dem ELV USB-I2C-Adapter.

Die Befehlszeileneingabe und die Ausgabe der Messdaten im Terminalfenster zeigt Abb. 12.

Abbildung 12 - Befehlseingabe zur Initialisierung des Gyroskops im Fenster "Send String" und Ausgabe der Daten im Terminalfenster.

Erläuterungen zu den beiden Befehlszeilen

Im Datenblatt des Intertialsensors LSM330 finden sich auf Seite 32ff Hinweise zu den Adressen der beiden Sensoren Gyroskop und Beschleunigung.

Die Ansprechadresse auf dem I2C-Bus ergibt sich über das Datenblatt zu:

Das Register CTRL_REG1_G wird über seine Adresse 0x20 angesprochen. Dort werden anschließend die entsprechenden Bits für die Wahl der Datenrate (DR1:0), die Auswahl der Bandbreite (BW1:0), der Power-Down Modus PD und die Initialisierung der drei Raumachsen (Zen, Yen, Xen) gesetzt.

Mit der Befehlssequenz SD4 0F P wird das Gyroskop über den I2C-Bus adressiert. seine drei Raumachsen aktiviert, der Powermodus auf normal und die Datenrate auf 95 Hz eingestellt.

In der zweiten Befehlszeile sollen die gemessenen Daten im Terminalfenster ausgegeben werden. Dazu wird die erste Registeradresse für die Datenausgabe (0x27 - OUT_X_L_A) aufgerufen. Da nachfolgend alle sechs Byte ausgegeben werden, wird der Sensor angewiesen automatisch die Datenadresse nach jeder Ausgabe um eins zu erhöhen. Um das zu erreichen (eine automatische Inkrementierung der Adresse), muss nach Herstellerangaben das MSB der Registeradresse auf 1 gesetzt werden.

Es fehlt jetzt nur noch die Anzahl der zu lesenden Bytes (in diesem Fall 3, für die drei Raumachsen). Damit sind alle Befehle erklärt.

 

Es lohnt sich, die Zeitdiagramme für die Ansteuerung des Gyroskops und des Beschleunigungssensor abschließend noch einmal anzuschauen, um besser zu verstehen, was da eigentlich auf der Datenleitung hin- und hergeschoben wird. Für die beiden Sensoren zeigen die folgenden Diagramme die Bitfolgen; aufgenommen wurden sie mit einem Picoscope der 2000-Serie.

Zeitdiagramme

Abbildung 13 - Das Zeitdigramm zeigt die Bitfolgen für die Befehlssequenz S30 20 77 P an. Es handelt sich um die Ansteuerung des Beschleunigungssensors.
Abbildung 14 - Zeitdiagramm für die Befehlssequenz SD4 20 0F P.

Das Auslesen der Daten des Beschleunigungssensors wird durch eine ähnliche Befehlssequenz erreicht. Abb. 15 zeigt die Befehlssequenz und die Ausgabedaten im Terminalfenster.

Abbildung 15 - Die Daten des Gyroskops und Beschleunigungssensors werden ausgelesen und im Terminalfenster angezeigt.

Zeitdiagramme

Die nachfolgenden Zeitdiagramme zeigen, wie ein Inertialsensor-IC mit Hilfe eines USB-I2C-Adapter-Moduls angesteuert wird. Im vorliegenden Beispiel ist die I2C-Adresse des angesprochenen Sensors D0. Die Messungen wurden mit einem PicoScope 2000Series vorgenommen.

Die nachfolgende Abbildung zeigt die Eingabe der Befehlssequenzen über das Terminalfenster von CoolTerm und die nachfolgende Ausgabe der Daten.

SD0 20 0F        Grundeinstellung des Sensors

SD0 0F R01 P  Abfrage des Registers Who Am I (0x0F) .

SD0 A8 R03 P  Abfrage der drei Raumachsenwerte.

Abbildung 16 - Eingabe von drei Befehlssequenzen im Fenster "Send String" und Ausgabe der Daten im Terminalfenster von CoolTerm.

Wie ein Inertialmodul unter BASCOM angesteuert wird und was sonst zu beachten ist, kann im Abschnitt AVR Controller und BASCOM nachgelesen werden.

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