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


von Matthias (Gast)


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)
1
double Wert=0;
2
double Temp=0;
3
char[25] String;
4
char i=0;
5
6
while()
7
{
8
   Eingang = 0;
9
10
   Eingang=usart_getc();
11
12
   if(Eingang=='#')
13
   {
14
        Wert=sin(Temp);
15
        Temp++;
16
        
17
        dtostrf(Wert,5,10,String);
18
        
19
  while( String[i] != '\0' )
20
  {
21
       usart_putc( String[i++] );
22
  }
23
   }
24
}

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

von holger (Gast)


Lesenswert?

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

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

von Matthias (Gast)


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.
1
Wert=sin(Temp); //Sinus berechnen
2
        
3
usart_putc('W'); //Unterscheidungszeichen zwischen zwei Werten
4
5
dtostrf(Wert,8,8,string); //in double in String umwandeln
6
7
usart_putsn(string); //string auf Uart Ausgeben
8
9
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...
1
Wert=sin(M_PI);
2
  
3
usart_putc('W');
4
5
dtostrf(Wert,8,8,string);
6
7
usart_putsn(string);

von Johannes M. (johnny-m)


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.

von 6636 (Gast)


Lesenswert?

>double Temp=0;
>Wert=sin(Temp);
>Temp++;

Du bist sicher, das macht das Richtige...

von Karl H. (kbuchegg)


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.

von Matthias (Gast)


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

von Hans-jürgen H. (hjherbert) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hilft das ?

von Simon K. (simon) Benutzerseite


Lesenswert?

Das Stichwort lautet Festkommaarithmetik. Am besten über eine 
Sin/Cos Lookuptable.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.