mikrocontroller.net

Forum: Compiler & IDEs Frage zur syntax


Autor: Ferrice (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Jens D. (Gast)
Datum:

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

Autor: Ferrice (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Ferrice (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Richtig.

 a |= b;

ist nur eine kuerzere Schreibweise fuer

  a = a | b;

Autor: Jens D. (Gast)
Datum:

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

Autor: Fritz Ganter (fritzg)
Datum:

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

Autor: Ferrice (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank für eure guten Antworten.

kenn mich jetzt aus!

schöne Grüße
Ferrice

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.