I2C Problem benötige Hilfe

Gast #2124891
Lesenswert?

Hallo,

möchte folgende I2C benutzen um meinen RV3029-C2 anzusprechen!

bekomme die ganze Zeit 2 Fehler:

bit i2c_write(unsigned char output_data)
unsigned char i2c_read(bit send_ack)

vielleicht kann mir jemand helfen und tips geben wie ich diese 
wegbekomme.

MfG µC-Einsteiger
1
#define SDA     0x20; //PD5
2
#define SCL     0x40; //PD6
3

4
void delay_time(unsigned char delay);
5

6
#define I2CDELAY 6
7

8
void i2c_init(void)
9
{  
10
  PORTD |= SDA;    //setzen SDA
11
  PORTD |= SCL;    //setzen SCL
12
}
13

14
void i2c_start(void)
15
{    
16
  PORTD &= ~SDA;    //rücksetzen SDA  
17
  delay_time(I2CDELAY);
18
  PORTD &= ~SCL;    //rücksetzen SCL
19
  delay_time(I2CDELAY);
20
}
21

22
void i2c_stop(void)
23
{
24
  PORTD |= SCL;;
25
  delay_time(I2CDELAY);
26
  PORTD |= SDA;;
27
  delay_time(I2CDELAY);  
28
}
29

30
bit i2c_write(unsigned char output_data)
31
{
32
  unsigned char index;
33
  for (index=0; index<8; index++)
34
  {
35
    if (output_data & 0x80)  PORTD |= SDA; else PORTD &= ~SDA;
36
    delay_time(I2CDELAY);
37
    output_data = output_data << 1;
38
    PORTD |= SCL;
39
    delay_time(I2CDELAY);
40
    PORTD &= ~SCL;
41
    delay_time(I2CDELAY);
42
  }
43
  PORTD |= SDA;
44
  delay_time(I2CDELAY);
45
  PORTD |= SCL;
46
  delay_time(I2CDELAY);
47

48
  if (PORTD &= ~SDA)
49
  {
50
    PORTD &= ~SCL;
51
    delay_time(I2CDELAY);
52
    return 1;
53
  }
54
  else
55
  {
56
    PORTD &= ~SCL;
57
    delay_time(I2CDELAY);
58
    return 0;
59
  }
60
}
61

62
unsigned char i2c_read(bit send_ack)        
63
{
64
  unsigned char index, input_data;
65
  input_data = 0x00;
66
  PORTD |= SDA;
67
  delay_time(I2CDELAY);
68
  for (index=0; index<8; index++)
69
  {
70
    input_data = input_data << 1;
71
    PORTD |= SCL;
72
    delay_time(I2CDELAY);
73
    input_data = input_data | SDA;
74
    PORTD &= ~SCL;
75
    delay_time(I2CDELAY);
76
  }
77
  if (send_ack == 1) 
78
  {
79
    PORTD &= ~SCL;   
80
  }
81
  else 
82
  {
83
    PORTD |=SDA;
84
    delay_time(I2CDELAY);
85
    PORTD |=SCL;
86
    delay_time(I2CDELAY);
87
    PORTD &= ~SCL;
88
    delay_time(I2CDELAY);
89
    PORTD &= ~SDA;
90
    delay_time(I2CDELAY);
91
    return (input_data);
92
  }
93
}
94

95
void delay_time(unsigned char delay)
96
{
97
  unsigned char i;
98
  for (i=0; i<delay; i++);
99
}
Gast #2124939
Lesenswert?

Danke der erste Fehler ist behoben jetzt sagt er nur noch an dieser 
Stelle:

  delay_time(I2CDELAY);

  if (PORTD &= ~SDA)

error: expected ')' before ';' token

das ganze ist im write befehl

an was ich ebenso noch denken sollte is das sobald ich das ACK bit 
einlese umschalte auf Eingang!
#2124986
Lesenswert?

Mach die Makroersetzung
1
#define SDA     0x20; //PD5
und den Ersetzungstext setzt du jetzt an der bewussten Stelle mal ein.

Aus
1
  if (PORTD &= ~SDA)
wird dann durch die Textersetzung
1
  if (PORTD &= ~0x20;)
was fällt dir auf?

Makros sind reine Textersetzung. Der Text "SDA" wird durch den Text 
"0x20;" ersetzt, bevor alles durch den Compiler geht.

; in Makros sind meistens keine gute Idee!
Gast #2125004
Lesenswert?

@Karl Heinz: Danke!!!!!!

jetzt muss ich nur mal noch schauen wie ich das hinbekomme:

an was ich ebenso noch denken sollte is das sobald ich das ACK bit
einlese umschalte auf Eingang!

Dann sollte der I2C gehen! Oder mir gibt jemand gerade mal ein TIP

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren