Lookup table für Sinus funktioniert nicht

OP #1510462
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.
OP
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
Gast
> 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.
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 :-)
Persönliche Seite
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.
Moderator (Firma: Titel) Persönliche Seite
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.
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.