www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik asin() Merkwürdige Beobachtung


Autor: Efthi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich habe eine merkwürdige Verhaltensweise des asin() in meinem code
entdeckt. Wenn ich die Variablen (zwei float Werte jeweils zwei
verschiedene Werte die mittels asin() errechnet werden) global
definiere berechnet der asin() faltsch (einen sehr kleinen Wert mit
10E-36), definiere ich die Variablen lokal rechnet er richtig.
Wie könnte mann dieses Verhalten erklären?

Gruß
Efthi

Autor: Gernot Frisch (gernotfrisch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt's die lokale Var mit dem gleichen Namen nochmal??

Autor: Efthi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal den Code

Autor: Efthi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang der Code. Wenn ich die Variable fGraValueX und fGraValueY mit
X und Y ersetze funktioniert es. Das ist merkwürdig.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Tat. Zumal im ganzen Code keine Variable 'X' bzw.
'Y' vorkommt.

Autor: Efthi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im code den du hast stehen die eigentliche Variablen die ich nutzen
will. Ich habe die Variblen fGraValueX und fGraValueY ersetzt durch X
und Y. Dann funktioniert es.

Autor: Efthi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte es an der Länge der Variablen liegen die ich dem asin() übergäbe?

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du den Definitionsbereich beachtet?

Gruß

Dietmar

Autor: Efthi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, klar -1 und 1. Wird auch im Code abgefangen.

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> //calculate a gravitation value
> fGraValueX = (fCountsX - 1024)/819;
> fGraValueY = (fCountsY - 1024)/819;

versuche hier mal statt 819 -> 819.0 zu schreiben. könnte sein, dass
keine umwandlung in float passiert, weil der wert (fCountsX - 1024) und
819 keine floats sind.

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uuuaahhh. Horrorcode.

So kriegt man seinen Flash voll. Da wären z.B. die switch-statements,
die immer READ-CHANNEL zurückgeben. Der Wertebereich wird mit
if(fCountsX >= 1842) und if(fGraValueX>1) gleich doppelt überwacht.
Dann wird einer float-variablen natürlich ein float-wert zugeordnet,
der zuvor int und davor float war fDecimValueX = (int)fDecimValueX
(soll wohl im prinzip floor(x) sein). Dieser float-Wert wird nach int
gewandelt und wie folgt verarbeitet: iPhysValueX = fDecimValueX. Da
iPhysValueX nur innerhalb der Datei sichtbar ist, endet die Berechnung
hier im Nirvana.

Der Compiler wird dir wohl das alles wegoptimieren und dann bleibt eben
nichts übrig. Vielleicht wirds besser wenn du
extern int iPhysValueX, iPhysValueY;
schreibst.


Gruß
Marco

Autor: Efthi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<if(fCountsX >= 1842) und if(fGraValueX>1) gleich doppelt überwacht.>
Hast recht ist nicht nötig


<Dann wird einer float-variablen natürlich ein float-wert zugeordnet,
der zuvor int und davor float war fDecimValueX = (int)fDecimValueX
(soll wohl im prinzip floor(x) sein). Dieser float-Wert wird nach int
gewandelt und wie folgt verarbeitet: iPhysValueX = fDecimValueX. Da
iPhysValueX nur innerhalb der Datei sichtbar ist, endet die Berechnung
hier im Nirvana.>

Für die Berechnung des asin() benötige ich einen float Wert.
Die Variablen iPhysValueX und iPhysValueY werden weiter im CAN-stack
verarbeitet und da benötige ich nunmal int. Das ist nur ein c-file vom
ganzen Projekt.

Autor: Efthi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Ingo,
hab es versucht. Klappt leider nicht.

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie durch extern im Kommentar angedeutet, gibt es wohl irgendwo in einem
anderem Programmmodul die int-Variable iPhysValueX.

/*--------------------------------------------------------------------*/
/*  external data
*/
/*--------------------------------------------------------------------*/
extern float fGraValueX, fGraValueY;
extern float fDecimValueX, fDecimValueY;
extern int iPhysValueX, iPhysValueY;

...

void mainVTI(){
 float fCountsX = (float)readsca (READ_X_CHANNEL_VTI);
 float fCountsY = (float)readsca (READ_Y_CHANNEL_VTI);

 fGraValueX = (fCountsX - 1024)/819;
 fGraValueY = (fCountsY - 1024)/819;

 if(fGraValueX>1)
   fGraValueX = 1;
 else if(fGraValueX<-1)
   fGraValueX = -1;

 if(fGraValueY>1)
   fGraValueY = 1;
 else if(fGraValueY<-1)
   fGraValueY = -1;

#if VTI_XY == 1
 CLI(); //disable all interrupts to avoid miscount
 fDecimValueX = asin(fGraValueX) * (180.0/M_PI); // calculates angle of
y-axis inclination
 fDecimValueX = fDecimValueX * 100;

 fDecimValueY = asin(fGraValueY) * (180.0/M_PI); // calculates angle of
x-axis inclination
 fDecimValueY = fDecimValueY *100;
 SEI();//re-enable interrupts

 iPhysValueX = (int) fDecimValueX;
 iPhysValueY = (int) fDecimValueY;

 CanOpenInterface();
#endif /* VTI_XY == 1 */
}

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.