INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Bitweiser Operatoren am Beispiel ADXL
30.11.2019, 14:43
Beitrag #1
Bitweiser Operatoren am Beispiel ADXL
Hallo Liebe Community,

ich bin neu hier in dem Forum und habe mal eine Verständnisfrage, da ich mich tiefer mit der Materie beschäftigen möchte. Ich habe zwei Libraries ausprobiert, die von Adafruit GitHub_Adafruit
und die von Sparkfun
Github_Sparkfun

Konkret geht es um die Einstellung des Messbereiches des ADXL345. Bei Sparkfun, ist es für mich nachvollziehbar, hier wird es mit Switch/Case gelöst.
Code:
void ADXL345::setRangeSetting(int val) {
    byte _s;
    byte _b;

    switch (val) {
        case 2:
            _s = B00000000;
            break;
        case 4:
            _s = B00000001;
            break;
        case 8:
            _s = B00000010;
            break;
        case 16:
            _s = B00000011;
            break;
        default:
            _s = B00000000;
    }
    readFrom(ADXL345_DATA_FORMAT, 1, &_b);
    _s |= (_b & B11101100);
    writeTo(ADXL345_DATA_FORMAT, _s);
}
Bei Adafruit
Code:
void Adafruit_ADXL345_Unified::setRange(range_t range)
{
  /* Read the data format register to preserve bits */
  uint8_t format = readRegister(ADXL345_REG_DATA_FORMAT);

  /* Update the data rate */
  format &= ~0x0F;
  format |= range;
  
  /* Make sure that the FULL-RES bit is enabled for range scaling */
  format |= 0x08;
  
  /* Write the register back to the IC */
  writeRegister(ADXL345_REG_DATA_FORMAT, format);
  
  /* Keep track of the current range (to avoid readbacks) */
  _range = range;
}

Um das besser zu verstehen, habe ich auf der Konsole ein kleines Programm erstellt und egal welche Werte ich für range in der Adafruit eingebe, kommen nie die richtigen zwei Endbits heraus, mache ich etwas falsch oder ist die Lib ka... . Für range sind zulässig als int 2,4,8,16.

Mein Testprogramm :
Code:
#include <iostream>
#include <stdio.h>

int main(){
    unsigned char BIT= 0x0;
    int anz;
    
    BIT&= ~0x0F;
    BIT|= 2;
    BIT|= 0x08;
    
    for (anz=sizeof(BIT)*8;anz>0 ; anz--){
        if(((BIT>>7)%2)==0){printf ("0");}
        else{ printf("1");}
        BIT<<=1;
    }
}

Ausgabe für range = 2 ==> 00001010
Ausgabe für range = 4 ==> 00001100
Ausgabe für range = 8 ==> 00001000
Ausgabe für range = 16 ==> 00011000

und die Tabelle mit den Endbits und dem Register auf Seite 17 rechts unten https://www.sparkfun.com/datasheets/Sens...1575031422

Vielen Dank und ein schönes WE !
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.11.2019, 15:04
Beitrag #2
RE: Bitweiser Operatoren am Beispiel ADXL
Die Lösung liegt in der Lib:
Code:
typedef enum
{
  ADXL345_RANGE_16_G          = 0b11,   // +/- 16g
  ADXL345_RANGE_8_G           = 0b10,   // +/- 8g
  ADXL345_RANGE_4_G           = 0b01,   // +/- 4g
  ADXL345_RANGE_2_G           = 0b00    // +/- 2g (default value)
} range_t;
range_t ist kein Integer, sondern beschreibt die beiden niederwertigsten Bits.

Code:
format &= ~0x0F;  // auch format &=0xF0; setzt die unteren 4 Bit auf 0
format |= range;   // setzt die unteren beiden Bit gemäß dem range_t
  
format |= 0x08;  // setzt das Bit mit der Wertigkeit 8 (B1000)

Bei solchen Sachen immer erst mal in der Headerdatei der Lib schauen, wie die Typen definiert sind.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.11.2019, 15:31
Beitrag #3
RE: Bitweiser Operatoren am Beispiel ADXL
Smile
Super Tommy56, vielen Dank für die schnelle Antwort !
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Kompass kalibrieren - GY-271/QMC5883L - Beispiel-Code? Arduinero 0 1.184 29.01.2019 16:57
Letzter Beitrag: Arduinero
  Erweiterung Beispiel-Sketch "RF24 Network - hello world" MaHa1976 0 1.367 25.03.2015 21:46
Letzter Beitrag: MaHa1976
  Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten Marlox 42 19.862 28.12.2014 22:49
Letzter Beitrag: Marlox
  Beispiel für IF Benutzung Lazzard 0 2.964 13.01.2013 18:07
Letzter Beitrag: Lazzard

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste