AdSense

Sonntag, 2. März 2014

Register Pointer - mit Arduino bestimmte Register über I2C ansprechen

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

Keine Kommentare:

Kommentar veröffentlichen