Forum: Mikrocontroller und Digitale Elektronik LED Fading - Frage zu einer Funktion


von Svenja S. (lavy7)


Lesenswert?

Hallöchen :)

Ich würde gerne eine LED faden lassen und habe dazu auch das Tutorial 
von AVR durchgearbeitet 
(https://www.mikrocontroller.net/articles/LED-Fading)

Nun gibt es dort eine Stelle, die ich noch nicht so verstanden habe:
1
void pwm_10_64 (uint16_t delay)
2
{ 
3
    // 10 Bit Fast PWM
4
    TCCR1A = 0x83 | INVERT_PWM;
5
    // prescaler 64 -> ~122 Hz PWM frequency
6
    TCCR1B = (1 << WGM12) | 3;
7
 
8
    pwm_up_down (pwmtable_10, 64, delay);
9
}

Leider weiß ich nicht, was die 3 dort macht? Ist das irgendein Faktor?
Welchen Einfluss hat sie auf die Funktion?

Ich hoffe ihr könnt mir das erklären :)

Vielen Dank im Voraus!
Lavy

von MaWin (Gast)


Lesenswert?

Svenja S. schrieb:
> Leider weiß ich nicht, was die 3 dort macht

Die bits 0 und 1 von TCCR1B auf 1 setzen.

Was die bits in dem Timer Steuerregister für eine Funktion haben ?

Schau ins Datenblatt deines uC, dazu ist es da.

Bei mir CS12  CS11 CS10 und setzen den Vorteiler auf 64.

Steht übrigens auch im Kommentar oben drüber. Aber Kommentare liest eh 
keiner. Vor allem nicht, wenn man nicht versteht, was der code an der 
Stelle macht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Svenja S. schrieb:
> Leider weiß ich nicht, was die 3 dort macht?
Sieh nach, was der Operator '|' dort macht, und wie die Zahl 3 in 
Binärdarstellung aussieht.

Dann erkennst du, dass dort einfach die beiden niederwertigsten Bits 
gesetzt werden.

: Bearbeitet durch Moderator
von Sebastian R. (sebastian_r569)


Lesenswert?

Das ist ein bitweises Oder. Damit werden CS12...CS10 (die 3 unteren 
Bits) auf 0b011 (also dezimal 3) gesetzt.

Die Schreibweise ist nicht wirklich schön lesbar, besser (und 
verständlicher) wäre:

TCCR1B = (1 << WGM12) | (0 << CS12) | (1 << CS11) | (1 << CS10);

Da kann man dann besser ableiten, wie der Prescaler steht

von STK500-Besitzer (Gast)


Lesenswert?

Svenja S. schrieb:
> Leider weiß ich nicht, was die 3 dort macht? Ist das irgendein Faktor?
> Welchen Einfluss hat sie auf die Funktion?

Es werden die untersten beiden Bits immer gesetzt.
Guck dir mal die BEschreibung zum Register "TCCR1B" an.

von Axel R. (axlr)


Lesenswert?

Svenja S. schrieb:
> // 10 Bit Fast PWM
>     TCCR1A = 0x83 | INVERT_PWM;

DAS würde mir (als interessierter Laie) eher Kopfzerbrechen bereiten ...
Was ist die 0x83? Wo kommt "INVERT_PWM" her?

von Svenja S. (lavy7)


Lesenswert?

MaWin schrieb:
> Steht übrigens auch im Kommentar oben drüber. Aber Kommentare liest eh
> keiner. Vor allem nicht, wenn man nicht versteht, was der code an der
> Stelle macht.

Leider hat mir der Kommentar diesbezüglich garnichts gesagt, deswegen 
habe ich ja gefragt. Ich versteh nicht, warum in vielen Foren die Leute 
gleich so salty werden :/

Sebastian R. schrieb:
> Die Schreibweise ist nicht wirklich schön lesbar, besser (und
> verständlicher) wäre:
>
> TCCR1B = (1 << WGM12) | (0 << CS12) | (1 << CS11) | (1 << CS10);

Danke! Damit kann ich was anfangen :) Die Schreibweise mit der 3 ist mir 
vorher noch nie untergekommen und war mir deswegen fremd.

Vielen Dank an Alle :D

von Widerstand (Gast)


Lesenswert?

Svenja S. schrieb:
> Leider hat mir der Kommentar diesbezüglich garnichts gesagt, deswegen
> habe ich ja gefragt. Ich versteh nicht, warum in vielen Foren die Leute
> gleich so salty werden :/

Ach...das ist völlig normal hier.
Wenn man eine Frage hat sollte man die Antwort bereits kennen bevor man 
die Frage stellt.

Ich frage mich warum es eigentlich Schulen und Lehrer gibt? Man kann den 
Kindern doch einfach sagen: Schaut ins Buch!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian R. schrieb:
> Die Schreibweise ist nicht wirklich schön lesbar, besser (und
> verständlicher) wäre:
> TCCR1B = (1 << WGM12) | (0 << CS12) | (1 << CS11) | (1 << CS10);

Ich habe das mal im Artikel für alle pwm-Funktionen angepasst - je nach 
Konstante 3 oder 4.

Axel R. schrieb:
> DAS würde mir (als interessierter Laie) eher Kopfzerbrechen bereiten ...
> Was ist die 0x83?

Ebenso habe ich die Konstanten 0x81 und 0x83 im Artikel ersetzt, z.B. 
für pwm_10_64():
1
    TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << COM1B0) | INVERT_PWM;

Hier sind die Unterschiede zusammengefasst:

https://www.mikrocontroller.net/index.php?title=LED-Fading&type=revision&diff=104649&oldid=104611

> Wo kommt "INVERT_PWM" her?

Einfach mal den Abschnitt im Artikel lesen:
1
#if STK500
2
// inverted PWM on OC1A for STK500
3
#define INVERT_PWM (1 << COM1A0)
4
#else
5
// non-inverted PWM on OC1A
6
#define INVERT_PWM 0
7
#endif // STK500

: Bearbeitet durch Moderator
von Teo (Gast)


Lesenswert?

Widerstand schrieb:
> Svenja S. schrieb:
>> Leider hat mir der Kommentar diesbezüglich garnichts gesagt, deswegen
>> habe ich ja gefragt. Ich versteh nicht, warum in vielen Foren die Leute
>> gleich so salty werden :/
>
> Ach...das ist völlig normal hier.
> Wenn man eine Frage hat sollte man die Antwort bereits kennen bevor man
> die Frage stellt.

Na, wer Fliegen will, bevor er über haut laufen kann(*), braucht sich 
bei "dummen" Fragen, nicht über Ohrfeigen wundern.


*)
Svenja S. schrieb:
> Die Schreibweise mit der 3 ist mir
> vorher noch nie untergekommen und war mir deswegen fremd.

....

von J. T. (chaoskind)


Lesenswert?

Teo schrieb:
> Na, wer Fliegen will, bevor er über haut laufen kann(*), braucht sich
> bei "dummen" Fragen, nicht über Ohrfeigen wundern.

Wer noch nie gehört hat, dass das Fliegen möglich ist, nun durch nen 
dummen Zufall aber an dem Flugzeug schrauben muss, naja dem könnten dann 
wohl Fragen zum Laufen einfallen. Einige in diesem Forum sollten 
wirklich mal ihr hohes Ross absatteln.

Wobei mir nicht ganz klar ist, wie du alter Perfektionist, der 
niieeemals nen Fehler machen würde, darauf kommst, dass Fliegen mit über 
Haut laufen zi tun hat. Fliegen ist fliegen, über Haut laufen ist 
laufen.

: Bearbeitet durch User
von Teo (Gast)


Lesenswert?

J. T. schrieb:
> Wer noch nie gehört hat, dass das Fliegen möglich ist, nun durch nen
> dummen Zufall aber an dem Flugzeug schrauben muss, naja dem könnten dann
> wohl Fragen zum Laufen einfallen.

Ah, du bist also der TO!
Unter mehreren Nicks zu Posten, ist hier VERBOTEN!³

von Widerstand (Gast)


Lesenswert?

Teo schrieb:
> Na, wer Fliegen will, bevor er über haut laufen kann(*), braucht sich
> bei "dummen" Fragen, nicht über Ohrfeigen wundern.

Warum muss man hier ständig als Fragender die Grundlagen beherrschen 
bevor man etwas fragt?
Das macht absolut keinen Sinn. Dann würde in keinem der zig tausenden 
Foren auch nur irgendeine Frage auftauchen.

Es soll Menschen geben die keine E-Technik gelernt haben und dennoch in 
der Lage sind für sich einen µC zu programmieren.
Wenn man nun aus zig Tuts sowas hier liest:
1
TCCR1B = (1 << WGM12) | (0 << CS12) | (1 << CS11) | (1 << CS10);

Und dann zum ersten Mal das:
1
TCCR1B = (1 << WGM12) | 3;

Ist es vollkommen berechtigt in einem Forum zu fragen was die 3 da soll.

von Max B. (citgo)


Lesenswert?

Die betroffene Zeile wurde übrigens im Juli in dem Artikel geändert.
War anscheinend doch nicht so trivial für die Leser. Außer für Teo 
natürlich!

von Teo (Gast)


Lesenswert?

Widerstand schrieb:
> Teo schrieb:
>> Na, wer Fliegen will, bevor er über haut laufen kann(*), braucht sich
>> bei "dummen" Fragen, nicht über Ohrfeigen wundern.
>
> Warum muss man hier ständig als Fragender die Grundlagen beherrschen
> bevor man etwas fragt?

Warum da soviel hinein interpretieren?!
Der Satz ist exakt so gemeint, wie er dasteht!
Wie so, warum, der TO diesen Thread eröffnet hat, hab ich keinen Ahnung. 
Aber über die Reaktionen mancher Leser, braucht er und andere, sich 
nicht zu wundern.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Max B. schrieb:
> Die betroffene Zeile wurde übrigens im Juli in dem Artikel geändert.

Nö. Da wurde nur Text geändert. Den Code hab ich vor ca. einer Stunde 
angepasst, siehe auch 
Beitrag "Re: LED Fading - Frage zu einer Funktion" ;-)

: Bearbeitet durch Moderator
von Max B. (citgo)


Lesenswert?

Frank M. schrieb:
> Max B. schrieb:
>> Die betroffene Zeile wurde übrigens im Juli in dem Artikel geändert.
>
> Nö. Da wurde nur Text geändert.

Okay.. Mh, dann steht es in der Versionsgeschichte aber anders.

> Den Code hab ich vor ca. einer Stunde
> angepasst, siehe auch
> Beitrag "Re: LED Fading - Frage zu einer Funktion" ;-)

Ahhh okay... Glatt überlesen! :)

Teo schrieb:
> Warum da soviel hinein interpretieren?!
> Der Satz ist exakt so gemeint, wie er dasteht!
> Wie so, warum, der TO diesen Thread eröffnet hat, hab ich keinen Ahnung.
> Aber über die Reaktionen mancher Leser, braucht er und andere, sich
> nicht zu wundern.

Ganz einfach, weil für dich der TO eine dumme Frage gestellt hat.
Und doch, man wundert sich immer wieder über manche Reaktionen.

Wäre der TO E-Techniker, Ing. oder gar Softwareentwickler, joar, dann 
wäre die Frage vielleicht dumm. Aber auch nur wenn er es besser wissen 
MÜSSTE!

von Joachim B. (jar)


Lesenswert?

Svenja S. schrieb:
> Nun gibt es dort eine Stelle
> Leider weiß ich nicht, was die 3 dort macht?
https://www.mikrocontroller.net/articles/LED-Fading
1
void pwm_10_64 (uint16_t delay)
2
{ 
3
    // 10 Bit Fast PWM
4
    TCCR1A = 0x83 | INVERT_PWM;
5
    // prescaler 64 -> ~122 Hz PWM frequency
6
    TCCR1B = (1 << WGM12) | 3;
7
    pwm_up_down (pwmtable_10, 64, delay);
8
}

wo soll das sein?
ich sehe nur:
1
void pwm_10_64 (uint16_t delay)
2
{ 
3
    // 10 Bit Fast PWM
4
    TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << COM1B0) | INVERT_PWM;
5
    // prescaler 64 -> ~122 Hz PWM frequency
6
    TCCR1B = (1 << WGM12) | (0 << CS12) | (1 << CS11) | (1 << CS10);
7
 
8
    pwm_up_down (pwmtable_10, 64, delay);
9
}

keine = 0x83 und keine | 3 das musst du selber eingebaut haben?

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> keine 0x83 und keine 3 das musst du selber eingebaut haben?

Wenn Du erstmal den ganzen Thread gelesen hättest, wärest Du darüber 
gestolpert, dass ich heute morgen bereits die entsprechenden Stellen im 
Artikel geändert habe. Die numerischen Konstanten sind nun draußen.

Unterschiede:

https://www.mikrocontroller.net/index.php?title=LED-Fading&type=revision&diff=104649&oldid=104611

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> dass ich heute morgen bereits

für mich war das zeitnah genug, der Thread war von heute und ich las ihn 
morgens, ist bei mir halt später.
Da ich diese Funktionen am AVR auch gerne seit Jahren verwende waren mir 
Konstanten aber nicht im Gedächnis, jedenfalls nicht bei pwm_10_64.
Ich schaute sogar noch in den Artikel ob man da eine Änderungsnotitz 
sieht, so a la "17.08.2021 11:22: Bearbeitet durch User"
Ist mir aber auch nicht aufgefallen und

Frank M. schrieb:
> 
https://www.mikrocontroller.net/index.php?title=LED-Fading&type=revision&diff=104649&oldid=104611

kannte ich nicht

: Bearbeitet durch User
von Teo (Gast)


Lesenswert?

Max B. schrieb:
> Ganz einfach, weil für dich der TO eine dumme Frage gestellt hat.

Nein, eine "Dumme"!

von J. T. (chaoskind)


Lesenswert?

Teo schrieb:
> Ah, du bist also der TO!
> Unter mehreren Nicks zu Posten, ist hier VERBOTEN!³

Komm Teo, versuch du erstmal über deine Haut zu laufen, bevor du 
Schlüsse aus Informationen ziehst, obwohl die Information nicht 
vorhanden ist.
Ich habe die Frage  des TO schon 2012 rum gestellt. Und mir wurde sie 
damals äusserst zuvorkommend von Karl-Heinz beantwortet. Leider haben es 
Leute wie du geschafft, ihn aus diesem Forum zu vertreiben.

von Melba (Gast)


Lesenswert?

J. T. schrieb:


> ... Karl-Heinz beantwortet. Leider haben es Leute wie du geschafft, ihn aus
> diesem Forum zu vertreiben.

Bist Du sicher, dass er vertrieben wurde? Bist jetzt dachte ich, dass er 
bei den den døde ist.

von Wolfgang (Gast)


Lesenswert?

Sebastian R. schrieb:
> TCCR1B = (1 << WGM12) | (0 << CS12) | (1 << CS11) | (1 << CS10);
>
> Da kann man dann besser ableiten, wie der Prescaler steht

Was soll diese bitweise Zerstückelung?
Schöner wäre wohl
1
TCCR1B = (1 << WGM12) | 0b011 << CS);
und dazu noch eine Definition von CS als CS10, dto. für WGM.
Und im Kommentar dazu ein Verweis auf die Tabelle im Datenblatt ...

von J. T. (chaoskind)


Lesenswert?

Melba schrieb:
> Bist Du sicher, dass er vertrieben wurde?

Nein, dass war nur ne Vermutung.

Melba schrieb:
> Bist Du sicher, dass er vertrieben wurde? Bist jetzt dachte ich, dass er
> bei den den døde ist.

Dass allerdings würde seine Abwesenheit auch erklären, ist dann aber 
irgendwie ne Ecke trauriger, als wenn er "nur vertrieben" worden wäre.

von Teo D. (teoderix)


Lesenswert?

J. T. schrieb:
> Komm Teo, versuch du erstmal über deine Haut zu laufen, bevor du
> Schlüsse aus Informationen ziehst, obwohl die Information nicht
> vorhanden ist.

Ich habe keine Schlüsse gezogen! Ich fand es nur ziemlich anmaßend von 
dir, für den TO das Wort zu übernehmen!


PS: Nich das du es immer noch nicht schnallst: Das war Ironisch 
gemeint.... Jetzt versteh ich so langsam, warum du so heftig über das 
Wort "Dumm" gestolpert bist. :DDD

von J. T. (chaoskind)


Lesenswert?

Wolfgang schrieb:
>> TCCR1B = (1 << WGM12) | (0 << CS12) | (1 << CS11) | (1 << CS10);
>> Da kann man dann besser ableiten, wie der Prescaler steht
>
> Was soll diese bitweise Zerstückelung?
> Schöner wäre wohl

Es ist länger dass ich mal in nem AVR-Datenblatt geschmökert hab, aber 
so weit ich mich entsinne, machen die das dort genauso. Ich find es auch 
lesbarer als deine Variante.

von J. T. (chaoskind)


Lesenswert?

Teo D. schrieb:
> Ich habe keine Schlüsse gezogen! Ich fand es nur ziemlich anmaßend von
> dir, für den TO das Wort zu übernehmen!

Doch hast du. Muss ich dir auch noch erklären, was es bedeutet, einen 
Schluss aus etwas zu ziehen?
Ich fand es mehr als nur anmaßend von dir, die Frage des TO als dumm 
hinzustellen. Es wurde ja sogar der abmildernde Vorschlag gemacht, dass 
DU die Frage dumm findest, woraufhin du nochmal bekräftigt hast, dass 
die Frage dumm ist.

von Sebastian R. (sebastian_r569)


Lesenswert?

Och Leute... Kloppt euch gefälligst im Sandkasten.

Das Thema hätte so schön sein können.

1. Klare Frage
2. Klare Antworten mit Erklärung
3. Anpassung der Dokumentation, um die Frage nicht mehr aufkommen zu 
lassen

Perfekt eigentlich.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bitte beim Thema bleiben.

Meines Erachtens ist die ursprüngliche Frage für einen Anfänger durchaus 
berechtigt. Es ist auch unschön und inkonsequent, definierte Konstanten 
wie WGM12 mit Zahlen wie 3 zu mischen. Wenn Konstanten für die Register 
definiert sind, dann sollte man sie auch nutzen.

Das fördert auch die Portabilität. Es gibt duchaus AVRs, wo solche 
Bitgruppen mal an ganz anderer Stelle im Register oder sogar in einem 
ganz anderen Register stecken. Hier ist man dann mit den "magischen" 
Zahlen aufgeschmissen.

Von daher hat die Frage durchaus eines bewirkt: Nämlich den Artikel 
derart anzupassen, dass diese Frage nun nicht mehr gestellt werden muss.

: Bearbeitet durch Moderator
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.