Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation


von Jonas H. (jonas18867)


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

von spess53 (Gast)


Lesenswert?

Hi

> Was genau
>passiert in der Klammer (1 << PB0) wenn ich (1 >> PB0) programmiere
>macht das keinen unterschied.

Dann probiere das mal mit PB1..7.

MfG Spess

von Jonas H. (jonas18867)


Lesenswert?

Wenn ich das durchprobiere PB1...PB7 werden die jeweiligen Pin's auf 
High gesetzt. Was bedeutet denn << oder >>

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Jonas Horn schrieb:
> Wenn ich das durchprobiere PB1...PB7 werden die jeweiligen Pin's auf
> High gesetzt.

Um welchen Mikrocontroller geht es eigentlich?

> Was bedeutet denn << oder >>

http://de.wikibooks.org/wiki/C-Programmierung:_Operatoren#Der_Shift-Operator

von abc.def (Gast)


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.

von Jonas H. (jonas18867)


Lesenswert?

Ich benutze den ATmega32.

Das mit der Verschiebung um 1 Bit habe ich so weit verstanden, aber 
sollte dann nicht auch der Ausgang wandern, sprich erst PB0 dann PB1 
usw. wie eine Art Lauflicht? Ich steh da noch bisschen auf dem Schlauch 
:)

von Peter II (Gast)


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.

von Bernie (Gast)


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!

von Jonas H. (jonas18867)


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.

von Peter II (Gast)


Lesenswert?

Jonas Horn schrieb:
> sollte hier nicht bei jeder Wiederholung der while- Schleife das Bit um
> eins weiter geschoben werden? Es blinkt aber immer das Gleiche.

nein, es fängt ja jedes mal an der gleichen stelle an.

von Jonas H. (jonas18867)


Lesenswert?

Was wäre denn die Möglichkeit das Bit eins weiterzuschieben?

von Bernie (Gast)


Lesenswert?

Und warum liest du nicht ein, was vorher ausgegeben wurde?

nicht      PORTB = PINB ^ ( 1 << PB1 );
sondern    PORTB = PORTB ^ ( 1 << PB1 );

von Peter II (Gast)


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
}

von Bernie (Gast)


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...
----------------------------------------------------

von Jonas H. (jonas18867)


Lesenswert?

Ja stimmt!
So langsam komme ich dahinter, danke für die Hilfe.

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.