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.
-
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 SinnDas Register wird folgendermaßen angesprochen.
B7 B6 B5 B4 B3 B2 B1 B0
0 W/R RA4 RA3 RA2 RA1 RA0 0Wenn der bekannte Wald mit seinen Bäumen nicht wäre.