Maskieren eines Chars.steh auf dem Schlauch;/

Gast #2327769
Lesenswert?

Nabend,

Folgendes Problem:

#define ident_ID 0xD0;
UDR = ident_ID & pow(2,(7-countTimer));

Dieser Code soll mir immer eine Stelle von ident_ID übermitteln.
Angenommen ident_ID ist 10011101 soll folgende Übertragung stattfinden:
1
0
0
1
1
1
0
1

Aber immer wenn ich den Code kompiliere kommt folgender Fehler:
../main.c:21: error: lvalue required as unary '&' operand

Irgendwie steh ich grad aufm Schlauch, kann ich nicht einfach 2 Werte 
mit dem "&" Operator Logisch-UND-verknüpfen?

LG
#2327774
Lesenswert?

No.

Dafür willst du ganz sicher nicht pow benutzen.

Mach dir einen unsigned char, in den du eine 0x01 reinschreibst und mit 
jedem Durchgang durch die Schleife, die das nächste Bit abarbeiten soll, 
schiebst du die Maske mittels << um eine Stelle nach links.

(Oder 0x80 in die Maske laden und mit >> um 1 Stelle nach rechts 
schieben. Je nachdem ob du MSB first rausbringen willst oder LSB).


Und darüber, was wohl der ; in

#define ident_ID 0xD0;

anrichtet solltest du auch noch einmal nachdenken, denn der führt zu 
deiner Fehlermeldung.
Gast #2327806
Lesenswert?

Ah perfekt jez hab ichs:
UDR = ((ident_ID & (0x80>>countTimer))>>(7-countTimer)) & 0x01;

Das ";" bei dem #define is mir dazwischen gerutscht, sry:)
Also vielen Dank, Karl Heinz Buchegger dein Tip war goldwert.
Und && bringt nicht, es muss der & Operator benutzt werden.
LG
Gast #2328088
Lesenswert?

Melow schrieb:
> UDR = ((ident_ID & (0x80>>countTimer))>>(7-countTimer)) & 0x01;

Das ist doppelt gemoppelt.
Entweder:
1
UDR = (ident_ID & (0x80 >> countTimer)) >> (7 - countTimer);
Oder besser:
1
UDR = (ident_ID >> (7 - countTimer)) & 0x01;
Was ist denn countTimer? Wenn man den rückwärts laufen läßt, spart man 
sich auch die Subtraktion.

Noch besser wäre ident_ID in eine Variable und diese bei jedem Durchlauf 
um 1 shiften
1
uint8_t id = ident_ID
2
UDR = (id & 0x80) ? 1 : 0;
3
id <<= 1;

Wenn man dann die Bits der ID auch noch umdreht, würde sowas in der Art 
reichen:
1
#define ident_ID 0x0B  // bit reversed 0xD0
2
uint8_t id = ident_ID
3
UDR = id & 0x01;
4
id >>= 1;

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