Hallo,
es wäre Nett, wenn mir einer erklären könnte, was diese Befehle hinter
den Registern bedeuten,
Ich weiß, aus dem oberen Dokument, dass WG z.b. Waveform Generator ist,
aber was ist die Bedeutung?
vielen Dank schonmal.
Eumel schrieb:> Steht im Datenblatt deines Controllers, welcher ist denn bei deinem> Arduino verbaut?
Das ist jetzt für den 328er Atmega
Bräuchte es aber für den Atmega 32u4 (Arduino Micro)
weißkeiner Ungefähr die Bedeutung, sodass ich, wenn ich das Datenblatt
lese, das Grundwissen habe :-)
Jan R. schrieb:> es wäre Nett, wenn mir einer erklären könnte, was diese Befehle hinter> den Registern bedeuten,
Das ist die Domäne jedes beliebigen C-Grundlagenbuches, Stichwort
"Bitoperationen".
_BV() ist eine Funktion, die in einer Bibliothek deines C-Compilers
definiert ist.
Aus dem Portal
http://www.mikrocontroller.net/articles/AVR-GCC
"inp(), outp(), sbi() und cbi() werden in der aktuellen
Bibliotheksversion nicht offiziell unterstützt (man muss eine spezielle
Header-Datei einbinden(deprecated.h). Es wird schon seit längerem
empfohlen, diese Makros nicht mehr zu nutzen. Einige Anleitungen sind in
diesem Punkt veraltet. Mit halbwegs aktuellen avr-gcc/avr-libc-Versionen
kann einfach z. B. DDRB=0xfe bzw. foo=PINB geschrieben werden. Mit PORTB
|= _BV(1) setzt man PORTB.1, mit PORTB &= ~_BV(1) löscht man es wieder,
mit PORTB ^= _BV(1) kann man es umschalten (_BV(x) entspricht dabei
(1<<x)). Die ersten beiden Varianten erzeugen bei eingeschalteter
Optimierung und passenden Parametern (wie hier im Beispiel Register im
"unteren" Speicherbereich) die SBI bzw. CBI Prozessorbefehle."
Das TCCR2A ist das Timer Controlregister vom Timer 2 deines Atmega, die
Function _BV() setz das dazugehörige Bit im Register. Das | bedeutet
eine ODER Verknüpfung zwischen den Bits die gesetzt werden.
Auch zu finden im Datenblatt http://www.atmel.com/images/doc7674.pdf
Seite 153.
WGM20 und WGM21 werden gesetzt, also wird Timer 2 in den FastPWM Modus
geschaltet.(Siehe tabelle S.156)
COM2A1 und COM2B1 werden gesetzt, also werden die Augänge A und B vom
Timer 2 (OC2A und OC2B) von der normalen Portoperation abgeklemmt und an
den nicht invertierten Ausgang vom Timer geschaltet.
(Clear OC2B on Compare Match, set OC2B at BOTTOM,
(non-inverting mode)
Mike schrieb:> _BV() ist eine Funktion, die in einer Bibliothek deines C-Compilers> definiert ist.
_BV ist keine Funktion sondern Makro:
#define _BV ( bit ) (1 << (bit))
Dsmit werden Bits in einem Regsiter gesetzt oder gelöscht.
REG |= _BV(1); setzt Bit1 in REG.
REG &= ~_BV(1); löscht dieses Bit.
Wird aber selten benutzt. Üblich ist die Scheibweise:
REG |= ( 1 << 1); bzw. REG &= ~(1 << 1);
Wobei das Makro nichts anderes macht, als genau das da reinzuschreiben.
Also auch irgendwie Geschmackssache.
mfg.
Vielleicht ne dumm frage,
REG |= _BV(2);
würde die ersten beiden Bits Setzen oder?
REG |= _BV(2)
REG &= ~_BV(1)
würde das erste Bit setzen, da das zweite gleich wider gelöscht wird?
Warum ist fastPWM zum beispiel 2. Aufgeführt, auf s.156
Was ist brdeutet die HexZahl 0xFF in diesem Kontext?
Jan R. schrieb:> Vielleicht ne dumm frage,> REG |= _BV(2);> würde die ersten beiden Bits Setzen oder?>>> REG |= _BV(2)> REG &= ~_BV(1)>> würde das erste Bit setzen, da das zweite gleich wider gelöscht wird?
Nein.
REG |= _BV(2) setzt Bit2 und nichts anderes.
REG = _BV(2) setzt Bit2 und löscht alle anderen.
Bit2 ist aber nicht das zweite sondern das dritte Bit. Das erste Bit ist
Bit0.
Informatikerin am Flughafen: "0, 1 , 2. Wo ist mein vierter Koffer?"
http://www.mikrocontroller.net/articles/Bitmanipulation
mfg.
Jan R. schrieb:>> Was ist brdeutet die HexZahl 0xFF in diesem Kontext?
1) mit 0x.. ist bereits klar, dass es sich um Hex handelt.
2) 0xFF = 1111 1111 (bin)
innerand innerand schrieb:> Jan R. schrieb:>>>> Was ist brdeutet die HexZahl 0xFF in diesem Kontext?>> 1) mit 0x.. ist bereits klar, dass es sich um Hex handelt.> 2) 0xFF = 1111 1111 (bin)http://de.wikipedia.org/wiki/Hexadezimalsystem
So wird das nichts. Dir fehlen die Grundlagen in C und µC/Elektronik.
Das, wobei du dir jetzt schon die Haare raufst, ist absoluter
Kinderkram. Das hat noch nicht im Entferntesten angefangen, schwierig zu
werden.
mfg.
Thomas Eckmann schrieb:> innerand innerand schrieb:>> Jan R. schrieb:>>>>>> Was ist brdeutet die HexZahl 0xFF in diesem Kontext?>>>> 1) mit 0x.. ist bereits klar, dass es sich um Hex handelt.>> 2) 0xFF = 1111 1111 (bin)>> http://de.wikipedia.org/wiki/Hexadezimalsystem>> So wird das nichts. Dir fehlen die Grundlagen in C und µC/Elektronik.> Das, wobei du dir jetzt schon die Haare raufst, ist absoluter> Kinderkram. Das hat noch nicht im Entferntesten angefangen, schwierig zu> werden.>> mfg.
Ja weil ihr gerade nicht kapiert, was ich will, glaubt ihr wirklich ich
will wissen, was das in dezimal oder Dual ist? Das ist doch nicht euer
ernst. Natürlich ist das 255!
Wollte aber Wissen, was das im Kontext bedeutet, (Kontext bedeutet,
diese Zahl im Zusammenhang mit der Tabelle auf Seite 156 (in diesem
Fall) (Soll nicht verletzend sein, kommt mir aber so vor, als wenn dir
das Wort Kontext unklar war))
OCRA ist ja das Register, in welchem der Tastgrad vermerkt wird, Der
Inhalt dieses Registers, wird mit der Timer verglichen, und so der
Gastgrad gebildet.
0xFF wäre ja aber 255, was heißen würde, dass der Tastgrad 100% wären.
Deshalb Frage ich, was das bedeutet.
Um mich mal Selbst zu Zitieren.
>Was ist brdeutet die HexZahl 0xFF in diesem Kontext?
HexZahl steht doch da, wieso wollt ihr mir dann weis machen, das das
eine Hexadezimale Zahl ist?
In diesem Zusammenhang, finde ich die Bemerkung, dass ich diese ich
Zitiere "einfachen Kindergarten" nicht beherrschen würde ziemlich Frech.
Jan R. schrieb:> In diesem Zusammenhang, finde ich die Bemerkung, dass ich diese ich> Zitiere "einfachen Kindergarten" nicht beherrschen würde ziemlich Frech.
Eh du Papnase!
Die Leute haben dich überhaupt nicht angegriffen und wenn du statt hier
beleidigt um dich zu hauen, mal die Sachen gelesen hättest -auch den
Link mit der Bit Manipulation- dann würdest du nicht so einen Mist
schreiben.
0xFF ist binär 11111111.
Wenn du jetzt in der Lage bist die ganzen Einsen zu zählen, dann wirst
du feststellen, dass das acht Einsen sind.
Da du einen 8 Bit µC hast, hast du damit alle Bits in einem Register auf
Eins gesetzt oder auch eingeschaltet,außer bei bestimmten Registern, da
schaltet die Eins das aus.
Dann gebe ich dir noch einen guten Rat: Lies die Sachen die man dir
sagt, lass die pampige Art und lies das verdammte Datenblatt.
Selbst bei deiner Anmache hier, zeigst du, dass du null Ahnung hast.
Also, lieber Fresse halten und lernen.
P.S.: Nicht mal richtig zitieren kannst du.
Dieser Jan R., der will doch hier nur trollen, oder?
Jan R. schrieb:> HexZahl steht doch da, wieso wollt ihr mir dann weis machen, das das> eine Hexadezimale Zahl ist?
Zittermann schrieb:> Foldi schrie:>>Also, lieber Fresse halten und lernen.>> Mit welchem Recht reißt Du hier eigentlich die Schnauze so weit auf?>> :-((
Weil ich es kann, du namenloses Gesicht.
Lies doch mal was der was der schreibt. Da wird ihm geholfen und der
wird noch patzig und ist beleidigt.
F. Fo schrieb:> Zittermann schrieb:>> Foldi schrie:>>>Also, lieber Fresse halten und lernen.>>>> Mit welchem Recht reißt Du hier eigentlich die Schnauze so weit auf?>>>> :-((>> Weil ich es kann, du namenloses Gesicht.> Lies doch mal was der was der schreibt. Da wird ihm geholfen und der> wird noch patzig und ist beleidigt.
und du beleidigst niemand nein garnicht.
Aber, wenn mir einer erklären will, was eine Hexadezimalzahl ist, dabei
ich das nie gefragt habe, sondern nur will, was 0xFF im diesem Kontext
soll. Sagt das lediglich, dass der timer immer bis 255 Zählt??
Tabelle ist oben. Als Bild.
Jan, jetzt mal wieder im vernünftigem Ton.
Hier sind wirklich viele hilfsbereite Menschen und sie bemühen sich zu
helfen, du aber greifst sie an, weil sie die Antwort vielleicht nicht so
gegeben haben, wie du sie gern gehört hättest.
Natürlich ist 255 das Maximum oder eben alle Bits eines Registers sind
auf 1 gesetzt, aber du schreibst in deinem ersten Posting einen Arduino
Link und scheinst auch noch keine C Kenntnisse zu haben. Davon
abgesehen, ich bin auch noch im Anfang mit C und habe ebenfalls vorher
Arduino gemacht.
Es ist toll, dass du dich da weiter entwickeln willst und gerade weil du
das willst, geben die Leute hier dir Hilfestellungen und kauen dir nicht
alles vor.
Anfangs fand ich das auch sehr nervig, aber drei Sätze ins Forum
geschleudert helfen dir meistens nicht weiter, da muss man schon ne
Menge lesen um zu verstehen wie das alles zusammen hängt.
Vertraue mal darauf, dass diese Leute hier die nötige Erfahrung und das
Wissen haben sofort zu erkennen wie weit ein TO schon ist und sie
deshalb die Ratschläge so geben, wie sie das tun.
Wünsche dir viel Erfolg und einen schönen Sonntag!
C an sich ist garnicht das Problem,
Verstehe nur den Unterschied zwischen Top: 0xFF und OCRA nicht.
Meine Vermutung bei 0xFF zählt der Timer bis 255 und bei OCRA auf ein in
diesem Register definierten Wert. Mehr will ich garnicht wissen.
_bv() kannte ich nicht, wird ja wie oben schon gesagt, wenig verwendet..
@ Jan R. (macman2010)
>Verstehe nur den Unterschied zwischen Top: 0xFF und OCRA nicht.>Meine Vermutung bei 0xFF zählt der Timer bis 255 und bei OCRA auf ein in>diesem Register definierten Wert. Mehr will ich garnicht wissen.
So ist es. Wenn TOP = 0xFF ist, hat man ein normale 8 Bit
Zählerauflösung. Wenn TOP=OCRA ist, hat man CTC Modus mit variabler
Auflösung von 1-255.
Tatsächlich sind die Hinweise auf Datenblätter oder Tutorials auch nur
ein kleiner Schritt.
Es gibt drei Arten von Wissen.
1. Etwas über ein Thema hören oder lesen. (empfangenes Wissen)
Tatsächlich ist es jedoch kein eigenes Wissen, sondern nur das Wissen
anderer.
2. Etwas über in Thema erfahren. (übernommenes Wissen)
Tatsächlich ist es jedoch kein eigenes Wissen, sondern nur die
verstandesgemäße Überprüfung des Wissens anderer.
3. Wissen Aufgrund von Erfahrung.
Erst Wissen aus eigener Erfahrung, aus persönlicher Erkenntnis führt zu
wirklichem Erfolg.
Du musst deine Arbeit selbst tun, die die das Ziel schon erreicht haben,
werden dir nur den Weg weisen können.