Forum: Compiler & IDEs Anfängerfrage zum bitweise shiften


von josch (Gast)


Lesenswert?

Hallo

Ich bin ziemlich neu, was das Basteln mit Mikrocontrollern anbelangt.
Ebenso neu ist mir auch das Programmieren in C.
Ich hoffe auch, meine Frage ist nicht allzu dämlich.
Sie bezieht sich eigentlich auf den Artikel "Programmieren in C"
Da steht bei der Inbetriebnahme des Timers 0 mit 1/64 des Taktes die
Zeile:

outp ((1<<CS02) | (1<<CS00), TCCR0);

was genau passiert den in dem Ausdrück 1<<CS02 bzw. 1<<CS00?

Meine Recherche hat ergeben, dass da 0001 um CS02 nach links verschoben
wird. Aber was steht in CS02 drin? Das ist doch eigentlich nur ein Bit.
Wie komme ich denn hinterher auf das geforderte 0011?

schlagt mich, schimpft mich aus... aber bitte verratet's mir

Gruss josch

von KoF (Gast)


Lesenswert?

x << y

x = der zu schiftende zahlenwert (oder variable)
y = der zahlenwertwert um den geschiftet werden soll ( ebenfalls auch
eine variable möglich)

was nun in der variable CS02 drin steht, weiß ich nicht ( will es
ehrlich gesagt momentan auch gar nicht wissen) aber wenn du es wissen
willst, dan lass dir die variable doch einfach mal mit nem printf
ausgeben ;)

mfg KoF

von OldBug (Gast)


Lesenswert?

outp ist deprecated! Nicht mehr verwenden!

http://www.nongnu.org/avr-libc/user-manual/deprecated.html

Die Erklärung von KoF ist ganz gut, und was mag wohl in den "Makros"
drin stehen? Warscheinlich die Nummer des Bits, welches den
zugewiesenen Namen (CS00  CS02  ...) repräsentiert. Man könnte auch
die "nummer" des Bits angeben, sowas bezeichnet man aber als magic
number, da sich eine solche Zeile:

PORTA = (1 << 3) | (1 << 7) | (1 << 1);

sehr schwer liest.

Gruß,
Patrick...

von josch (Gast)


Lesenswert?

Danke schonmal für die Antwort

So richtig weiss ich es aber immer noch nicht.

wenn y ein Bit (in einem Register) ist, dann stellt der Ausdruck
"1<<y" doch ein Umschalten des Bits von 0 nach 1 bzw. umgekehrt dar.
Oder liege ich da falsch?
Was ist denn dann der Unterschied zu beispielsweise "y=!y"?
Das ginge doch eigentlich genauso.

Gruss josch

von Jörg Wunsch (Gast)


Lesenswert?

Nein, es ist kein Umschalten.  y ist kein Bit, sondern die Nummer
eines Bits.  Mit 1 << y erhälst Du den dazugehörigen Zahlenwert.
Bit 0 z. B. ergibt 1 << 0, also 1.  Bit 1 ergibt 1 << 1, also 2.
usw. usf.

von josch (Gast)


Lesenswert?

Arrgh, Danke - jetzt hab ich's
Da stand aber einer auf der Leitung :)

Allerdings ist dann da ein kleiner Fehler in dem Artikel.
Unter
http://www.mikrocontroller.net/articles/c/Timer_Counter.htm#8-Bit%20Timer/Counter
heisst es für 1/64-tel des CPU Taktes wie oben geschrieben:
outp ((1<<CS02) | (1<<CS00), TCCR0);

Das wäre dann doch aber der Code für 1/1024-tel, da ich TCCR0 mit
00000101 beschreibe.
Naja, wie dem auch sei - jetzt kann ich gut schlafen :)

Danke für Eure Geduld
josch

von Jörg Wunsch (Gast)


Lesenswert?

Zwar sind die Codierungen nicht bei allen AVRs gleich (namentlich der
ATmega64/128 weicht ab), aber hier scheint in der Tat ein Fehler
vorzuliegen.  1/64 wäre (1 << CS01) | (1 << CS00).

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.