I2C --Kompass - gibt keine Werte ab

Gast #3599506
Lesenswert?

Slave reagiert sauber, Ackn usw.
aber nach dem Schreiben von 0x3D gibt er keine Werte aus.

Habe dann mal Arduino Sketch aufgebaut, der funktioniert.
habe dann selbe Anschlüsse genommen und wieder keine Werte - hat jemand 
ähnliche Erfahrungen gemacht - bin hier langsam am Verzweifeln.

Oszibilder sehen gleich aus, aber eben keine Werte auslesbar, nur 0en.
Angehängte Dateien:
Gast #3599551
Lesenswert?

ja Entschuldigung: Es handelt sich um das Miniboard mit dem HMC5883L.

Zun Code. Die Entprellgeschichten sind sicher nicht alle nötig ... Habe 
auch alles in eine Datei zusammengefasst, der übersicht wegen.

Danke Euch ...
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <avr/interrupt.h>
4

5
#include <stdlib.h>
6
      
7
#define    SDA          4
8
#define    SCL          5
9

10
#define    PortI2C        PORTC
11
#define    DDRI2C        DDRC
12
#define    PinI2C        PINC
13

14

15
#define    SDALo      DDRI2C |= (1<<SDA)      //auf GND ziehen
16
#define    SDAHi      DDRI2C  &= ~(1<<SDA)  // loslassen, ext. PullUp Wid. ziehen auf 5V
17
            
18
#define    SCLLo      DDRI2C |= (1<<SCL)
19
#define    SCLHi      DDRI2C  &= ~(1<<SCL)            
20
    
21
#define    Delay    5
22
    
23
uint8_t    KompassDaten[6];  
24

25

26
  void Entprell(uint16_t a)
27
  {
28
    while (a != 0)
29
    {
30
      a --;
31
    }
32
  }      
33

34

35
  void Start(void)
36
  {
37
    SDALo;
38
        Entprell(Delay);
39
    SCLLo;
40
        Entprell(Delay);
41
  }
42

43
  void Stop(void)
44
  {
45
    SCLHi;
46
        Entprell(Delay);
47
    SDAHi;
48
        Entprell(Delay);
49
  }
50

51

52
    void Pulse(void)
53
    {
54
          Entprell(Delay);
55
      SCLHi;
56
          Entprell(Delay);
57
      SCLLo;
58
          Entprell(Delay);
59
    }
60

61

62
  
63
  void TxI2C(uint8_t a)
64
  {
65
    uint8_t i;
66

67
    for(i=0;i<8;i++)
68
    {
69
      if(a & 128) SDAHi;    //MSB first
70
      else SDALo;
71

72
      a <<= 1;
73

74
      Pulse();
75
    }
76

77
  }
78

79
  uint8_t RxI2C(void)
80
  {
81
    SDAHi;      // los lassen
82

83
    uint8_t i,a=0;
84

85
    
86
    for(i=0;i<8;i++)
87
    {
88
      SCLHi;
89

90
        Entprell(Delay);
91
      
92
      if(PinI2C & (1<<SDA)) a |= (128>>i);
93

94
      SCLLo;
95

96
      Entprell(Delay);
97
    }
98

99
    return a;
100
  }
101

102

103
  void Ackn(void)
104
  {
105
    SDAHi;  
106
          Pulse();
107
    SDALo;
108
  }
109

110

111

112
int main(void)
113
{
114

115

116
    while(1)
117
    {
118
    Start();
119

120
    TxI2C(0x3C);  //Adresse und Bit0 = Read = 1   0011 110 1 
121

122
    Ackn();
123

124
    TxI2C(0x02);
125

126
    Ackn();
127

128
    Stop();
129

130
      Entprell(4);  //eigene Funktion für Delays
131

132
    Start();
133

134

135
    TxI2C(0x3D);  //Adresse und Bit0 = Read = 1   0011 110 1 
136

137
    Ackn();
138

139

140
    uint8_t i;
141

142
    for(i=0;i<6;i++)
143
    {
144
      KompassDaten[i] = RxI2C();
145

146
      Ackn();
147
    }
148

149

150
    Stop();
151

152

153
    Entprell(500);
154
  }
155
}
Gast #3599751
Lesenswert?

Ich habe noch was herausbekommen.

Wenn ich den Kompass vom laufenden Board trenne und wieder einstecke, 
gibt er auch keine Werte mehr. Nur mit Arduino Reset. Also ist es was 
mit der Initialisierung.

Gibt es da so was wie ein Reset im Quellcode?
Gast #3599774
Lesenswert?

Ach deshalb die PinC 4 und 5, weil die das mit den TwoWire - Registern 
von Atmel machen und nicht softwaremäßig, wie ich es wollte.
Sprich mit TWAR TWBR, TWSR usw. -- ja scheint besser zu sein, also werde 
ich mal die Hardware TwoWires probieren.

Danke erst mal.

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