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

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.