Abbildung 7 - Das Zeitdiagramm zeigt von links nach rechts die Befehlssequenz SC0 80 81 P
Startsequenz mit der Bitfolge 1100_0000 (0xC0), abschlossen durch Ack =
0 (9. Bit). Bitfolge 1000_0000 (0x80 oder dezimal 128), abgeschlossen
mit Ack = 0 (9. Bit). Arduino i2c beispiel. Bitfolge 1000_0001 (0x81 oder dezimal 129), abgeschlossen
Stoppsequenz und Übergang des I 2 C-Bausteins in den Leerlauf. Abbildung 8 - Aufgenommen wurde die Befehlssequenz SC0 94 01 00 00 00 P.
Bitfolge 1001_0100 (0x94 oder dezimal 148), abgeschlossen
Bitfolge 0000_0001 (0x01 oder dezimal 1), abgeschlossen mit
Ack = 0 (9. Bit). Bitfolge 0000_0000 (0x00
oder dezimal 0), abgeschlossen mit Ack = 0 (9. Bit). Stoppsequenz und Übergang des I 2 C-Bausteins in den Leerlauf.
Arduino I2C Beispiel
Diese fünfteilige Serie richtet sich an diejenigen, die gerne Arduino Projekte umsetzen möchten, jedoch mit der Programmiersprache und der Arduino IDE nicht so sehr vertraut sind. Oft ist es so, dass sich Bastler mit Elektronik sehr gut auskennen, Programmieren aber noch ein Problem darstellt. Zahlreiche Tutorials bieten fertigen Quellcode, den man nur auf den Mikrocontroller laden muss. Man lernt durch try-and-error, versteht aber oft nicht, was in dem Programm geschieht. Möchte man dann ein umfangreicheres Projekt umsetzen, landet man auch mal in einer Sackgasse. Die folgenden Grundlagen sollen dazu dienen, den Zugang zum Programmieren etwas zu erleichtern. Logic Analyzer - Teil 1: I2C-Signale sichtbar machen – AZ-Delivery. Ein eigenes Programm auf einen Arduino Mikrocontroller zu übertragen, kann auf verschiedene Art und Weise geschehen. In unseren Blogbeiträgen gibt es bereits eine Anleitung für die Installation und Verwendung der Entwicklungsumgebung PlatformIO. Wir richten das Hauptaugenmerk in dieser Beitragsserie auf die Arduino IDE, die sich gut für Einsteiger eignet.
Arduino I2C Beispiel Programming
Um in ein bestimmtes Register etwas
hineinzuschreiben, wird der Vorgang mit einer Startsequenz (S) und der Angabe der Slaveadresse (wer wird angeschrieben? ) gestartet. Es handelt sich um einen Schreibvorgang, deshalb wird das
R/W-Flag auf 0 gesetzt. Die Slaveadresse lautet damit:
TLC59116-Adresse (w): 1100_0000 oder 0xC0
bei einem Schreibvorgang und
TLC59116-Adresse (r): 1100_0001 oder 0xC1
bei einem Lesevorgang. Adressierung - 7-Bit oder 8-Bit? Arbeitet man mit einem Arduino-UNO und der I 2 C-Bibliothek Wire. h, dann errechnet sich die korrekte Slaveadresse dadurch, dass die 7-Bit
Adresse (1100_000 ohne das R/W Bit) des Slave um eine Position nach rechts (in Richtung des R/W Bits) verschoben wird (Abb. Arduino Uhrzeit mit der Real Time Clock (RTC) – Arduino Tutorial. 6). Abbildung 6 - Die 7-Bit Adresse wird um eine Position nach rechts verschoben. Wie man Abb. 6 entnehmen kann, wird aus der Slaveadresse 0xC0 (dezimal: 192) durch die Verschiebung 0x60 (dezimal: 96). Bei der Programmiersoftware ist zu prüfen, ob bei einer I 2 C-Adressierung die 7-Bit Adresse ohne das R/W-Bit oder die 8-Bit Adresse mit R/W-Bit gemeint
ist und dann entsprechend dem oben Gesagten zu verfahren.
Arduino I2C Beispiel Scanner
Im oberen Bild werden sieben Bytes übertragen, im unteren zwei Bytes. Aus der Library und dem Datenblatt ersehen wir, dass die Registeradresse 0x00 und die folgenden sechs Register die aktuelle Zeit und das Datum, die Registeradressen 0x11 und 0x12 die Temperatur übermitteln. Auszug aus Library
Zeile 1 - 13:
#include "RTClib.
h>
void setup()
{
();
(115200);
delay(500);
intln("\n=== I2C Scanner ===");}
void loop()
byte error, address;
int nDevices;
intln("Starte Scanvorgang");
nDevices = 0;
for (address = 1; address < 127; address++)
ginTransmission(address);
error = Wire. endTransmission();
if (error == 0)
("I2C Gerät gefunden - Adresse: 0x");
if (address < 16)
("0");
(address, HEX);
intln("");
nDevices++;}
else if (error == 4)
("Unbekannter Fehler an Adresse: 0x");
intln(address, HEX);}}
if (nDevices == 0)
intln("Keine I2C Geräte gefunden\n");
else
intln("Scanvorgang Abgeschlosse\n");
delay(10000);}
Ausgabe
Die Ausgabe des seriellen Monitors der Arduino IDE zegt nun das angeschlossene Gerät mit der entsprechenden I2C Adresse. Im folgenden Beispiel wurde ein GY-302 Lichtintensitätssensor verwendet. Textausgabe mit LCD 20x4. I2C Scanner – Serielle Ausgabe
Eventuell liegt ein Arduino Nano mit CH340/CH341 Chip vor. Gibt man das in die Internetsuche des Vertrauens ein, wird man schnell fündig. Das Problem ist bekannt. Auch unter Linux oder Mac OS können besagte Problem auftreten. Wird der Arduino erkannt, erscheint er unter Windows als /COMx (anstelle des x erscheint dann eine Zahl) und unter Linux und Mac OS als /dev/tty bzw. /dev/usb. Abbildung 3: Arduino IDE - Portauswahl
Bibliothekenverwaltung
Es stehen zahlreiche Bibliotheken zur Verfügung. Das bedeutet, dass fertige Programmfunktionen eingebunden und genutzt werden können. Die Arduino IDE bietet das auf verschiedenen Wegen an. Zum einen kann man im Menüpunkt "Werkzeuge" unter "Bibliotheken verwalten…" bzw. Arduino i2c beispiel programming. STRG+UMSCH+I aus dem Online Repository zahlreiche Bibliotheken zu installieren. Möchte man z. B. ein LCD-Display nutzen, kann man die LiquidChrystal Library installieren und hat so auf einfache Weise passende Funktionen zur Verfügung sowie Beispielcode, der anschließend über das Menü "Datei" und anschließend "Beispiele" erreichbar ist.