Anfänger Verständnisfrage zu #define



  • #define CONFIG_REGISTER			(0x00<<1)
    #define CURRENT_OFFSET_REGISTER		(0x01<<1)
    #define CURRENT_GAIN_REGISTER		(0x02<<1)
    #define VOLTAGE_OFFSET_REGISTER		(0x03<<1)
    #define VOLTAGE_GAIN_REGISTER		(0x04<<1)
    #define CYCLE_COUNT_REGISTER		(0x05<<1)
    #define PULSE_RATE_REGISTER		(0x06<<1)
    #define LAST_CURRENT_REGISTER		(0x07<<1)
    #define LAST_VOLTAGE_REGISTER		(0x08<<1)
    #define LAST_POWER_REGISTER		(0x09<<1)
    #define TOTAL_ENERGY_REGISTER		(0x0A<<1)
    #define RMS_CURRENT_REGISTER		(0x0B<<1)
    #define RMS_VOLTAGE_REGISTER		(0x0C<<1)
    #define TIME_BASE_CALI_REGISTER		(0x0D<<1)
    #define STATUS_REGISTER			(0x0F<<1)
    #define INTERRUPT_MASK_REGISTER		(0x1A<<1)
    

    Hallo ich programmiere Arduinos in C und in einer Lib ist mir s.o. Aufgefallen.
    Warum hat der Autor seine #define mit einem einem Shift left versehen.
    Ihr C Leute verwendet dies häufig was ist der Grund dafür.


  • Mod

    Das sind Bitmasken.



  • vermutlich hat das nullte bit eine andere funktion und weil "0x1A << 1" dann verständlicher ist, als 0x36, hat man das so gemacht.

    also wenn du dir die register im handbuch anguckst, wirst du bestimmt die erklärung dafür bekommen.



  • Wade1234 schrieb:

    vermutlich hat das nullte bit eine andere funktion und weil "0x1A << 1" dann verständlicher ist, als 0x34, hat man das so gemacht

    ftfy. Das verwirrt sonst nur.
    <<1 bedeutet einfach eine Multiplikation mit 2. Das sieht im Code natürlich blöd aus:

    #define CONFIG_REGISTER         (0)
    #define CURRENT_OFFSET_REGISTER     (2)
    #define CURRENT_GAIN_REGISTER       (4)
    #define VOLTAGE_OFFSET_REGISTER     (6)
    #define VOLTAGE_GAIN_REGISTER       (8)
    #define CYCLE_COUNT_REGISTER        (10)
    #define PULSE_RATE_REGISTER     (12)
    #define LAST_CURRENT_REGISTER       (14)
    #define LAST_VOLTAGE_REGISTER       (16)
    #define LAST_POWER_REGISTER     (18)
    #define TOTAL_ENERGY_REGISTER       (20)
    #define RMS_CURRENT_REGISTER        (22)
    #define RMS_VOLTAGE_REGISTER        (26)
    #define TIME_BASE_CALI_REGISTER     (28)
    #define STATUS_REGISTER         (30)
    #define INTERRUPT_MASK_REGISTER     (52)
    

    Ich hoffe, dass ich keinen Fehler gemacht habe. Bitmasken sind das nicht. Es sieht nach Offsets relativ zu einem Zeiger aus - die entsprechenden Werte können durch Addition ausgelesen werden.



  • Danke für die Antworten.
    Ich habe nochmal im Datenblatt nachgeschaut und ja es macht Sinn

    Das Register wird folgendermaßen angesprochen.

    B7 B6 B5 B4 B3 B2 B1 B0
    0 W/R RA4 RA3 RA2 RA1 RA0 0

    Wenn der bekannte Wald mit seinen Bäumen nicht wäre.


Anmelden zum Antworten