Hallo zusammen,
habe mir einen MPU6000 zugelegt und habe Probleme diesen auszulesen.
Zunächst mal meinen abgespeckten Code und den Schaltplan im Anhang:
1 | #define RF_PORT PORTB
|
2 | #define RF_DDR DDRB
|
3 | #define RF_PIN PINB
|
4 |
|
5 | #define SDI 3
|
6 | #define SCK 5
|
7 | #define CS6 1
|
8 | #define SDO 4
|
9 |
|
10 | #define GYRO_XOUT 0x43434444 //Hier bin ich mir unsicher
|
11 |
|
12 | #ifndef cbi
|
13 | #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
|
14 | #endif
|
15 | #ifndef sbi
|
16 | #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
|
17 | #endif
|
18 |
|
19 | typedef union conver_ {
|
20 | unsigned long dw;
|
21 | unsigned int w[2];
|
22 | unsigned char b[4];
|
23 | } CONVERTDW;
|
24 |
|
25 | typedef union conver2_ {
|
26 | unsigned int w;
|
27 | unsigned char b[2];
|
28 | } CONVERTW;
|
29 |
|
30 | void mpu6000_init()
|
31 | {
|
32 | RF_DDR |= (1<<SDI)|(1<<SCK)|(1<<CS6);
|
33 | RF_PORT |= (1<<CS6);
|
34 | SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);
|
35 | }
|
36 |
|
37 | signed short mpu6000_getdata(unsigned long wert)
|
38 | {
|
39 | CONVERTDW val;
|
40 | val.dw = wert;
|
41 |
|
42 | //????
|
43 | val.b[3] &= (1<<7); //lesen
|
44 | val.b[2] &= (1<<7); //lesen
|
45 | val.b[1] &= (1<<7); //lesen
|
46 | val.b[0] &= (1<<7); //lesen
|
47 |
|
48 | cbi(RF_PORT, CS6);
|
49 |
|
50 | SPDR = val.b[3];
|
51 | while(!(SPSR & (1<<SPIF)));
|
52 | val.b[3] = SPDR;
|
53 |
|
54 | SPDR = val.b[2];
|
55 | while(!(SPSR & (1<<SPIF)));
|
56 | val.b[2] = SPDR;
|
57 |
|
58 | SPDR = val.b[1];
|
59 | while(!(SPSR & (1<<SPIF)));
|
60 | val.b[1] = SPDR;
|
61 |
|
62 | SPDR = val.b[0];
|
63 | while(!(SPSR & (1<<SPIF)));
|
64 | val.b[0] = SPDR;
|
65 |
|
66 | sbi(RF_PORT, CS6);
|
67 |
|
68 | CONVERTW val2;
|
69 | val2.b[1] = val.b[2];
|
70 | val2.b[0] = val.b[0];
|
71 | return (int16_t) val2.w;
|
72 | }
|
73 |
|
74 | int main(void)
|
75 | {
|
76 | char data[6];
|
77 | while(1)
|
78 | {
|
79 | mpu6000_init();
|
80 | itoa((int16_t)mpu6000_getdata2((int32_t)GYRO_XOUT), data, 10);
|
81 | //senden der daten
|
82 | .....
|
83 | }
|
84 | }
|
An dem SPI hängt nicht nur der MPU sonder auch ein RFM12 zum übertragen
der Daten. Jedenfalls sind die Daten sehr unterschiedlich, obwohl der
Sensor überhaupt nicht bewegt wird. Die Daten sehen so aus:
0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448
-16384 06384 06384 06384 06384 06384 06384 -32768 02768 02768 02768
02768 02768 02768 02768 02768 02768 02768 02768 16384 0384 0384 0384
0384 0384 0384 0384 0384 0384 0384 0384 0384 0384 0384 0384 0384 0384
24320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320
0320 0320 0320 0320 -16384 06384 06384 06384 06384 06384 16128 0128 0128
0128 0128 0128 0128 0128 0128 0128 0128 0128 -16384 06384 06384 06384
06384 06384 06384 06384 06384 06384 06384 06384 06384 06384 06384 06384
06384 06384 06384 24320 0320 0320 0320 0320 0320 0320 0320 0320 0320
0320 0320 0320 0320 0320 0320 0320 0320 -16384 06384 06384 06384 06384
06384 06384 -16640 06640 06640 06640 06640 06640 06640 06640 06640 06640
06640 32512 0512 0512 0512 0512 0512 0512 0512 0512 0512 0512 0512 0512
0512 0512 0512 0512 0512 0512 32512 0512 0512 0512 0512 0512 0512 0512
0512 0512 0512 0512 0512 0512 0512 0512 0512 0512 -256 256 06 06 06 06
06 16128 0128 0128 0128 0128 0128 0128 0128 0128 0128 0128 -256 056 056
056 056 056 056 056 056 056 16128 0128 0128 0128 0128 0128 0128 0128
-16384 06384 06384 06384 06384 06384 -24576 04576 04576 04576 04576
04576 04576 04576 04576 04576 04576 04576 04576 24320 0320 0320 0320
0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320
24320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320
0320 0320 0320 0320 -8448 0448
0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448
0448 0448-8448 0448 7936 036 036 036 036 036 036 036 036 036 036 036 036
036 036 036 036-256 056 056 056 056 056 056 056 056 056 056 056 056 056
056 056 056 056 -256 056 056 056 056 056 056 -24576 04576 04576 04576
04576 04576 04576 04576 04576 04576 04576 -8448 0448 0448 0448 0448 0448
0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 usw.
Merkwürdig ist, dass sich die Daten wiederholen. Es sieht für mich nicht
nach Rauschen o.ä. aus.
Bin mir nicht sicher ob das alles so stimmt wie ich es hier gelöst habe.
Jemand ne Idee woran es liegen könnte. Vllt hat auch schon jemand von
euch Code für den MPU6000 mit SPI geschrieben den er schicken könnte.
Gruß