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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren