www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Port / Schiebeoperation was bedeutet das bitte?


Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo erfahrene Experten,

könnt ihr mir bitte erklären was dieses Funktion bewirkt?

uint8_t pins = (0x0F << PB0) |  (1<<PB2) |  (1<< PB4);



Ich verstehe das so weit, dass die pins mit einem vorzeichenlosen int 
deklariert werden. Soweit alles ok.

Was bedeutet den der erste Klammerausdruck bitte?  00001111  was wird 
dann mit PB0 ?

und was bedeutet | das hier? oder? wie wirkt sich dieses oder bitte aus?

(1<<PB2) ist mir im einzelnen schon klar,  PB2 wird auf 1 gesetzt, also 
für sich gesehen so 0000 0100

PB4  0001 0000

was ergibt das dann mit der ersten Klammer in der Summe?

so einen Ausdruck habe ich noch nie gesehen.

Ich wäre Euch über Antworten sehr dankbar.

Viele Grüße, MAtthias.

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

Bewertung
0 lesenswert
nicht lesenswert
Matze schrieb:

> Was bedeutet den der erste Klammerausdruck bitte?  00001111  was wird
> dann mit PB0 ?

 .... nach links geschoben.

  a << b

a wird um b binäre Stellen nach links verschoben.


> und was bedeutet | das hier? oder?

Ja.

>  wie wirkt sich dieses oder bitte aus?

  Die einzelnen Bits werden miteinander verodert.

      A  B   Ergebnis
     -----------------
      0  0     0
      1  0     1
      0  1     1
      1  1     1

Nur halt auf die einzelnen Bits. Stell dir deine Zahlen als 8 Bits vor

die schreibst du untereinander

         01010101
  oder   00101100
      -----------
           ?

und jetzt wendest du für jede Spalte (=jedes Bit) die Oder-Vorschrift 
an. Rechts beginnend: 1 oder 0 ergibt 1
                  0 oder 0 ergibt 0
                  1 oder 1 ergibt 1
                  0 oder 1 ergibt 1
                  ....

Das Ergebnis


         01010101
  oder   00101100
      -----------
         01111101

(Im Ergbnis ist genau dort eine 1, wo entweder in der ersten Zahl oder 
in der zweiten Zahl eine 1 war).

>
> (1<<PB2) ist mir im einzelnen schon klar,  PB2 wird auf 1 gesetzt,

Nö.
PB1   ist  1

Für PB0, PB1, PB2 ... existieren #define-ments

#define PB0   0
#define PB1   1
#define PB2   2

also reine Textersetzungen. Überall dort wo du PB2 schreibst, ersetzt 
der Compiler (eigentlich der Präprozessor) diesen Text "PB2" durch den 
Text "2"

Nachdem er das gemacht hat, wird aus

     1 << PB2
das hier
     1 << 2

> also
> für sich gesehen so 0000 0100

Stimmt. Aber warum ist das so?
(Das frag ich mich, weil du weiter oben nicht wusstest was << macht)

> PB4  0001 0000

Nein

> was ergibt das dann mit der ersten Klammer in der Summe?

rechne dir die Einzelteile aus, schreib sie untereinander und odere die 
Bits zusammen.

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.