PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Frage zur RP6M256_I2CMasterLib.c



Thorben W
12.07.2013, 19:22
In der Datei RP6M256_I2CMasterLib.c die Zeilen 241 - 245

// Bitmasks for comparision:
#define MASK_ACS 0b01100000 // the ACS Status bits...
#define MASK_BUMPER 0b00000110 // Bumper bits
#define MASK_RC5 0b00001000 // RC5 Reception bit
#define MASK_BATLOW 0b00000001 // Low Voltage bit

Was bedeuten diese Zeilen, wodurch sind diese Bitwerte festgelegt?

Thorben W

Dirk
12.07.2013, 22:41
@Thorben:

Das sind sog. "Bitmasken". Sie dienen dazu, bestimmte Bits aus einem Byte auszuwerten.
Wenn man z.B. einen Wert ermittelt wie: Wert = Var & MASK_ACS;
... und Var den Interrupt-Status enthält, dann ist Wert = 0, wenn beide ACS Status bits 0 sind.

Die Bitmasken dienen also dazu, die Bits des Interrupt-Status auszuwerten.
In der RP6M256_I2CMasterLib.h ist das Byte interrupt_status so definiert:

union {
uint8_t byte;
struct {
uint8_t batLow:1;
uint8_t bumperLeft:1;
uint8_t bumperRight:1;
uint8_t RC5reception:1;
uint8_t RC5transmitReady:1;
uint8_t obstacleLeft:1;
uint8_t obstacleRight:1;
uint8_t driveSystemChange:1;
};
} interrupt_status;
Da kannst du die Bitpositionen wiederfinden:
Z.B. ist batLow das Bit 0 im interrupt_status und genauso auch in der MASK_BATLOW Bitmaske (=0b00000001).

Thorben W
13.07.2013, 12:58
Wenn ich unten dann noch zwei Sachen anfüge welche Bitwerte sind das dann

union {
uint16_t byte;
struct {
uint8_t batLow:1;
uint8_t bumperLeft:1;
uint8_t bumperRight:1;
uint8_t RC5reception:1;
uint8_t RC5transmitReady:1;
uint8_t obstacleLeft:1;
uint8_t obstacleRight:1;
uint8_t driveSystemChange:1;
uint8_t hightbumperLeft:1;
uint8_t hightbumperRight:1;
};
} interrupt_status;

Vielleicht: 0b1100000000

Thorben

Klebwax
13.07.2013, 13:41
Wenn ich unten dann noch zwei Sachen anfüge welche Bitwerte sind das dann

union {
uint16_t byte;
struct {
uint8_t batLow:1;
uint8_t bumperLeft:1;
uint8_t bumperRight:1;
uint8_t RC5reception:1;
uint8_t RC5transmitReady:1;
uint8_t obstacleLeft:1;
uint8_t obstacleRight:1;
uint8_t driveSystemChange:1;
uint8_t hightbumperLeft:1;
uint8_t hightbumperRight:1;
};
} interrupt_status;

Ich dachte man macht ein solches Konstrukt, um die Bitmaske nicht zu benötigen:



interrupt_status.bumperRight = 0;
.
.
if(interrupt_status.bumperLeft == 0) {
.
.


Obwohl ich das so schreiben würde:

union {
uint16_t register;
struct {
int batLow:1;
int bumperLeft:1;
int bumperRight:1;
int RC5reception:1;
int RC5transmitReady:1;
int obstacleLeft:1;
int obstacleRight:1;
int driveSystemChange:1;
int hightbumperLeft:1;
int hightbumperRight:1;
};
} interrupt_status;

if (interrupt_status.register) { // wenn irgend ein Bit ungleich 0
.


MfG Klebwax

Dirk
13.07.2013, 14:03
@Thorben W:

Vielleicht: 0b1100000000
Genau.
Ob das Programm mit einer uint16_t interrupt_status Variable noch funktioniert, würde ich aber zuerst ohne deine Erweiterung einmal testen.

Thorben W
13.07.2013, 14:07
Ja es funktioniert noch mit den front bumpern.
Aber die neuen noch nicht
Thorben

Klebwax
13.07.2013, 16:34
@Thorben W:

Genau.
Ob das Programm mit einer uint16_t interrupt_status Variable noch funktioniert, würde ich aber zuerst ohne deine Erweiterung einmal testen.

Wenn mit Bitmasken gearbeitetet wird, meist nicht. Denn dann muß an jeder Stelle, wo eine Maske verwendet wird der Typ der Maske angepasst werden.

Wenn man die Bits der Union über ihren Namen und nur über ihren Namen anspricht, wie ich das oben gezeigt habe, dann funktioniert das auch mit 32 oder 64 Bit, ohne am vorhandenen Source zu ändern.

MfG Klebwax

Dirk
13.07.2013, 17:01
@Klebwax:
Du hast natürlich völlig Recht mit deinen beiden Posts!

Da es hier aber um eine zum RP6 gehörige Library geht, die offenbar von Thorben nur auf seine Zwecke angepaßt werden soll, müßte man nicht im großen Stil etwas an der Lib ändern.


Wenn mit Bitmasken gearbeitetet wird, meist nicht. Denn dann muß an jeder Stelle, wo eine Maske verwendet wird der Typ der Maske angepasst werden.
Hier ist die Maske ja eine Define-Direktive, die auch mit 16, 32 oder 64 Bit funktioniert. Alle Bits oberhalb der Byte-Grenze sind dann 0. Insofern muss man diese Maske nicht zwangsläufig ändern.

Thorben W
13.07.2013, 19:21
Es funktioniert leider immer noch nicht.
Hier das Programm und die geänderte Bibliothek 26001 26002 26000
Wenn ich die höhen abfrage von der base (in einem extra programm ohne wifi modul angeschlossen) abfrage dann funktioniert es
Thorben