Forum: Mikrocontroller und Digitale Elektronik I2C --Kompass - gibt keine Werte ab


von Jens (Gast)


Angehängte Dateien:

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.

von Gauss (Gast)


Lesenswert?

>I2C --Kompass
Auch wenn heute der 1 April ist, meinste es gibt nur DEINEN I2C 
--Kompass auf dem Markt?

von nga (Gast)


Lesenswert?

Welcher Prozessor, welche Bauteile?
Es gibt ja gott sei dank nur einen Kompasssensor...
Und der Fehler liegt in Zeile 42... also zeig lieber auch noch Code

von Jens (Gast)


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
}

von Jens (Gast)


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?

von Mike (Gast)


Lesenswert?

Jens schrieb:
> Gibt es da so was wie ein Reset im Quellcode?

Das Ding heißt beim Arduino nicht Reset, sondern initialize() und wird 
im Arduino setup() nach der Businitialisierung mit Wire.begin() 
aufgerufen.

von Jens (Gast)


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.

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.