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