(English Version) Bei manchen Anwedungen ist es erforderlich, dass man beim lesen und schreiben über den I2C-Bus ein ganz bestimmtes Register eines I2C-Slaves ausliest oder beschreibt, z.B. wenn man bei der
Real Time Clock DS1307 nur die Stunden auslesen bzw. ändern möchte.
Dazu gibt es die sogenannten Register Pointer. Mit diesen Pointern "zeigt" man auf das Register, das man lesen oder beschreiben möchte.
Mit dem Arduino funktioniert das denkbar einfach: beim Schreibzugriff wird mit dem ersten über den write()-Befehl gesendeten Byte der Register Pointer gesetzt. Ein Beispiel anhand des DS1307 soll das verdeutlichen;
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0x02); //Pointer auf Register 2 setzen
Wire.write(decToBcd(hour)); //Wert für Stunden ins Register 2 schreiben
Wire.write(decToBcd(weekDay)); //Wert für Wochentag ins Register 3 schreiben
Wire.endTransmission();
Das erste geschriebene Byte nach dem Befehl beginTransmission() setzt hier den Pointer auf das Register 2 (hier werden die Stunden gespeichert). Mit dem zweiten write()-Befehl wird dann der eigentlich Wert in dieses Register geschrieben. Dann wird automatisch ins nächste Register gesprungen. Der folgende write()-Befehl schreibt also ins Register 3 und so weiter.
Beim Auslesen von Daten aus einem bestimmten Register wird ähnlich vorgegangen:
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0x02); //Pointer auf Register 2 setzen
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);//Datenabfrage ab Register 2 beginnen
int hour = bcdToDec(Wire.read()); //Stunden aus Register 2 auslesen
int weekDay = bcdToDec(Wire.read()); //Wochentag aus Register 3 auslesen
Auch hier wird zuerst der Pointer durch Senden einer 2 auf das Register 2 gesetzt. Dann können mit dem Befehl requestFrom() Daten angefordert werden. Der read()-Befehl liest daraufhin Daten aus dem Register 2 aus. Dann wird wieder automatisch zum nächsten Register gesprungen, so dass der nächste read()-Befehl das Register 3 ausliest und so weiter.