
Zitat von
BMA020 Data sheet, version 1.2, Rel. 30 May 2008, page 9
Bits 5, 6 and 7 of register addresses 14h do contain critical sensor individual calibration data wich must not be changend or deleted by any means.
In order to proberly modify addresses 14h for range and/or bandwidth selection using bits 0, 1, 2, 3 and 4, it is highly recommended to read-out the complete byte, perform bit-slicing and write back the complete byte with unchanged bits 5, 6 and 7.
Otherwise the reported acceleration data may show incorrect results.
Also: Byte auslesen und dezimal und binär anzeigen. Danach neue Werte setzen und Byte zurückschreiben. Zur Kontrolle eine kleine Routine, zwei Tasten aufs Steckbrett als Wahlhelfer (Auswahl der Messwerte, Routinen, Bitposition und -änderung).
Getestet musste die richtige Funktion werden, bevor der erste Schreibvorgang gemacht wird. Dazu ist das Byte 14h im Auslieferungszustand nicht nützlich: -128/0b10000000, da musste zum Test der Ausgabe ein anderer Wert her. Jetzt läuft die Darstellung glaubhaft und prima.
............Bild hier
Auf den kurzen Code zur int-nach-bin-Wandlung bin ich fast stolz. Siehe z.B. Zeile 45 - 48.
Code:
// ------------------------------------------------------------------------------ -
// Lesen des Register 0x14, Range und Bandwidth
//
i2c_init(); //
ret = i2c_start (I2C_BMA_W); // Schreibbefehl auf Device-Adresse 0x70
ret = i2c_write (0x14); // Zu lesende Adresse für Range+Bandwidth
i2c_stop (); // Stop
//
ret = i2c_start (I2C_BMA_R); // Lesen bis zum Stop auf Device-Adresse 0x71
brb = i2c_read (NAK); // brb = Byte mit Range + Bandwidth
i2c_stop (); // Steuerwert Range+Bandwidth wurde gelesen
brb = 86; // <<<<<##### Diese Zuweisung NUR testweise <<<<<#####
//
// ------------------------------------------------------------------------------ -
// ------------------------------------------------------------------------------ -
// Wert von Range und Bandwidth dezimal und binär aufs LCD schreiben
//
lcd_clrscr(); // loesche LCDisplay; Cursor Zeile 0 Spalte 0
// 012345678901234567890123
lcd_puts ("Rng+Bndwth : dez"); //
//
itoa(brb, zahlwort, 10); //
lcd_gotoxy(14, 0); // Spalte 11 {0 bis 23} in Zeile 0 {0 bis 1}
lcd_puts(zahlwort); // = neunte Spalte in erster Zeile
lcd_gotoxy( 0, 1); // Spalte 0 in Zeile 1
// 012345678901234567890123
lcd_puts ("Biner = - - - - - - bin"); // = nullte Spalte in zweiter Zeile
ae[0] = 225; // Umlaut a
ae[1] = 0; // Stringende
lcd_gotoxy(3, 1); // Spalte 3 {0 bis 23} in Zeile 1 {0 bis 1}
lcd_puts(ae); // = schreibe "ä" von Binär
//lcd_puts ("Binär = 0b bbbb bbbb bin "); // Binär = korrekt geschrieben
//
// ------------------------------------------------------------------------------ -
// bsg[15] für Konvertierung nach binär und Darstellung: "0b bbbb bbbb"
//
bsg[0] = 48; // dez48 = ASCII 0
bsg[1] = 98; // dez98 = ASCII b
bsg[2] = 30; // dez30 = ASCII Space
//
bsg[7] = 30; // dez30 = ASCII Space
// Bis hierher ist es nur "Vorspann"
for (ia = 1; ia <= 4; ia++) // Erstes Nibble übersetzen nach Binär
{ //
bsg [ia+2] = ((IsBitSet (brb, (8-ia))) + 48);
} // Ende for (ia = 1; ia <= 4; ia++)
// Die ersten vier Bits sind abgearbeitet
for (ia = 5; ia <= 8; ia++) // Übersetzen des zweiten Nibbels nach Binär
{ //
bsg [ia+3] = ((IsBitSet (brb, 8-ia)) + 48);
} // Ende for (ia = 7; ia == 4; ia--)
// Die vier Bits des zweiten Nibbels sind abgearbeitet
// ------------------------------------------------------------------------------ -
// ------------------------------------------------------------------------------ -
// Null in das Feld des Ausgabestrings als Abschlusskennung
bsg[12] = 0; //
// Dekodieren ist abgeschlossen
// ------------------------------------------------------------------------------ -
// ------------------------------------------------------------------------------ -
// Binären Wert aufs LCD schreiben
Lesezeichen