mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage wegen Sinus und Cosinus auf Mega16.


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus Leute,

da ich demnächst auch ein wenig Mathe auf meinem Controller zwingend 
brauchen werde, hab ich etwas mit der Math.h von WINAVR rumgespielt 
eingebaut ins AVR Studio 4.x.

Einfach mal ein Schleife und mir sowas ausgeben lassen:
(Mist ich find grad den Code nicht mehr...dann ausm gedächtnis)

double Wert=0;
double Temp=0;
char[25] String;
char i=0;

while()
{
   Eingang = 0;

   Eingang=usart_getc();

   if(Eingang=='#')
   {
        Wert=sin(Temp);
        Temp++;
        
        dtostrf(Wert,5,10,String);
        
  while( String[i] != '\0' )
  {
       usart_putc( String[i++] );
  }
   }
}


So ich hab jetzt unter anderem hier im Forum gelesen das in der Math.h 
in Rad gerechnet wird.
Aber schon bei Werten (bin mir nicht mehr 100 pro sicher) 5 kam immer 
konstant....0,000012 selbst wenn ich den String auch länger nach dem 
Komma ausgeben lies.

Rechnen die nur mit dem ersten Quadranten? Wäre das Möglich?
Die ersten Werte wenn ich mit dem Taschenrechner vergleiche passen.

MfG
Matthias

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
i=0; // immer schön auf 0 setzen !

  while( String[i] != '\0' )
  {
       usart_putc( String[i++] );
  }

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich hab den Code jetzt gefunden...

@Holger das i wars net weils in ner Routine is die 100 Pro geht...nutz 
ich schon auf zig anderen Controllern.

Wert=sin(Temp); //Sinus berechnen
        
usart_putc('W'); //Unterscheidungszeichen zwischen zwei Werten

dtostrf(Wert,8,8,string); //in double in String umwandeln

usart_putsn(string); //string auf Uart Ausgeben

Temp=Temp+1;

Der Code gehört in obige IF Schleife.

Also weis einer von euch wo der Wurm hängt?

Selbst wenn ich mir PI berechnen lassen will kommt auch nur 0,000012 
raus.

Also sowas in der If-Schleife...
Wert=sin(M_PI);
  
usart_putc('W');

dtostrf(Wert,8,8,string);

usart_putsn(string);

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

Bewertung
0 lesenswert
nicht lesenswert
Hast Du dem Linker die Gleitkommaversion der stdio.h angegeben? Im 
AVRStudio unter "Project | Configuration Options" im Dialog "Libraries" 
die entsprechenden libs auswählen (libprintf_flt.a und die libm.a). 
Müsste dann eigentlich laufen, wenn ich nix vergessen habe.

Autor: 6636 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>double Temp=0;
>Wert=sin(Temp);
>Temp++;

Du bist sicher, das macht das Richtige...

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

Bewertung
0 lesenswert
nicht lesenswert
Matthias wrote:

> Der Code gehört in obige IF Schleife.

if ist keine Schleife. if ist eine Verzweigung.

> Selbst wenn ich mir PI berechnen lassen will kommt auch nur 0,000012
> raus.

Der sin von PI ist ja auch 0.
0.000012 ist gar nicht mal so schlecht, wenn man bedenkt,
dass float so ca. 5 bis 6 signifikante Stellen aufweist
und eine sin() Berechnung innerhalb der Funktion einiges an
Arithmetik benötigt.


> dtostrf(Wert,8,8,string);

Vorsicht: die erste 8 gibt die max Gesamtgröße des zu
erzeugenden Strings an. Die zweite 8 legt fest, wieviele
Stellen davon nach dem Komma sein sollen.
Also 8 Nachkommastellen bei einer Gesamtausgabelänge von 8.
Du brauchst aber auch Platz für 1 Vorkommastelle, das Komma
selber und ein ev. Vorzeichen.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz:
Man kanns auch übertreiben...Schleife Verzweigung... ;-)

Wenn die Sinus nur Float zurückschmeisst...arg dann wirds sehr schnell 
sehr ungenau...

Gut mit Pi aber dann dürfte ich ja bei 5 keine 0,000012 sondern laut TR 
-0,95.... rauskriegen. Ebenso bei Sin(4)...kommt auch das selbe 
raus...-0,75... statt den null Komma garnix.

Ach ja Mathematisch wird der Atmega jetzt ordentlich Arbeit kriegen...

@Gast:
Ja macht das Richtige hab ich mir schon ausgeben lassen...

@Johannes:
Werd ich mal testen...

Thx derweilen

Autor: Hans-jürgen Herbert (hjherbert) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hilft das ?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Stichwort lautet Festkommaarithmetik. Am besten über eine 
Sin/Cos Lookuptable.

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.