Forum: Mikrocontroller und Digitale Elektronik C - Wie return von function bekommen und i2c Adresse erstellen?


von Max T. (millianmaxi)


Lesenswert?

Hallo....

ich bräuchte etwas Hilfe bei folgendem Code...


Header Datei
1
#include "main.h"
2
3
#define I2CADDRDDR DDRD
4
#define I2CADDRPORT PORTD
5
#define I2CADDRPIND PIND
6
#define I2CADDR1PIN PD2
7
#define I2CADDR2PIN PD1
8
#define I2CADDR3PIN PD0
9
10
int i2caddr1;
11
int i2caddr2;
12
int i2caddr3;
13
14
void i2c_readaddr_init(void);
15
void i2c_readaddr(void);

und dazu folgende C Datei
1
#include "main.h"
2
#include "i2c.h"
3
4
void i2c_readaddr_init(void) {
5
6
  I2CADDRDDR &= ~(1 << I2CADDR1PIN);
7
  I2CADDRDDR &= ~(1 << I2CADDR2PIN);
8
  I2CADDRDDR &= ~(1 << I2CADDR3PIN);
9
10
}
11
12
void i2c_readaddr(void) {
13
14
  if ( I2CADDRPIND & (1<<PIND2) ) {
15
      i2caddr1 = 1;
16
  } else {
17
    i2caddr1 = 0;  
18
  }
19
  
20
  if ( I2CADDRPIND & (1<<PIND1) ) {
21
      i2caddr2 = 1;
22
  } else {
23
    i2caddr2 = 0;  
24
  }
25
  
26
  if ( I2CADDRPIND & (1<<PIND0) ) {
27
      i2caddr3 = 1;
28
  } else {
29
    i2caddr3 = 0;  
30
  }
31
32
}

Wir bekomme ich jetzt hin das mit die i2c_readaddr function einen 
Rückgabewert liefert? Und vor allem wie bekomme ich daraus eine Adresse?

Also ich nutze die lib von Peter Fleurly!? und da gibt man die Adresse 
ja so an => 0x50 oder 0x60 <=

Kann ich da auch "normale" Zahlen nutzen?

Und wie bekomme ich daraus nun eine Adresse?

Also Low ist 0 und High ist 1.. ok.. Sagen wir wir fangen bei 50 an...

0 | 0 | 0 = 50
0 | 1 | 0 = 51
0 | 0 | 1 = 52

1 | 0 | 0 = 53
1 | 1 | 0 = 54
1 | 1 | 1 = 55

0 | 0 | 1 = 56
0 | 1 | 1 = 57

ok... aber wie bekomme ich das nun als Rückgabewert und vor allem als 
Adresse gesetzt?

also in etwa
1
addr = i2c_readaddr;
2
slave_address(addr);

Dankeschön

: Verschoben durch Moderator
von gähn (Gast)


Lesenswert?

1
unsigned int i2c_readaddr(void) {
2
  unsigned int wald_wiese = 0;
3
4
  if ( I2CADDRPIND & (1<<PIND2) ) {
5
      wald_wiese |= 1;
6
      i2caddr1 = 1;
7
  } else {
8
    i2caddr1 = 0;  
9
  }
10
  
11
  if ( I2CADDRPIND & (1<<PIND1) ) {
12
      i2caddr2 = 1;
13
      wald_wiese |= 2;
14
  } else {
15
    i2caddr2 = 0;  
16
  }
17
  
18
  if ( I2CADDRPIND & (1<<PIND0) ) {
19
      wald_wiese |= 4;
20
      i2caddr3 = 1;
21
  } else {
22
    i2caddr3 = 0;  
23
  }
24
 
25
  return wald_wiese;
26
27
}

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

das Bit vom dritten Eingang kannst Du zwei Stellen nach links schieben, 
i2caddr1 = (1 << 2);

das Bit vom zweiten Eingang um eine Stelle nach links schieben,
i2caddr2 = (1 << 1);

das Bit vom ersten Eingang nicht links schieben, i2caddr3 = (1<<0);

Bits setzen durch verodern:
i2c_readaddr = i2caddr1 | i2caddr2 |  i2caddr3 ;


return (i2c_readaddr );


mfG

von Max T. (millianmaxi)


Lesenswert?

Super... vielen Dank... das werde ich mal versuchen

ich habe mich jetzt so dahin "gequält"
1
#include "main.h"
2
#include "i2c.h"
3
4
int i2caddr1;
5
int i2caddr2;
6
int i2caddr3;
7
8
int i2cval = 50;
9
10
void i2c_readaddr_init(void) {
11
12
  I2CADDRDDR &= ~(1 << I2CADDR1PIN);
13
  I2CADDRDDR &= ~(1 << I2CADDR2PIN);
14
  I2CADDRDDR &= ~(1 << I2CADDR3PIN);
15
16
}
17
18
int i2c_readaddr(void) {
19
20
  int i2caddr = i2cval;
21
22
  if ( I2CADDRPIND & (1<<PIND2) ) {
23
      i2caddr1 = 1;
24
  } else {
25
    i2caddr1 = 0;  
26
  }
27
  
28
  if ( I2CADDRPIND & (1<<PIND1) ) {
29
      i2caddr2 = 1;
30
  } else {
31
    i2caddr2 = 0;  
32
  }
33
  
34
  if ( I2CADDRPIND & (1<<PIND0) ) {
35
      i2caddr3 = 1;
36
  } else {
37
    i2caddr3 = 0;  
38
  }
39
40
  if (i2caddr1 == 0 && i2caddr2 == 0 && i2caddr3 == 0) {
41
    i2caddr = i2cval + 0;
42
  }
43
  
44
  if (i2caddr1 == 0 && i2caddr2 == 1 && i2caddr3 == 0) {
45
    i2caddr = i2cval + 1;
46
  }
47
  
48
  if (i2caddr1 == 0 && i2caddr2 == 0 && i2caddr3 == 1) {
49
    i2caddr = i2cval + 2;
50
  }
51
  
52
  if (i2caddr1 == 1 && i2caddr2 == 0 && i2caddr3 == 0) {
53
    i2caddr = i2cval + 3;
54
  }
55
  
56
  if (i2caddr1 == 1 && i2caddr2 == 1 && i2caddr3 == 0) {
57
    i2caddr = i2cval + 4;
58
  }
59
  
60
  if (i2caddr1 == 1 && i2caddr2 == 1 && i2caddr3 == 1) {
61
    i2caddr = i2cval + 5;
62
  }
63
  
64
  if (i2caddr1 == 0 && i2caddr2 == 0 && i2caddr3 == 1) {
65
    i2caddr = i2cval + 6;
66
  }
67
  
68
  if (i2caddr1 == 0 && i2caddr2 == 1 && i2caddr3 == 1) {
69
    i2caddr = i2cval + 7;
70
  }
71
72
  return i2caddr;
73
74
}

von foobar (Gast)


Lesenswert?

Mach nicht so ein Gehampel.
1
#include "main.h"
2
#include "i2c.h"
3
4
#define I2CADDRBASE 50
5
6
void i2c_readaddr_init(void)
7
{
8
  I2CADDRDDR &= ~(1 << I2CADDR1PIN);
9
  I2CADDRDDR &= ~(1 << I2CADDR2PIN);
10
  I2CADDRDDR &= ~(1 << I2CADDR3PIN);
11
}
12
13
int i2c_readaddr(void)
14
{
15
  int addr = I2CADDRBASE;
16
17
  if (I2CADDRPIND & (1 << I2CADDR1PIN))
18
    addr += 1;
19
  if (I2CADDRPIND & (1 << I2CADDR2PIN))
20
    addr += 2;
21
  if (I2CADDRPIND & (1 << I2CADDR3PIN))
22
    addr += 4;
23
24
  return addr;
25
}

von Dirk B. (dirkb2)


Lesenswert?

50 ist aber nicht 0x50 (das ist 80)

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.