Forum: Mikrocontroller und Digitale Elektronik I2C Problem benötige Hilfe


von µC-Einsteiger (Gast)


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
}

von Hans W. (hans_w30)


Lesenswert?

Hy,
Also was ist denn bit für ein Datentyp?
Ich kenn den nicht versuch mal anstatt bit ein bool.
Hier mal die gängigen Datentypen:
http://www.das-koenigliche-wir.de/Semester%204/Softwaretechnik%201/cref/CONCEPT/data_types.html

Gruß Hans

von µC-Einsteiger (Gast)


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!

von Hans W. (hans_w30)


Lesenswert?

Was möchtest du denn eigentlich mit
1
  if (PORTD &= ~SDA)
 bewirken?

Dir ist klar das das kein Vergleich ist sondern das du PORTD setzt.
Schau dir vielleicht nochmal die Grundlagen an.

 http://de.wikibooks.org/wiki/C-Programmierung:_Ausdr%C3%BCcke_und_Operatoren

von µC-Einsteiger (Gast)


Lesenswert?

Möchte hier SDA == 0 setzen

von µC-Einsteiger (Gast)


Lesenswert?

µC-Einsteiger schrieb:
> Möchte hier SDA == 0 setzen


Bin ja schon soweit das ich nicht

if (SDA ==0)

schreiben darf. Dachte schon an diese Schreibweise

if (!(PORTD & (SDA)))

von Karl H. (kbuchegg)


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!

von Frank B. (f-baer)


Lesenswert?

µC-Einsteiger schrieb:
> µC-Einsteiger schrieb:
>> Möchte hier SDA == 0 setzen
>

Du solltest nie anstatt einer Bedingung Anweisungen setzen!

> Bin ja schon soweit das ich nicht
>
> if (SDA ==0)
>
> schreiben darf.

Richtig, SDA selektiert ja nur das Bit im Register.

> Dachte schon an diese Schreibweise
>
> if (!(PORTD & (SDA)))

Das sollte funktionieren.

von µC-Einsteiger (Gast)


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

von µC-Einsteiger (Gast)


Lesenswert?

@Frank Bär: ja das ganze funktioniert jetzt dank Karl Heinz jetzt sollte 
ich nur noch das mit dem ACK-Bit hinbekommen!

von µC-Einsteiger (Gast)


Lesenswert?

Funktion ist mitlerweile gegeben nur beim testen übr die asugabe der 
seriellen Schnittstelle wollte ich das er 03:05 ausgibt doch er gibt 
255:255 aus. weis jemand event mehr dazu?

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.