http://media.digikey.com/pdf/Data%20Sheets/Bosch/BMA020.pdf
http://www.mikrocontroller.net/articles/BMA020
So, hallo wieder mal :D
Hier drüber ist gleich mal das Datenblatt von dem Sensor um den es geht!
1 | Initialisierung (Funktioniert auch, nur ein Teil davon, weil ich auch LCD und Abstands-sensor initialisiere!)
|
2 | //Einrichten Beschleunigungssensor, bit 7-5 von Register 0x14 müssen gespeichert werden !
|
3 | uint8_t control;
|
4 | i2c_start(addr_asens_norm + I2C_WRITE);
|
5 | i2c_write(0x14);
|
6 | i2c_rep_start(addr_asens_norm + I2C_READ);
|
7 | control=i2c_readAck();
|
8 | control=control & 0xE0; // save bits 7,6,5
|
9 | control = control | (0x02 << 3); // Range 8G (10)
|
10 | control = control | 0x06; // Bandwidth 25 Hz 000
|
11 | i2c_rep_start(addr_asens_norm + I2C_WRITE);
|
12 | i2c_write(0x14);
|
13 | i2c_write(control);
|
14 |
|
15 | i2c_rep_start(addr_asens_norm + I2C_READ);
|
16 | i2c_write(0x15);
|
17 | control=i2c_readAck();
|
18 | control=control & 0x80; //Save Default settings (SPI4=1)
|
19 | control|=(1<<5);
|
20 | i2c_rep_start(addr_asens_norm + I2C_WRITE);
|
21 | i2c_write(0x15);
|
22 | i2c_write(control);
|
23 | i2c_stop();
|
24 | //END a_sens
|
25 |
|
26 |
|
27 | void messung_asens_pointer_interrupt(int *pointer_asens)
|
28 | {
|
29 | int messwert;
|
30 | unsigned char HiB,LoB;
|
31 | i2c_start_wait(addr_asens_norm + I2C_WRITE); //Start Sequenz, Asens-Adresse + Write-Bit
|
32 | i2c_write(0x02); //Register wird ausgewählt
|
33 | //Register werden automatisch um 1 inkrementiert
|
34 | //wenn es ausgelesen wird
|
35 | i2c_rep_start(addr_asens_norm + I2C_READ);
|
36 |
|
37 | for(char i=0;i<3;i++)
|
38 | {
|
39 | LoB = (i2c_readAck()>>6); //LoB=0b0000 00XX
|
40 | HiB = i2c_readAck(); //HiB=0bXXXX XXXX
|
41 |
|
42 | messwert=HiB;
|
43 | messwert=(messwert<<2);
|
44 | messwert=messwert+LoB;
|
45 |
|
46 |
|
47 | if(messwert<512)
|
48 | messwert = messwert*4; //Messwert mit 1000 Multipliziert!0b00 0000 0001 = 0,004 normalerweise!
|
49 |
|
50 | else
|
51 | {
|
52 | messwert = (messwert-512)*4 - 2000;
|
53 | messwert = -messwert; //Negatives Vorzeichen Setzen!
|
54 | }
|
55 |
|
56 | *pointer_asens=messwert;
|
57 | pointer_asens++;
|
58 | }
|
59 | }
|
60 |
|
61 |
|
62 | //Hauptprogramm, starten der Messung
|
63 |
|
64 | messung_asens_pointer_interrupt(&(asens_messwert[0]));
|
So.. das Problem ist folgendes:
Ich bekomme die Daten schon (fast) richtig raus -.-
Also wenn g=0 ist in der realität spuckt mir das Programm in das Array
Werte +/- 50 ungefähr (in g*1000)
Wenn ich den Sensor aber jetzt so halte dass auf einer Achse die
komplette Erdbeschleunigung sein sollte, kommt ungefähr der Wert 260-280
raus...
Und ich weiß einfach nicht warum.....
Eigentlich müsste ja +/- 1000 ungefähr rauskommen!
Bitte falls Ihr noch irgendwas brauchen solltet, nicht zögern zu fragen
:D
Aber ich spinn schön langsam total ^^
Lg, Groebar
PS: Achso, am Sensor liegt es wahrscheinlich nicht, ich hab zwei hier
liegen, wobei ich bei dem einen beim ersten mal die "NEVER ever change
these Register" gechanged hab (14h).. deswegen dachte ich dass die Werte
bei dem anderen daran liegen und hab mir einen neuen organisiert!
Edith:
Achso, ich hab natürlich wieder mal die hälfte vergessen...
Ich programmier mit AVR Studio4,
Code in C (^^)
Atmega8
USB-Programmer
Kontaktiert sollte alles richtig sein, mit anderen Programmen läuft es,
Abstandsensor beispielsweise wird richtig verwendet...
Ich häng auch gleich noch ein bild dran wo ich markier wie ich den
beschleunigungssensor kontaktiert habe...