Forum: Compiler & IDEs Frage zur syntax


von Ferrice (Gast)


Lesenswert?

Hätte eine Frage zur folgenden syntax:

PORTC |= (1<<PC7) | (1<<PC6);

Mir ist nicht ganz klar was da genau passiert.
AM PORTC werden die bits 7 und 6 gesetzt das weiß ich

1<<PC* warum wird der linksschiebeoperator verwendet.
und dann das ganze bitweise mit | verodert?

(1<<PC7) | (1<<PC6) ergibt 11000000 und das ganze wird dann mit PORTC
verodert und zugewiesen so dass dann PORTC den wert 11000000 hat.

bitte um eure comments

von Stefan (Gast)


Lesenswert?

1/ Wenn PC7 = 7, dann (1<<PC7) = (1<<7) = 10000000
2/ Wenn PC6 = 6, dann (1<<PC6) = (1<<6) = 01000000
3/ 10000000 | 01000000 = 11000000
4/ PORTC |= 11000000 ist das Gleiche wie PORTC = PORTC | 11000000
5/ PORTC = 11000000 kommt nur raus, wenn PORTC vorher den Wert 0 hat.

von Jens D. (Gast)


Lesenswert?

PORTC |= (1<<PC7) | (1<<PC6);

in PC7 steht im grunde nur eine 7 drin heisst also, eine 1 7 mal nach
links verschieben, das selbige mit PC6 eben 6mal nach links.

(1<<PC7) | (1<<PC6) ist nichts anderes, als BIT6 und BIT7 setzen
dies macht man wegen der uebersichtlichkeit.
bei ports ist es nicht so schwer zu sehen, aber man kann sich nicht
jedes bit eines registers merken, und so schreibt man eben (1<<AS1)
zB.
oder wenn sich von controller zu controller wechselst muesstest du die
bitnummer zu AC1 alle von hand aendern


PORTC |= (1<<PC7) | (1<<PC6);
damit wuerdest du den Port so definieren: 0b11xxxxxx
(x = unbekannt)
anders geschrieben:
PORTC = PORTC | (1<<PC7) | (1<<PC6);
evtl. erkennst du es so besser

mit

PORTC = (1<<PC7) | (1<<PC6);
damit wuerdest du en Port so definieren: 0b11000000

kleiner tipp schau mal unter artikel nach bitmanipulation

von Ferrice (Gast)


Lesenswert?

Erstmal danke für die Beiträge:

PORTC |= (1<<PC7) | (1<<PC6);
damit wuerdest du den Port so definieren: 0b11xxxxxx

Also der unterschied zwischen PORTC = und PORTC |= ist mir nicht ganz
klar.

von Rolf Magnus (Gast)


Lesenswert?

> damit wuerdest du den Port so definieren: 0b11xxxxxx

Genau, wobei x die Werte sind, die vorher im Port waren. Bei = wären es
stattdessen Nullen.

von Ferrice (Gast)


Lesenswert?

hab nochmals überlegt:
wenn schon irgendwelche bits am portc gesetzt sind und ich mache eine
zuweisung mit portc |= dann bleiben diese Bits gesetzt.

Wiederrum wenn ich aber ein PORTC = mach dann werden die alten bits
geändert.
d.h. der alte wert wird überschrieben.

richtig?

von Karl H. (kbuchegg)


Lesenswert?

Richtig.

 a |= b;

ist nur eine kuerzere Schreibweise fuer

  a = a | b;

von Jens D. (Gast)


Lesenswert?

portc |= byte ->bleiben die gesetzten bits gesetzt
11111111
00110011 mit oder verknuepft
11111111 ergebis


portc = byte ->werden die gesetzten bits geaendert
00110011
11111111 ergebis


wenn du nun bits loeschen willst kannst du:

portc &= ~((1<<pc6) | 1<<pc7)) schreiben
oder eben:
portc = portc & ~((1<<pc6) | 1<<pc7)) schreiben
das ~() invertiert nur die bits!!

von Fritz G. (fritzg)


Lesenswert?

Lass dich nicht durch 1<<PC7 verwirren, deswegen wird der Controller
nicht eine 1 siebenmal links schieben. Das ist nur für die
Leserlichkeit des Codes.

Der Compiler macht da ein 0x80 draus.

Du kannst also genauso PORTC|=0x80 schreiben.
Wenn nur ein bit gesetzt wird macht dann der Compiler ein sbi draus,
sonst einen out Befehl.

von Ferrice (Gast)


Lesenswert?

Besten Dank für eure guten Antworten.

kenn mich jetzt aus!

schöne Grüße
Ferrice

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.