Forum: Compiler & IDEs Register ansprechen


von spyder (Gast)


Lesenswert?

hallo!

hab da mal eine grundsätzliche frage:

warum funktioniert while((PIND & (1<<PIND2))){};

aber das while(((PIND2)==1)){}; und das while((PIND&0x02)==1)){}; 
nicht??

er soll solange in der while-schleife bleiben, bis sich PD2 geändert auf 
0 hat. warum sind die beiden nicht gleichwertig? ich hoffe mal ich hab 
mich da jetzt nirgends verschrieben.

danke schon im vorhinein

von Sven P. (Gast)


Lesenswert?

> while((PIND & (1<<PIND2))){};
Wartet so lange, wie das dritte Bit (PIND2 = 2, Zählung von Null an) im 
Register PIND gesetzt ist.


> while(((PIND2)==1)){};
Wartet so lange, wie die Konstante PIND2 den Wert 1 hat. PIND2 ist mit 
dem Wert "2" definiert. (PIND2 ist niemals == 1)


> while((PIND&0x02)==1)){};
Wartet so lange, wie im konstanten Wert von PIND2 (=2) das zweite Bit 
gesetzt ist. (PIND2 hat immer das zweite Bit gesetzt)

von Lötlackl (Gast)


Lesenswert?

naja,
statt
1
while((PIND&0x02)==1)){};

sollte es wohl eher heißen
1
while((PIND&1<<2)==1)){};
bzw.
1
while((PIND&0x04)==1)){};

mfg Lötlackl

von Karl H. (kbuchegg)


Lesenswert?

spyder wrote:

> aber das while(((PIND2)==1)){}; und das while((PIND&0x02)==1)){};

PIND ist das 8 Bit Register.
   xxxx xx0x

Jetzt geht der Pin 1 von 0 auf 1

   xxxx xx1x

den du auch korrekt mit der 0x02 ausmaskierst ( dh. alle
anderen Bits werden auf 0 gesetzt

   0000 0010

Nur: Das ist die Zahl 2 die da heraus kommt.
Da kannst du lange warten, bis das mal zu 1 wird.

  while( PIND & ( 1 << PIND1 ) )

bedeutet ja: solange das Ergebnis nicht 0 ist. Da wird nicht
explizit gefordert, dass es 1 sein muss. Jede andere Zahl, zb
auch 2, genügt, damit es nicht 0 ist.

Merke: Nicht 0 heist ja nicht, dass eine 8 Bit Zahl deswegen
genau 1 sein muss.

von spyder (Gast)


Lesenswert?

danke für die erklärungen.

ich hab mir gedacht, dass ich mit PIND2 direkt den wert des 3. bits 
auslesen kann. und bei while((PIND&0x02)==1)){}; hab ich blöderweise 
nicht berücksichtigt, dass man ja von null wegzählt.
also ist es meines wissens nach nicht möglich den wert eines bestimmten 
pins direkt auszulesen (also ohne maskierungen). Stimmt das?

von Falk B. (falk)


Lesenswert?

@  spyder (Gast)

>also ist es meines wissens nach nicht möglich den wert eines bestimmten
>pins direkt auszulesen (also ohne maskierungen). Stimmt das?

Ja, in Standard-C geht das nicht. Siehe Bitmanipulation.

MfG
Falk

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.