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 auslesenAuch 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.
Keine Kommentare:
Kommentar veröffentlichen