Frage zur syntax

Gast #285212
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
Gast #285213
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.
Gast #285214
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
Gast #285215
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.
Gast #285217
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?
Gast #285219
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!!
#285220
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.