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.
>I2C --Kompass
Auch wenn heute der 1 April ist, meinste es gibt nur DEINEN I2C
--Kompass auf dem Markt?
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
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 | }
|
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.