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
> 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)
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
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.
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?
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.