Hallo Freunde, Ich habe mir einen Sinus per lookup table generiert und wollt eine LED sinusförmig hell und dunkel werden lassen. Leider klappt das Ganze nicht wirklich und sie wird nur heller, aber nicht dunkler. Vielleicht weiß einer woran es liegen könnte. Hier der Code: if (Flag==0) Red = pgm_read_word(Sinus+tmp); tmp++; if (tmp==255) Flag=1; if (Flag==1) Red = pgm_read_word(Sinus+tmp),tmp--; if (Flag==1 && tmp==0) Flag=0;
Philipp Horenz. schrieb: > Hier der Code: Bitte sinnvollen Code, der auch in einem Zusammenhang steht (also zb von einer anderen Funktion aufgerufen wird) Annahme: Das ganze wird innerhalb einer Art Schleife ausgeführt > if (Flag==0) > Red = pgm_read_word(Sinus+tmp); > tmp++; Dir ist schon bewusst, das tmp immer auf jeden Fall erhöht wird, egal ob Flag 0 ist oder nicht? > if (tmp==255) Flag=1; > if (Flag==1) > Red = pgm_read_word(Sinus+tmp),tmp--; Mach sowas nicht! So etwas führt über kurz oder lang immer zu Konfusion. Wenn du meherer Anweisungen von einem if abhängig machen willst, dann {}-klammere den Block.
Red = pgm_read_word(Sinus+tmp),tmp--; ^ gewollt? Michael
Hab das Problem gelöst. Es war ein Semikolon statt eines Kommas. > Hier der Code: > if (Flag==0) > Red = pgm_read_word(Sinus+tmp),tmp++; > if (tmp==255) Flag=1; > if (Flag==1) > Red = pgm_read_word(Sinus+tmp),tmp--; > if (Flag==1 && tmp==0) > Flag=0; Danke nochmal für die Hilfe
Und immer noch nichts gelernt - immer noch keine Klammern. Gast
> Red = pgm_read_word(Sinus+tmp),tmp--;
Leute, das hat doch echt mal Niewo ;-)
Ein idealer Anwendungsfall für den Kommaoperator.
Dieser Code ist sytemimmanent kopier- und kapiergeschützt.
> Red = pgm_read_word(Sinus+tmp),tmp--; Verstehe ich das richtig, daß 'pgm_read_word(Sinus+tmp)' nicht ausgeführt wird? Quelle: http://de.wikibooks.org/wiki/C-Programmierung:_Ausdr%C3%BCcke_und_Operatoren#Komma-Operator_.2C Gruß Peter
> Verstehe ich das richtig, daß 'pgm_read_word(Sinus+tmp)' nicht > ausgeführt wird? Quelle: nein, nur der Ergebniss spielt keine rolle > Die Ergebnisse aller durch diesen Operator verknüpften Ausdrücke außer dem > letzten werden verworfen.
PeFi schrieb: >> Red = pgm_read_word(Sinus+tmp),tmp--; > > Verstehe ich das richtig, daß 'pgm_read_word(Sinus+tmp)' nicht > ausgeführt wird? Quelle: > http://de.wikibooks.org/wiki/C-Programmierung:_Ausdr%C3%BCcke_und_Operatoren#Komma-Operator_.2C > > Gruß > Peter pgm_read() wird ausgeführt, nur der Rückgabewert geht verloren. Red erhält den Wert von tmp-- . Gruß, Frank
Und genau aus dem Grund kann das doch gar nicht funktionieren. Oder hat der =Operator eine höhere Priorität als das Komma? Wenn nein, würde Red ja immer tmp++ oder tmp-- zugewiesen werden.
Simon K. schrieb: > Und genau aus dem Grund kann das doch gar nicht funktionieren. LOL Was eigentlich nur zeigt, dass man mit freiem Auge den Unterschied zwischen einer sinusförmigen Ansteuerung der PWM und einer linearen Ansteuerung bei LED gar nicht wahrnimmt. Gänzlich davon abgesehen, dass da ja auch noch die logarithmische 'Kennlinie' von Helligkeiten bzw. Nichtlinearitäten des Auges ins Spiel kommen :-)
Jep, so sehe ich das auch :-) Man sollte den Komma-Operator per Standard verbieten! http://www.mikrocontroller.net/articles/LED-Fading
Achja, einfacher ist übrigens sowas:
1 | #define FADE(x) \
|
2 | (x > 0 ? x : -x - 1)
|
3 | |
4 | ...
|
5 | |
6 | |
7 | static int8_t Counter; |
8 | |
9 | Red = pgm_read_word(&Table[FADE(Counter)]); |
10 | Counter++; |
11 | |
12 | ...
|
Aber die Tabelle geht dann nur von 0-127. Und an den Randstellen des Wertebereichs tauchen 127 bzw. 0 zwei mal hintereinander auf.
Simon K. schrieb:
> Man sollte den Komma-Operator per Standard verbieten!
Nein, der ist sehr nuetzlich in for-Schleifen oder in geringerem Masse
in Macros.
Man sollte aber Programmierern die den Komma-Operator missbrauchen den
Computerfuehrerschein fuer mindestens 6 Monate entziehen.
http://de.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorität Wenn ich das so lese, dann wird zuerst Red korrekt zugewiesen, und dann tmp manipuliert, denn der Komma-Operator hat die niedrigste Priorität. An diesem Dreizeiler kann man das gut sehen:
1 | int a,b=(0,1,2); // b=2 |
2 | a=b; // a=2 |
3 | a=33,44,55,b++; // a=33 / b=3 / 44 sowie 55 werden verworfen |
Insofern ist das Beispiel in http://de.wikibooks.org/wiki/C-Programmierung:_Ausdrücke_und_Operatoren#Komma-Operator_.2C etwas unglücklich beschrieben :-/
die zuweisung sollte korrekt sein. In for schleifen sieht man ja mal öfter sowas in der art:
1 | int i; |
2 | int n = 546; |
3 | |
4 | for(i=0; n>0; n = n/i, ++i) |
5 | {
|
6 | }
|
mehrere zuweisungen durch komma getrennt. das ist die einzige Stelle, wo ich den Kommaoperator tolerieren würde. Ansonsten gehört der Komma-operator verboten.
Tolerieren ja, aber selber anwenden nein. Mehrfache Initialisierungen kann man zum Beispiel auch vor die for-Schleife setzen.
Peter schrieb: >> Verstehe ich das richtig, daß 'pgm_read_word(Sinus+tmp)' nicht >> ausgeführt wird? Quelle: > nein, nur der Ergebniss spielt keine rolle > Die Ergebnisse aller durch diesen Operator verknüpften Ausdrücke außer dem > letzten werden verworfen. Peters Aussage zum orginalen Code (obere Zeile) ist so nicht richtig. Dazu müssten noch Klammern im Code enthalten sein, so wie in der unteren Zeile zu sehen:
1 | Red = pgm_read_word(Sinus+tmp),tmp--; |
2 | |
3 | Red = ( pgm_read_word(Sinus+tmp),tmp-- ); |
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.