So nun nehmen wir mal an, ich schreibe einaml in register 4 was und dann in register 1, geht das so einfach wie oben um die werte auszulesen oder eher nicht?
Wenn du die Methode zweimal aufrufst, ja. 100%ig sicher bin ich mir aber nicht. Der Code hier ist von einer RTC, aber laut deinem Datenblatt scheint die Prozedur gleich zu sein. Musst du ausprobieren. Aber selbst wenn es nicht gleich geht bist du damit schonmal auf dem richtigen Weg.
doch das was mir noch unklar ist, ist, ob ein byte für die requestfrom() reicht
Wenn du nur ein Register lesen willst geht das natürlich auch so:
uint8_t getData(uint8_t addr)
{
Wire.beginTransmission(deviceAddress);
Wire.write(addr); // hier wird die Adresse des zu lesenden Registers gesetzt
Wire.endTransmission();
Wire.requestFrom(deviceAddress, 1); // 1 Byte anfordern
return Wire.read(); // einmal lesen
}
Oder Schreiben:
void setData(uint8_t addr, uint8_t data)
{
Wire.beginTransmission(deviceAddress);
Wire.write(addr);
Wire.write(data);
Wire.endTransmission();
}
oder ob ich mehr brauche, sorry das verstehe ich noch nicht so
Das hängt nur davon ob, wie du das machen willst. Es bietet sich vielleicht an die Register für die 4 LED-Reihen auf einmal auszulesen. Das musst du aber nicht. Du kannst natürlich auch 4 getrennte Zugriffe machen, wenn das bei deiner Anwendung sinnvoller ist oder du es so magst.
Wenn man es auf einmal macht kann man das in zwei Zeilen so tun:
uint8_t data[] = { wert1, wert2, wert3, wert4 };
writeData(0, data, 4);
Oder zum Auslesen:
uint8_t data[4];
readData(0, data, 4);
Das aber beides mit dem ersten Code-Beispiel wo data ein Pointer auf byte ist und man das read/write in einer for-Schleife bis size macht.
Was man auch zusätzlich machen kann ist sowas:
Wire.write(data);
if (Wire.endTransmission() != 0)
{
return false;
}
return true;
oder fürs lesen nach requestFrom():
if(Wire.available() < 1)
return false;
data* = Wire.read();
return true;
Dann hat man eine Bestätigung ob der Zugriff erfolgreich war. Braucht aber einen bool as return-Wert. Also muss bei getData wie im ersten Beispiel oben ein Pointer auf "data" übergeben werden. Wenn es ohne das funktioniert kannst du es weglassen, aber es ist vielleicht hilfreich falls es nicht geht.
D.h. anhand der eingabe der Adresse, springt der pointer zu der übertragenden Adresse? Und dann wird der wert mit dem neuen wert überschrieben?
Ja. Steht so im Datenblatt, Seite 19:
"The command is interpreted as the destination address (register file unit) and data is written in the addressed location. [...] If the address
is correct, the data byte is written to the addressed register. After the write, the internal address pointer is increased by one."
Den ganzen Kram mit ACK/NACK Bits und Start/Stop conditions kannst du ignorieren. Das macht Wire im Hintergrund. Aber die Reihenfolge für die Kommandos ist klar angegeben.