Forum: Mikrocontroller und Digitale Elektronik Frage zu Funktionszeiger und dessen Verwendung


von Matthias M. (Gast)


Lesenswert?

Hi, für einen alten Hasen ist das sicherlich ganz easy, ich dageben 
bräuchte mal wieder kurze Starthilfe.

Es geht um folgende Funktion:
1
void TWI_read(u08 TWI_adr, u08 *val, u08 count)
2
//------------------------------------------------
3
// Read n=count bytes from I2C-Bus in polled mode
4
// needs about 200us for reading addr + one byte
5
//------------------------------------------------
6
{
7
  u08 i=0;
8
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);     // send START condition
9
  while (!(TWCR & (1<<TWINT)));               // wait for response
10
  if ((TWSR & 0xF8) == TW_START)              // if START was successful
11
  {
12
    TWDR = (TWI_adr | 0x01);                  // put slave address+READ to TWDR
13
    TWCR = (1<<TWINT)|(1<<TWEN);              // and start transmission
14
    while (!(TWCR & (1<<TWINT)));             // wait for response
15
    if ((TWSR & 0xF8) == TW_MR_SLA_ACK)       // if acknowledge ok
16
    {
17
      count--;
18
      while (count>i)                         // while more than one byte to read
19
      {
20
        TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);  // then start transfer with acknowledge
21
        while (!(TWCR & (1<<TWINT)));         // wait for response
22
        val[i++]=TWDR;                        // read databyte from TWDR
23
      }
24
      TWCR=(1<<TWINT)|(1<<TWEN);              // start last byte transfer without acknowledge
25
      while (!(TWCR & (1<<TWINT)));           // wait for response
26
      val[i]=TWDR;                            // read databyte from TWDR
27
    }
28
    else
29
    {
30
      printf_P("Error: I2C[R] Addr\n");
31
    }
32
  }
33
  else
34
  {
35
    printf_P("Error: I2C[R] Start\n");
36
  }
37
  TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);      // transmit STOP condition
38
  delay_us(10);                                // wait until STOP is transmitted
39
}

Der Aufruf der Funktion geschieht hiermit: void TWI_read(0x30, u08 *val, 
4)

Hierbei möchte ich 4 Bytes von der Adresse 0x30 lesen. Doch was mache 
ich mit dem Funktionszeiger an der Stelle?

Beim ausführen der Funktion füllt sich das Array val[] mit den Werten 
des Slaves, wozu muss ich den Wert des Zeigers mitgeben?

Danke, Gruß
Matthias

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

1. Da ist kein Funktionszeiger
2. Du übergibst ein Array (val) vom typ u08 und die Funktion füllt dir 
das.

lg
Christopher

von Matthias M. (Gast)


Lesenswert?

u08 *val <- Ist das kein Zeiger?

Sprich das muss so aussehen?

u08 val[]; // Deklaration des Arrays val

void TWI_read(0x30, val[], 4); // Array val wird gefüllt

val[2]; // Wert des 2. Bytes vom Slave

Stimmt das so?

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

eher so

u08 val[4];
void TWI_read(0x30, val, 4);

PS: val[2] ist das dritte Byte ;-)

lg

von Matthias M. (Gast)


Lesenswert?

OK! Danke, werd das nachher mal ausprobieren! :)

von Matthias M. (Gast)


Lesenswert?

> PS: val[2] ist das dritte Byte ;-)

War klar, ist mir kurz nach dem Absenden schon aufgefallen, werd mich 
dann wohl doch mal anmelden müssen hier...


Nochmals rein zum Verständnis... was bewirkt denn der Stern?

von Daniel R. (daro6)


Lesenswert?

Matthias M. schrieb:
>> PS: val[2] ist das dritte Byte ;-)
>
> War klar, ist mir kurz nach dem Absenden schon aufgefallen, werd mich
> dann wohl doch mal anmelden müssen hier...
>
>
> Nochmals rein zum Verständnis... was bewirkt denn der Stern?

Schau am besten mal in ein gutes C-Buch(geht ja auch online).
Stichwort Array/Pointer.
Mit dem Stern erzeugst du einen u08-Pointer.

von Garden (Gast)


Lesenswert?

* bedeutet derefenzieren. Also "Inhalt von".
Hat natürlich etwas mit Zeigern zu tun.
Der Name eines Arrays ist ein Zeiger auf des erste Element.

Hier einmal aufgedröselt in einem Video.

http://et-tutorials.de/3368/pointer-in-c/

von W.S. (Gast)


Lesenswert?

Matthias M. schrieb:
> was bewirkt denn der Stern?

Tja, das ist eben eine der vielen Ärgerlichkeiten von C, daß seine 
Autoren nur bis zu ihrem jeweiligen Mützenrand gedacht haben und 
wahrscheinlich aus nem angeborenen Sprachfehler heraus darauf bedacht 
waren, möglichst keine echten Wörter (also mehrere zusammenhängende 
Buchstaben) in C zu benutzen. Deshalb all die vielen Mehrdeutigkeiten 
bei den anstelle von Wörtern benutzten Sonderzeichen.
Beispiele:

A*B
A* *B
A**B
A* *(*B)
*A*B
A/*B*/   ;-)
char *B
char* B
(char*) B
es hat fast immer ne andere Bedeutung, die man erlernen muß - großartig 
gelle? Es hat mal Wettbewerbe gegeben, wer den unverständlichsten C-Code 
schreibt.

Aber mal im Ernst: A = *B; heißt A wird geladen mit dem Wert, der dort 
im Speicher steht, wo B draufzeigt. Als was dieses Stück Speicher 
angesehen wird, hängt von der Definition von B ab.

W.S.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

W.S. schrieb:
> Tja, das ist eben eine der vielen Ärgerlichkeiten von C,

... daß es nicht als Sprache erdacht wurde, um anderen das Programmieren 
beizubringen, sondern als Sprache, um damit zu programmieren.

Nimms hin.

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.