www.mikrocontroller.net

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


Autor: Philipp Horenz. (phil_phil)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An der Syntax?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael W. (retikulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Red = pgm_read_word(Sinus+tmp),tmp--;
                              ^
gewollt?
Michael

Autor: Philipp Horenz. (phil_phil)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grauslich. Einfach nur grauslich

Autor: gst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und immer noch nichts gelernt - immer noch keine Klammern.

Gast

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: PeFi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:_Aus...

Gruß
Peter

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Goenninger (dg1sbg)
Datum:

Bewertung
0 lesenswert
nicht 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:_Aus...
>
> Gruß
> Peter

pgm_read() wird ausgeführt, nur der Rückgabewert geht verloren. Red 
erhält den Wert von tmp-- .

Gruß,
  Frank

Autor: PeFi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Simon K. (simon) Benutzerseite
Datum:

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

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja, einfacher ist übrigens sowas:
#define FADE(x) \
    (x > 0 ? x : -x - 1)

...


static int8_t Counter;

Red = pgm_read_word(&Table[FADE(Counter)]);
Counter++;

...

Aber die Tabelle geht dann nur von 0-127. Und an den Randstellen des 
Wertebereichs tauchen 127 bzw. 0 zwei mal hintereinander auf.

Autor: Thomas Pircher (tpircher) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://de.wikibooks.org/wiki/C-Programmierung:_Lis...
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:
   int a,b=(0,1,2);  // b=2
   a=b;              // a=2
   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:_Aus...
etwas unglücklich beschrieben  :-/

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die zuweisung sollte korrekt sein.
In for schleifen sieht man ja mal öfter sowas in der art:
int i;
int n = 546;

for(i=0; n>0; n = n/i, ++i)
{
} 



mehrere zuweisungen durch komma getrennt.

das ist die einzige Stelle, wo ich den Kommaoperator tolerieren würde.

Ansonsten gehört der Komma-operator verboten.

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Michael L. (michaelx)
Datum:

Bewertung
0 lesenswert
nicht 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:
Red = pgm_read_word(Sinus+tmp),tmp--;

Red = ( pgm_read_word(Sinus+tmp),tmp-- );

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.