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
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
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 :)
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.
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.
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.
Und warum liest du nicht ein, was vorher ausgegeben wurde? nicht PORTB = PINB ^ ( 1 << PB1 ); sondern PORTB = PORTB ^ ( 1 << PB1 );
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 | }
|
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... ----------------------------------------------------
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.