Zitat 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