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

I2C Bus besser verstehen (2)

Mikrocontroller und alle Komponenten, die über eine I2C-Schnittstelle verfügen, können nach einem Industriestandard miteinander kommunizieren. Wie das abläuft, wurde im ersten Teil erklärt. In den folgenden Übungen schauen wir uns einige praktische Umsetzungen an, mit Bauteilen, die über eine I2C-Schnittstelle mit einem PC kommunizieren.

Dazu wird in der ersten Übung eine einfache Schaltung mit einem Potenziometer und einem A/D Wandler vom Typ PCF8591P benutzt. Das alles erfolgt lötfrei auf einem Steckbrett. Die vom A/D Wandler gelieferten Daten des Potentiometers werden über den I2C-Bus an einen PC übertragen und dort über ein Terminalprogramm ausgelesen.

Als USB-I2C Schnittstelle kommt der Bausatz PC-USB-Interface der Fa. ELV zum Einsatz. Die wenigen Bauteile lassen sich schnell und unkompliziert auf der mitgelieferten Platine bestücken; ein wenig Löterfahrung sollte man für den Zusammenbau allerdings schon mitbringen. Alternativ kann man auch ein Fertigmodul kaufen.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abbildung 1 - Fertig aufgebautes und bestücktes ELV USB-I2C Interface. Drei I2C-Busanschlüsse sind herausgeführt.

Die mitgelieferte Bau- und Bedienungsanleitung ist ausführlich und beschreibt alles Weitere. Die Kommunikation zwischen den am I2C-Bus angeschlossenen Sensoren/Bauteilen und einem PC erfolgt über die Software CoolTerm, die als Freeware aus dem Internet heruntergeladen werden kann.

 

Bevor man in die folgenden Experimente einsteigt, ist es hilfreich, sich den Abschnitt I2C besser verstehen (1) angeschaut zu haben, da auf dessen Inhalte zurückgegriffen wird.

Versuch 1 - Kontakt mit dem USB-Interface herstellen

Damit PC und Interface miteinander kommunizieren können, müssen die Grundeinstellungen korrekt vorgenommen werden. Über das benutzte Terminalprogramm (hier: CoolTerm) werden einzelne Parameter so eingestellt, dass Daten vom und zum PC über eine virtuelle COM-Schnittstelle ausgetauscht werden können. Dazu muss festgestellt werden, welche COM-Schnittstelle dem Interface vom PC zugewiesen wurde.

Über einen Klick mit der rechten Maustaste auf das Windows-Symbol unten links in der Bildschirmzeile und dem Aufruf von System gelangt man auf die Seite Einstellungen über die dann der Geräte-Manager aufgerufen wird (gilt für Windows 10; bei anderen Windowsversionen läuft es ähnlich ab). Unter dem Eintrag Anschlüsse (COM & LPT) erfährt man dann, über welchen COM-Port das Interface kommuniziert.

Abbildung 1 - COM-Port Einstellung für das I2C-Interface auslesen

In meinem Fall handelt es sich um COM4. Bei jedem anderen Nutzer wird ggf. ein anderer COM-Port angegeben sein. Die Zahl muss man sich merken.

Nach dem Start von CoolTerm erscheint der Eröffnungsbildschirm. Über das Icon Options gelangt man zu den Einstellungsgrößen. Im Register Serial Port wird der COM-Port eingetragen, als Baudrate 115200 eingestellt, Data Bits 8, Parity none und Stop Bits 1. Alle anderen Eintragungen werden nicht verändert.

Versuch 1

Material

  • 1x  USB-I2C-Interface (Fa. ELV)
  • 1x  USB-Kabel
  • 1x  IC PCF8591P (optional)

 

Aufgabe

  • Verbinde das USB-I2C Interface mit dem PC
  • Starte das Terminalprogramm CoolTerm oder ein ähnliches.
  • Gib in die Sendezeile ein Fragezeichen (?) ein und bestätige mit der Eingabetaste.
  • Überzeuge dich, dass im Terminalfenster die Grunddaten des I2C-Interfaces ausgegeben werden.

 

Nur dann, wenn das Interface vom Terminalprogramm erkannt wurde, kann die Arbeit fortgesetzt werden. Bei Problemen überprüfe die installierten Treiber, die Einstellungen und die Hardware selbst. Im Terminalfenster erscheint der folgende Text:

Abbildung 2 - Verbindungsdaten des Interfaces nach Eingabe von "?" in der Sendezeile.

Was meldet das Interface zurück?

In der ersten Zeile wird die Firmware-Versionsnummer des Interfaces und der werksseitig eingestellte Kalibrierungswert des internen RC-Oszillators angegeben (hier: 58). In der zweiten Zeile wird die zuletzt benutzte I2C-Adresse mitgeteilt. Die letzten beiden Zeilen geben die Übertragungsgeschwindigkeit zum PC und die Taktrate, mit der das Interface die Datenübertragung auf dem I2C-Bus taktet, an.

Versuch 2 - Einen Widerstandswert auslesen

Versuch 2

Material

  • 1x  USB-I2C-Interface (Fa. ELV)
  • 1x  USB-Kabel
  • 1x  IC PCF8591P
  • 1x  Potenziometer, 10 kOhm
  • 1x  Steckbrett
  • diverse Steckdrähte

 

Aufgabe

  • Verbinde das USB-I2C Interface mit dem PC
  • Starte das Terminalprogramm CoolTerm oder ein ähnliches.
  • Gib in die Sendezeile die folgende Zeichenfolge ein:
    S90 00 R01 P
  • Überzeuge dich, dass im Terminalfenster ein Messwert in hexadezimaler Schreibweise ausgegeben wird.

 

Versuchsaufbau

Abbildung 3 - Versuchsaufbau, bei dem bereits 4 Potentiometer aufgebaut, aber nur eines mit AIN1 (Pin 2) des A/D Wandlers PCF8591P verbunden ist.

Ausgabe im Terminalfenster

Abbildung 4 - Im Terminalfenster erscheint der vom PCF8591 ausgelesene Widerstandswert des Potenziometers.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abbildung 3

Nach Eingabe der Zeichensequenz

S90 00 R01 P

wird - je nach Position des Mittelabgriffs beim Potenziometer - eine Zahl zwischen 0x00 und 0xFF ausgegeben. Bringe den Mittelabgriff in eine andere Position und wiederhole die Zeicheneingabe von eben. Es sollte dann ein anderer Wert ausgegeben werden.

In den beiden Extrempunkten - ganz nach links bzw. rechts gedreht - werden die Werte 0x00 und 0xFF angezeigt.

Erläuterungen zur Zeicheneingabe im Terminal

Dem Datenblatt des PCF8591 ist zu entnehmen, wie die Kommunikation zwischen Master und Slave abzulaufen hat. Im Leerlauf sind die beiden Leitungen SDA (Datenleitung) und SCL (Taktleitung) auf HIGH.

 

1. Schritt

Eingeleitet wird eine Kommunikation durch einen Flankenwechsel auf der SDA-Leitung von HIGH zu LOW, während SCL auf HIGH verweilt. Dies erfolgt über das Terminalprogramm durch Eingabe des Buchstaben S.

2. Schritt

Anschließend muss die Adresse des Empfängers auf die Datenleitung gegeben werden. Bei einem Schreibvorgang und der Empfängeradresse 0, ist die binäre Darstellung des Adressbytes: 1001 0000. Die Umwandlung in eine hexadezimale Darstellung erfolgt nibbleweise. Das erste Nibble 1001 stellt die Zahl 9 im Zehner- und im Sechzehnersystem dar. Der Binärzahl 0000 entspricht die Dezimal- bzw. Sechzehnerzahl 0. Damit gilt:

Der Binärzahl 1001 0000 entspricht im 16-er System die Zahl 90 oder um kenntlich zu machen, dass es sich um eine Zahl aus der Hexadezimalsystem handelt 0x90.

S90 initiiert ein Startereignis auf dem I2C-Bus und schreibt den A/D Wandler über seine Adresse 90 an.

Tabelle 1

3. Schritt

Nach einem eingeleiteten Schreibvorgang (LSB im Adressbyte ist 0), folgt ein Controlbyte.

Tabelle 2

Die Bedeutung der einzelnen Bits kann im Datenblatt des PCF8591 auf S. 6 ff nachgelesen werden. Für die folgenden Versuche werden alle vier Eingänge des A/D Wandlers (AIN0 ... AIN3) benötigt; das entspricht der Einstellung 00.

Sollen alle Eingänge nacheinander abgefragt werden, muss das auto increment flag auf 1 gesetzt werden. Soll nur ein Kanal abgefragt werden, wird das flag auf 0 gesetzt.

Gestartet wird die Abfrage mit Kanal 0, deshalb werden die beiden niedrigsten Bits (channel number) auf 00 gesetzt. Insgesamt ergibt sich damit die Bitfolge:

0000 0000 oder hexadezimal 0x00.

S90 00 initiiert den I2C Datenbus, adressiert das IC mit der Adresse 0x90, spricht Kanal 0 des A/D Wandlers an und fragt den dort anliegenden Messwert ab.

4. Schritt

Es wird anschließend dem PCF8591-Baustein mitgeteilt, wieviele Bytes er übertragen soll. Wie lesen zunächst einmal nur einen Messwert (den des angeschlossenen Potenziometers) aus, deshalb wird der Wert auf R01 festgelegt.

S90 00 R01 initiiert den I2C Datenbus, adressiert das IC mit der Adresse 0x90, spricht Kanal 0 des A/D Wandlers an, fragt den dort anliegenden Messwert ab und gibt das Datenbyte auf dem Terminal aus.

5. Schritt

Abgeschlossen wird eine Messabfrage mit der Stoppbedingung (P).

S90 00 R01 P initiiert den I2C Datenbus, adressiert das IC mit der Adresse 0x90, spricht Kanal 0 des A/D Wandlers an, fragt den dort anliegenden Messwert ab und gibt das Datenbyte auf dem Terminal aus. Der Vorgang wird mit dem Befehl P (Stoppbedingung) abgeschlossen.

Versuch 3 - Vier Widerstandswerte auslesen

Versuch 3

Material

  • 1x  USB-I2C-Interface (Fa. ELV)
  • 1x  USB-Kabel
  • 1x  IC PCF8591P
  • 4x  Potenziometer, 10 kOhm
  • 1x  Steckbrett
  • diverse Steckdrähte

 

Aufgabe

  • Verbinde das USB-I2C Interface mit dem PC
  • Starte das Terminalprogramm CoolTerm oder ein ähnliches.
  • Gib in die Sendezeile die folgende Zeichenfolge ein:
    S90 01 R04 P
  • Überzeuge dich, dass im Terminalfenster 4 Messwerte in hexadezimaler Schreibweise ausgegeben werden.

Versuchsaufbau

Abbildung 5 - Vier Potenziometer werden über den A/D Wandler PCF8591 ausgelesen und die Widerstandswerte im Terminalfenster eines PC angezeigt.

Versuchsdurchführung

Um mit dem I2C-Bus und den festgelegten Abfolgen vertraut zu werden, lohnt es sich, mit dem Terminalprogramm CoolTerm und verschiedenen Befehlssequenzen "herumzuspielen". Man sollte sich dabei vorher überlegen, wie das System reagiert, um im Abweichungsfall der Sache auf den Grund gehen zu können.

Über Connection - Send String lassen sich ASCII-Sequenzen im Programm CoolTerm schnell eingeben, abspeichern und später wieder aufrufen. Mit dem Wissen aus Versuch 2 sollten folgende Aufgaben gelöst werden:

  • Auslesen des Widerstandswertes des Potenziometers an AIN2 (AIN1, AIN0, AIN3) und Ausgabe im Terminalfenster.
  • Auslesen der Widerstandswerte der Potenziometer an AIN0 und AIN1. Anzeigen beider Werte im Terminalfenster.
  • Auslesen aller Widerstandswerte und Ausgabe im Terminalfenster.

Das folgende Bild zeigt die Messwerte von vier ausgelesenen Potenziometern. Im Send String Fenster wird die dafür notwendige Befehlssequenz dargestellt.

Abbildung 6 - Mit S90 04 R04 P werden die Widerstandswerte der vier Potenziometer ausgelesen und im Terminalfenster angezeigt.

Was wird vom ELV USB-I2C-Adapter auf die Datenleitung gelegt?

Wir haben gesehen, dass man mit der Eingabe von bestimmten Befehlssequenzen über das Programm CoolTerm die Abfrage der Messwerte vom IC PCF8591 steuern kann. Dabei musste eine bestimmte, den Vorgaben eines I2C-Bus genügende, Reihenfolge der Befehle eingehalten werden.

Alle nachfolgenden Zeitdiagramme wurden mit einem Picoscope 2000 Series aufgenommen.

Abbildung 7a - Zeitdiagramm für die Befehlseingabe S90 00 R01 bei einem ELV USB-I2C-Adapter (1. Teil).
Abbildung 7b - Zeitdiagramm für die Befehlssequenz S90 00 R01 bei einem ELV USB-I2C-Adapter. Rechts wird die Terminalausgabe angezeigt (2. Teil)

Gestartet wird auf einem I2C-Bus in jedem Fall mit der Befehlssequenz S90. Aus dem Kapitel I2C besser verstehen (1) wissen wir, dass die Startsequenz immer so eingeleitet wird, dass bei HIGH auf SCL (Taktleitung) die Datenleitung SDA von HIGH auf LOW gelegt wird. Anschließend folgt nach Vorgabe des Datenblattes des PCF8591 ein Adress- und ein Controlbyte.

Abbildung 8 - Befehlssequenz und Zeitdiagrammdarstellung für die Datenabfrage eines Potenziometerwertes; S90 steht für eine Startsequenz und das Adressbyte 00 mit zusätzlichem ACK LOW Bit.

Nach der 8 Bit Adresse 1001 0000 wird ein LOW-ACK-Bit (Acknowledge LOW) auf die Datenleitung gelegt, um zu signalisieren, dass der PCF8591 ein weiteres Byte empfangen kann. Hierbei handelt es sich um ein Controlbyte, dessen Wert sich aus Tabelle 2 ableiten lässt.

Abbildung 9 - Das Controlbyte setzt sich aus 0000 (4 verschiedene Eingänge) und 0000 (kein Autoincrement und Start bei channel 0 zusammen).

Zum Auslesen der Messwerte (R01) wird eine neue Startsequenz eingeleitet und das LSB im Adressbyte auf 1 (read) gesetzt.

Abbildng 10 - Das Ausgabebyte 0x4F wird im Terminalfenster von CoolTerm ausgegeben.

Nach Ausgabe des Messwertbytes (hier: 0x4F) wird das neunte Bit ACK auf HIGH gesetzt und damit signalisiert, dass kein weiteres Byte empfangen wird.

 

Im dritten Teil von I2C besser verstehen geht es um die Ansteuerung einer I2C 7-Segment Anzeige mit 4 Modulen. Dazu wird das Modul I2C-7-Segment-Anzeige I2C-4DLED der Fa. ELV verwendet. Mit Hilfe des hier vorgestellten I2C-Interfaces und dem Datenblatt des für die Anzeige zuständigen Bausteins SAA1064T wird die 4-stellige Anzeige über den I2C-Bus angesteuert. Im weiteren Verlauf wird der auf dem Modul ebenfalls integrierte Temperaturmodul MCP9801M aktiviert und die von ihm gemessenen Temperaturwerte auf der LCD-Anzeige dargestellt.

Interessiert? Dann geht es hier weiter zum I2C besser verstehen - Teil 3.

 

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