- LiTime Speicher und Akkus         
Ergebnis 1 bis 9 von 9

Thema: Frage zur RP6M256_I2CMasterLib.c

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Thorben W
    Registriert seit
    17.02.2012
    Ort
    Niedersachsen
    Beiträge
    108

    Frage zur RP6M256_I2CMasterLib.c

    Anzeige

    LiFePo4 Akku selber bauen - Video
    In der Datei RP6M256_I2CMasterLib.c die Zeilen 241 - 245
    Code:
    // 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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @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:
    Code:
    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).
    Gruß
    Dirk

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Thorben W
    Registriert seit
    17.02.2012
    Ort
    Niedersachsen
    Beiträge
    108
    Wenn ich unten dann noch zwei Sachen anfüge welche Bitwerte sind das dann
    Code:
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Thorben W Beitrag anzeigen
    Wenn ich unten dann noch zwei Sachen anfüge welche Bitwerte sind das dann
    Code:
    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:

    Code:
    interrupt_status.bumperRight = 0;
    .
    .
    if(interrupt_status.bumperLeft == 0) {
    .
    .
    Obwohl ich das so schreiben würde:
    Code:
    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
    Strom fließt auch durch krumme Drähte !

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @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.
    Gruß
    Dirk

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Thorben W
    Registriert seit
    17.02.2012
    Ort
    Niedersachsen
    Beiträge
    108
    Ja es funktioniert noch mit den front bumpern.
    Aber die neuen noch nicht
    Thorben

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Dirk Beitrag anzeigen
    @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
    Strom fließt auch durch krumme Drähte !

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @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.
    Gruß
    Dirk

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Thorben W
    Registriert seit
    17.02.2012
    Ort
    Niedersachsen
    Beiträge
    108
    Es funktioniert leider immer noch nicht.
    Hier das Programm und die geänderte Bibliothek RP6M256_I2CMasterLib.h RP6M256_I2CMasterLib.c fernsteuerung_mit_weg_aufze.c
    Wenn ich die höhen abfrage von der base (in einem extra programm ohne wifi modul angeschlossen) abfrage dann funktioniert es
    Thorben

Ähnliche Themen

  1. Frage zur Hadware
    Von Scuido im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 20.09.2008, 09:53
  2. Frage zur Erdung
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 04.11.2006, 18:44
  3. Frage zur H Brücke293
    Von vitja09 im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 16.10.2006, 18:38
  4. Frage zur RN-DIGI
    Von The Puma im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 5
    Letzter Beitrag: 30.05.2005, 15:35
  5. Frage zur Bügelmethode
    Von Adam im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 13.04.2005, 14:56

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus