Bitmanipulation

OP #3417177
Lesenswert?
• ▲
▼
Hallo,

ich bin neu hier im Forum, und versuche in Die Sprache C einzusteigen. 
Habe schon paar Bücher gelesen und stelle mir folgende Frage:

PORTB = PINB ^ (1 << PB0);

diese Zeile lässt den PB0 abwechselnd Ein- und Aus- schalten. Was genau 
passiert in der Klammer (1 << PB0) wenn ich (1 >> PB0) programmiere 
macht das keinen unterschied.

Ich hoffe ihr könnt mir helfen das zu verstehen.

Gruß
Jonas
Gast #3417244
Lesenswert?
• ▲
▼
Jonas Horn schrieb:
> PORTB = PINB ^ (1 << PB0);
das verschiebt die 1 als Konstante (geht nicht), ergebnis ist 1 und 
exoderiert damit, was an B steht.

Es müßte so heißen.
PORTB = PINB ^ (PB0 << 1);

das verschiebt das, was an B steht. Damit hättest Du ein Schieberegister 
an PORTB. Allerdings ist dann ungeklärt, welche Daten das 
Schieberegister schiebt.

Letztlich fehlt die Aufgabenstellung, um was dazu sagen zu können.

Vergnüge Dich doch erstmal mit den Grundlagen wie
PORTB++;
PORTB--;
PORTB=PINB+3;
PORTB-=3;

undsoweiter.
Gast #3417249
Lesenswert?
• ▲
▼
abc.def schrieb:
> Jonas Horn schrieb:
>> PORTB = PINB ^ (1 << PB0);
> das verschiebt die 1 als Konstante (geht nicht), ergebnis ist 1 und
> exoderiert damit, was an B steht.

schreibt doch bitte nicht so ein Unsinn. Warum sollte man Konstanten 
nicht verschieben können?

> Es müßte so heißen.
> PORTB = PINB ^ (PB0 << 1);

noch mehr Unsinn.
Gast #3417273
Lesenswert?
• ▲
▼
Machts doch nicht so spannend!

PB0 ... PB7 sind (wenn man die zum µC passende Include-Datei
eingebunden hat), vordefinierte Zahlenwerte.

Beispiel beim Mega8 (Datei m8def.inc):

;PORTB
.equ  PB7  =7
.equ  PB6  =6
.equ  PB5  =5
.equ  PB4  =4
.equ  PB3  =3
.equ  PB2  =2
.equ  PB1  =1
.equ  PB0  =0

<< heißt Linksschieben
>> heißt Rechtsschieben

Schau dir also (1 << PB0), oder (1 >> PB0) an:

Wenn du eine 1 um PB0 = 0 verschiebst,
passiert ungefähr-genau was? ... NIX!
OP #3417289
Lesenswert?
• ▲
▼
Das ist klar bei Null schiebt sich nichts, kleines Beispiel:

void main()
{
  DDRD = 0xFF;
  while (1)
  {
    PORTB = PINB ^ ( 1 << PB1 );
    delay_ms (250);
  }
   return 0;
}


sollte hier nicht bei jeder Wiederholung der while- Schleife das Bit um 
eins weiter geschoben werden? Es blinkt aber immer das Gleiche.
Gast #3417305
Lesenswert?
• ▲
▼
Bernie schrieb:
> Und warum liest du nicht ein, was vorher ausgegeben wurde?
>
> nicht      PORTB = PINB ^ ( 1 << PB1 );
> sondern    PORTB = PORTB ^ ( 1 << PB1 );

macht auch wenig sinn, wenn dann so:

PORTB = PORTB << 1;


man muss nur dafür sorgen, das auch mal das 1.Bit gesetzt wird.
1
void main()
2
{
3
  DDRD = 0xFF;
4
  PORTB = 1;
5
  while (1)
6
  {
7
    PORTB = PORTB << 1;
8
    delay_ms (250);
9
  }
10
   return 0;
11
}
Gast #3417338
Lesenswert?
• ▲
▼
Upps, jetzt bin ich auf den Quatsch reingefallen...
Also:

void main()
{
  DDRD = 0xFF;

  while (1)
  { PORTB = PORTB << 1;
    if ( ! PORTB )
      PORTB = 1;
    delay_ms (250);
  }
   return 0;
}


----------------------------------------------------
Ehrlich gesagt, würde ich als ASM-Freund auch lieber
eine Variable rotieren und ausgeben, als den µC mit
Port-Abfrage etc. zu belasten...
----------------------------------------------------

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.