Forum: Mikrocontroller und Digitale Elektronik Maskieren eines Chars.steh auf dem Schlauch;/


von Melow (Gast)


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
von dunno.. (Gast)


Lesenswert?

müsste das nicht && sein?
von Karl H. (kbuchegg)


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.
von Hans (Gast)


Lesenswert?

> unary '&' operand

Der Compiler erkennt das & als Adreßoperator.
von Gerhard K. (trueneo)


Lesenswert?

Versuche es mal mit: && -> Logisches UND

Mit dem & Operator weist man dem Pointer die Adresse einer Variablen zu.

pointervar = &variable
von Melow (Gast)


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
von DirkB (Gast)


Lesenswert?

Aufpasssen:
& ist die binäre (bitweise) UND-Verküpfung
&& ist die logische UND-Verküpfung
von ... (Gast)


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