Forum: Compiler & IDEs Frage zu Funktion in Lib für RFM69


von Hoffnung (Gast)


Angehängte Dateien:

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...

von Michael U. (amiga)


Lesenswert?

Hallo,

der eingestellte Sequencermode des Fifo soll erhalten bleiben, deshalb 
liest er die zurück. & 0xE0 hätte es auch getan, die Bits 0/1 sind ja 
immer 0.

Gruß aus Berlin
Michael

von Sascha W. (sascha-w)


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

von Hoffnung (Gast)


Lesenswert?

Ah, o.k., so verstehe ich es. Danke!

von Peter Patzich (Gast)


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.

von Gerd Graetzich (Gast)


Lesenswert?

Also im Artikel hier steht es auch so: 
https://www.mikrocontroller.net/articles/NRF24L01_Tutorial

Wird dann wohl nicht so verkehrt sein.

von Lutz (Gast)


Lesenswert?

In der WILD-Zeitung steht heute vermutlich auch wieder so Einiges. Ist 
es deshalb wahr?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.