www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Funktion asin() aus math.h


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe folgendes Problem:

ich muss aus einigen Werten einen Winkel errechnen.

Die nötige Formel lautet: winkel=asin((d_out-d_out_null)/sens). Die 
Werte sehen z. B. so aus: d_out=1500, d_out_null=1024, sens=1638. Die 
einige Variable ist d_out im Bereich von 0d bis 2047d.

Mein Problem ist nun, dass die Funktion asin() nicht funktioniert. D. h. 
ich bekomme als ergebnis lediglich den Wert des Arguments, nicht aber 
den Arcussinus daraus. math.h ist allerdings included.

Equipment:

STK500,
AVR Studio 4.13
ATmega8

Was mache ich falsch??

Danke und Gruß

Tom

Autor: Jurij G. (jtr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste mal den Codeabschnitt.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anbei der Code:

Dieses Programm macht nicht mehr, als dass SCA_wert und asin() auf dem 
Display ausgegeben werden um Fehler zu suchen.

***********************************************************************+

//HEADERDATEIEN
#include <avr/io.h>
#include <util/delay.h>
#include <avr/own_lcd.h>
#include <avr/own_uart.h>
#include <avr/interrupt.h>
#include <avr/stdint.h>
#include <math.h>

//FESTLEGUNG UNABHÄNGIGER TYPENNAMEN
typedef unsigned int uint16;
typedef signed int sint16;
typedef unsigned char uint8;
typedef signed char sint8;

//DEFINITION GLOBALER VARIABLEN
volatile uint8 SCA_L; //unteres Register vom SCA
volatile uint8 SCA_H; //oberes Register vom SCA
uint16 SCA_HH; //oberes Register nach Bitmanipulation
uint16 SCA_LL; //unteres Register nach Bitmanipulation
double SCA_wert=0;
double winkel;

uint8 taus;
uint8 hun;
uint8 zehn;
uint8 ein;

uint8 taus_;
uint8 hun_;
uint8 zehn_;
uint8 ein_;



//FUNKTIONSPROTOTYPEN
void nm_intro (void);
uint8 runden(double);



//SERVICEROUTINE FÜR EMPFÄNGERINTERRUPT
SIGNAL(SIG_UART_RECV)
{
  //Einlesen zweier Werte über RS232 und Übergabe an Hilfsvariablen
  getch();
  SCA_H = got_cha;
  getch();
  SCA_L = got_cha;
  cli();  //Alle Interrupts global sperren
}




//HAUPTPROGRAMM
int main (void)
{
  lcd_init(); //Initialisieren des Displays
  nm_intro(); //Anzeige nach Start des Controllers
  initusart(); //RS232 initialisieren (in own_uart.h)

  lcd_clear();
  set_cursor(0,1);

  while(1)
  {


    SCA_HH = (SCA_H<<3);
    SCA_LL = (SCA_L>>5);

    SCA_wert=SCA_HH+SCA_LL;

    winkel = asin(((SCA_wert-1024)/1638));


                  //nachfolgend Visualisierung für Fehlersuche
                  winkel = winkel*1000;

    set_cursor(0,1);
    taus_=(SCA_wert/1000);
    lcd_data(taus_+0x30);
    hun_=(SCA_wert-(taus_*1000))/100;
    lcd_data(hun_+0x30);
    zehn_=(SCA_wert-(taus_*1000)-(hun_*100))/10;
    lcd_data(zehn_+0x30);
    ein_=(SCA_wert-(taus_*1000)-(hun_*100)-(zehn_*10));
    lcd_data(ein_+0x30);


    set_cursor(0,2);
    taus=(winkel/1000);
    lcd_data(taus+0x30);
    hun=(winkel-(taus*1000))/100;
    lcd_data(hun+0x30);
    zehn=(winkel-(taus*1000)-(hun*100))/10;
    lcd_data(zehn+0x30);
    ein=(winkel-(taus*1000)-(hun*100)-(zehn*10));
    lcd_data(ein+0x30);


    UCSRB |= (1<<RXCIE);  //Empfängerinterrupt frei
    sei();          //Alle Interrupts global frei
  }
  return 0;
}

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der funktion gab es schon öfter Probleme.

Beitrag "asin() Merkwürdige Beobachtung"

Beitrag "asin() Probrlem"

vllcht hilft dir das weiter.

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gegeben deine Beispielwerte:
>d_out=1500, d_out_null=1024, sens=1638
Was kommt da zurück?
Was würdest du erwarten?

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure Rückmeldungen.

@Bruno:
Die genannten Threads haben mir leider nicht weiter geholfen. Daran hab 
ich natürlich auch schon gedacht.....

@lkmiller:
für die genannten Werte bekomme ich 0.29 zurück (also genau den Wert des 
Arguments). Erwarten würde ich aber den Arcussinus, also 16.9

Noch Einfälle??

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom wrote:
> für die genannten Werte bekomme ich 0.29 zurück (also genau den Wert des
> Arguments). Erwarten würde ich aber den Arcussinus, also 16.9
Nö. Die Rückgabewerte der Funktion liegen im Bereich -pi/2...pi/2 
(Bogenmaß!). Und der Arcussinus von 0,29 ist nunmal zufälligerweise 
ungefähr 0,29 (0,2949, um etwas genauer zu sein, was mit 180°/pi 
multipliziert 16,8938 ergibt...). Vielleicht hättest Du mal andere Werte 
ausprobieren sollen...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens: Wenn ich Probleme mit einer Bibliotheksfunktion habe, dann ist 
der erste Schritt, in der Dokumentation der Bibliothek nachzuschauen. 
Hättest Du den entsprechenden Blick in die AVR-libc-Doku geworfen, dann 
hättest Du ziemlich schnell gemerkt, dass da unmöglich 16,XYZ rauskommen 
kann...

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.