Forum: Mikrocontroller und Digitale Elektronik Lookup table für Sinus funktioniert nicht


von Philipp H. (phil_phil)


Lesenswert?

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;

von Gast (Gast)


Lesenswert?

An der Syntax?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael W. (retikulum)


Lesenswert?

Red = pgm_read_word(Sinus+tmp),tmp--;
                              ^
gewollt?
Michael

von Philipp H. (phil_phil)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Grauslich. Einfach nur grauslich

von gst (Gast)


Lesenswert?

Und immer noch nichts gelernt - immer noch keine Klammern.

Gast

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


Lesenswert?

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

von PeFi (Gast)


Lesenswert?

>  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

von Peter (Gast)


Lesenswert?

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

von Frank G. (dg1sbg)


Lesenswert?

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

von PeFi (Gast)


Lesenswert?

Danke.

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

Jep, so sehe ich das auch :-)
Man sollte den Komma-Operator per Standard verbieten!

http://www.mikrocontroller.net/articles/LED-Fading

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Thomas P. (tpircher) Benutzerseite


Lesenswert?

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.

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


Lesenswert?

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

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

Tolerieren ja, aber selber anwenden nein. Mehrfache Initialisierungen 
kann man zum Beispiel auch vor die for-Schleife setzen.

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


Lesenswert?


von Michael L. (michaelx)


Lesenswert?

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