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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.