Anfängerfrage zum bitweise shiften

Gast #100250
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
Gast #100251
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
Gast #100252
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...
Gast #100253
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
Gast #100254
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.
Gast #100255
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
Gast #100256
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).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.