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
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
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...
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.