Frage zu Funktion in Lib für RFM69

Gast #5833250
Lesenswert?

Hallo,
nach laaanger Pause will ich mal wieder selber irgendwas programmieren, 
um nicht ganz einzurosten. Es geht um eine Verständnisfrage zu C (bzw. 
C++) bei der Lib zum RFM69. Der screenshot in der Anlage zeigt das 
Register, um das es geht.
1
#define RF_OPMODE_TRANSMITTER         0x0C     // also 00001100
2
...
3
writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_TRANSMITTER);

Hier wird der Inhalt des Registers REG_OPMODE mit 0xE3 verUNDet, danach 
mit 00001100 verODERert wieder zurückgeschrieben.

Warum das verUNDen? Kann man in diesem Fall nicht einfach den Inhalt von 
REG_OPMODE mit 00001100 verODERn? Es kommt doch das Selbe raus, da die 
Maske mit 00001100 auch 8 bit hat und bit 0 und 1 hier egal sind (RO, 
unused, allways read as 00). Oder etwa doch nicht??? Dann wird es wohl 
tatsächlich höchste Zeit, etwas gegen den Rost zu tun...
Angehängte Dateien:
#5834069
Lesenswert?

Hoffnung schrieb:
>
1
> #define RF_OPMODE_TRANSMITTER         0x0C     // also 00001100
2
> ...
3
> writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | 
4
> RF_OPMODE_TRANSMITTER);
5
>
>
> Hier wird der Inhalt des Registers REG_OPMODE mit 0xE3 verUNDet, danach
> mit 00001100 verODERert wieder zurückgeschrieben.
>
> Warum das verUNDen? Kann man in diesem Fall nicht einfach den Inhalt von
> REG_OPMODE mit 00001100 verODERn?
Der Befehl soll den MODE einstellen, damit das unabhängig vom vorherigen 
Zustand der 3 Bits funktioniert müssen diese erst mal gelöscht werden.
Wenn der Mode zuvor Receiver war 100 und dann noch die Bits für 
Transmitter 011 gesetzt werden hast du eine ungültige Einstellung 111.

Sascha
Gast #5893013
Lesenswert?

Gut, das habe ich jetzt auch verstanden. Aber bei der Library für 
nRF24L01+ steht z.B.:
1
#define W_REGISTER    0x20 // 0010 0000
2
#define REGISTER_MASK 0x1F // 0001 1111
3
...
4
*ptx++ = ( W_REGISTER | ( REGISTER_MASK & reg ) );
Warum wird denn hier mit der Registermaske gearbeitet? Es werden doch 8 
bit an eine 8 bit große Speicherstelle geschrieben. Also alles mit dem 
Wert von der rechten Seite überschrieben. Da hätte man doch einfach
1
*ptx++ = ( W_REGISTER | reg );
nehmen können? Es gibt da ja kein Register mit einer Adresse > 1D. Würde 
ja auch nicht gehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren