mikrocontroller.net

Forum: Compiler & IDEs Register ansprechen


Autor: spyder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Lötlackl (Gast)
Datum:

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

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

mfg Lötlackl

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spyder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.