Lookup table für Sinus funktioniert nicht

OP #1510462
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;
#1510468
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.
Gast #1513059
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.
#1513060
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
#1513489
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 :-)
Moderator (Firma: Titel) Persönliche Seite #1513511
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  :-/
#1513531
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.
#1514208
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-- );

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren