C - Wie return von function bekommen und i2c Adresse erstellen?

OP #6224192
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
Gast #6224195
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
}
#6224199
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
OP #6224200
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
}
Gast #6224719
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.