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
#3417188
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
Wenn ich das durchprobiere PB1...PB7 werden die jeweiligen Pin's auf High gesetzt. Was bedeutet denn << oder >>
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
Gast
#3417244
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.
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 :)
Gast
#3417249
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
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!
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
#3417295
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.
Was wäre denn die Möglichkeit das Bit eins weiterzuschieben?
Gast
#3417300
Und warum liest du nicht ein, was vorher ausgegeben wurde? nicht PORTB = PINB ^ ( 1 << PB1 ); sondern PORTB = PORTB ^ ( 1 << PB1 );
Gast
#3417305
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Gast
#3417338
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...
----------------------------------------------------
Ja stimmt! So langsam komme ich dahinter, danke für die Hilfe.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.