Forum: Mikrocontroller und Digitale Elektronik C > Zeiger operationen


von Thomsa A. (Gast)


Lesenswert?

Nabend,
1
s8 BMP180_I2C_bus_write(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)
2
{
3
  enum I2c_Return_Codes Exitcode = I2cWriteBytes( reg_data , cnt , dev_addr );
4
  #warning "reg_addr muss noch uebergeben werden"
5
      
6
  return (s8)Exitcode;
7
}

Ich habe da mal eine Frage an euch Profis (:
Die Funktion "I2cWriteBytes" nimmt jetzt nur 3 Parameter an.
Die Funktion "BMP180_I2C_bus_write" jedoch hat einen Parameter mehr 
"reg_addr".

Meine Frage jetzt an euch.
Kann ich die "reg_addr" irgendwie ohne großen Aufwand vor "reg_data" 
hängen? Da "reg_addr" ja ein Zeiger ist bin ich ein wenig verwirrt ob 
das überhaupt funktioniert.

Hätte mir das jetzt so gedacht -> ( Pseudokode! )
1
uint8_t *I2cTransfer[] = 
2
{
3
   &reg_addr,
4
   reg_data
5
};

Natürlich müsste die Funktion "I2cWriteBytes" damit auch umgehen können.

Das ganze wollte ich nutzen um nicht noch einen weitere Parameter an 
"I2cWriteBytes" übergeben zu müssen. Wollte das ganze ein wenig 
"kompakt" halten.

Mfg

von STK500-Besitzer (Gast)


Lesenswert?

Thomsa A. schrieb:
> Hätte mir das jetzt so gedacht -> ( Pseudokode! )uint8_t *I2cTransfer[]
> =
> {
>    &reg_addr,
>    reg_data
> };

Wenn dein Pseudocode ein Array beschreibt ist das gar nicht schlecht.
"I2cWriteBytes" wird nur ein Array der Länge "cnt" übertragen.
darin befindet sich dann auch die Register-Adresse, die du deinem 
"reg_data"-Array voranstellen musst.
Das hängt damit zusammen, dass es I²C-Bauteine gibt, die 
16Bit-Registeradressen verwenden, und welche die nur 8bit breite 
RegisterAdressen verwenden.

(Die Info solltest du aber in der Doku zu der Funktion finden.)

Du brauchst also ein u8-Array, das um ein oder zwei Bytes länger ist, 
als das, was an die Funktion übergeben wurde.
Da packst du zu erst die Registeradresse bytweise rein (bei 16bit die 
Bytereiehenfolge beachten).
Hinter die Adresse kopierst du dann die Daten, die deine Funktion 
übergeben bekommen hat.

von g457 (Gast)


Lesenswert?

> Kann ich die "reg_addr" irgendwie ohne großen Aufwand vor "reg_data"
> hängen?

Nein, nicht ohne Umkopieren.

> Das ganze wollte ich nutzen um nicht noch einen weitere Parameter an
> "I2cWriteBytes" übergeben zu müssen. Wollte das ganze ein wenig
> "kompakt" halten.

I2cWriteBytes() erweitern oder reg_addr und reg_data adäquat in ein 
struct packen.

HTH

von Thomsa A. (Gast)


Lesenswert?

Und einfach ein Byte vor dem eigentlichen Anfang der Daten wäre 
wahrscheinlich fatal?

von A. S. (Gast)


Lesenswert?

Thomsa A. schrieb:
> Die Funktion "I2cWriteBytes" nimmt jetzt nur 3 Parameter an.

Vermutlich sendet sie auch einfach nur Daten an den I2C. Das ist etwas 
ganz anderes, als in einen Speicher zu schreiben.

Erläutere beide Funktionen (was sollen / können sie, welche devices, 
...)

von Oliver S. (oliverso)


Lesenswert?

Thomsa A. schrieb:
> Das ganze wollte ich nutzen um nicht noch einen weitere Parameter an
> "I2cWriteBytes" übergeben zu müssen. Wollte das ganze ein wenig
> "kompakt" halten.

Eine der grundlegendsten Grundregeln beim programmieren lautet, sich 
niemals selber ohne Not von hinten durch die Brust ins Knie zu schießen. 
Das könnte nicht nur ins Auge gehen, daß tut das mit Sicherheit.

Wenn eine Funktion vier Parameter braucht, dann bekommt die vier 
Parameter. Elektronisches Papier ist unbegrenzt verfügbar, und die 
Buchstaben kosten auch nichts.

Wenn Daten sinnvoll zusammengefasst werden können und auch 
zusammengehören, dann packt man die in ein struct.

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.