Forum: Compiler & IDEs AVR PWM Time Unbekannte Befehle.


von Jan R. (Gast)


Lesenswert?

http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM
1
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
2
TCCR2B = _BV(CS22);


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.

von Eumel (Gast)


Lesenswert?

Steht im Datenblatt deines Controllers, welcher ist denn bei deinem 
Arduino verbaut?

von Jan R. (Gast)


Lesenswert?

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 :-)

von Eumel (Gast)


Lesenswert?

http://www.atmel.com/Images/doc7766.pdf

Da steht alles drin inklusive anschaulicher Erklärungen etc.

von Mike (Gast)


Lesenswert?

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.

von Jan R. (Gast)


Lesenswert?

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."

von DrWright (Gast)


Lesenswert?

1
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
2
TCCR2B = _BV(CS22);

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)

von Thomas E. (thomase)


Lesenswert?

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.

von Jan R. (Gast)


Lesenswert?

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?

von Thomas E. (thomase)


Lesenswert?

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.

von innerand i. (innerand)


Lesenswert?

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)

von Thomas E. (thomase)


Lesenswert?

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.

von Jan R. (Gast)


Lesenswert?

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.

von F. F. (foldi)


Lesenswert?

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.

von innerand i. (innerand)


Lesenswert?

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?

von Zittermann (Gast)


Lesenswert?

Foldi schrie:
>Also, lieber Fresse halten und lernen.

Mit welchem Recht reißt Du hier eigentlich die Schnauze so weit auf?

:-((

von F. F. (foldi)


Lesenswert?

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.

von Jan R. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von F. F. (foldi)


Lesenswert?

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!

von Jan R. (Gast)


Lesenswert?

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..

von Falk B. (falk)


Lesenswert?

@ 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.

von Oliver (Gast)


Lesenswert?

Jan R. schrieb:
> Meine Vermutung

Je nun, wie oben schon mehrfach geschrieben steht, führt das Datenblatt 
von der Vermutung zur Gewissheit.

Dazu gibt es hier ein Tutorial:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

Oliver

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

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.

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.