Forum: Mikrocontroller und Digitale Elektronik ATMega128 Dividieren von float's


von GundelGaukeley (Gast)


Lesenswert?

Hallo Zusammen,

ich programmiere unter AVRStudio (WINAVR) in C meinen ATMega128. Bei 
einem neuen Projekt lese ich über zwei 16Bit ADC's Werte in meinen 
128'er ein, diese möchte ich möglichst schnell, d.h. mit so wenig wie 
möglich Prozessorzyklen, dividieren.

Ich habe im Netz und in diversen Forenbeiträgen, Hilfen zu diesem Thema 
Dividiren von 32 Bit Werten mit AVR gefunden
--> Leider sind alle hinweise z.B. 
http://www.mikrocontroller.net/articles/AVR_Arithmetik, Libs  oder 
Makros  in Assembler (Denke dies ist die schnellste Methode.

Doof nur das ich mich in Assembler überhaupt nicht auskenne.

Daher meine Frage wie baue ich ein solches Makro z.B. 
http://users.i.com.ua/~birua/math32.html oder andere in mein C-Programm 
ein so das ich es verwenden kann.

--> Mit den Beitrag 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Assembler_und_Inline-Assembler 
bin ich nicht weiter gekommen.


Hoffe mir kann einer von euch Helfen

Gruß

GundelGaukeley


P.S. Besteht eigentlich die möglichkeit Assembler ähnlicher einer Header 
Datei in C einzubinden?

von Oliver (Gast)


Lesenswert?

>ich programmiere unter AVRStudio (WINAVR) in C meinen ATMega128.

Prima.

>Bei einem neuen Projekt lese ich über zwei 16Bit ADC's Werte in meinen
>128'er ein,

Echte 16 Bit? Oder 12 Bit, mit 4 Bit Rauschen?

>diese möchte ich möglichst schnell, d.h. mit so wenig wie
>möglich Prozessorzyklen, dividieren.

Für den Anfang würde ich es so machen:
1
int adc1, adc2;
2
3
int ergebnis = adc2/adc1;

oder so ähnlich, je nachdem, was du da dividieren möchtest. Sprich: 
Einfach die normale C-Arithmetik benutzen. Mathelib nicht vergessen.

Und wenn du dann nachweisen kannst, daß das tatsächlich zu langsam ist, 
dann solltest du nach Alternativen suchen. Nicht vorher.

Oliver

von GundelGaukeley (Gast)


Lesenswert?

Hallo Oliver,

>Echte 16 Bit? Oder 12 Bit, mit 4 Bit Rauschen?

Ja es sind echte 16 BIT ich benutze einen sehr langsamen Delta-Sigma 
Wandler der nit so viel raucht :-).

>Einfach die normale C-Arithmetik benutzen

Ich denke ich bin zu langsam da ich im Verhältnis schon Recht viele
Divisionen habe und alle 0,1s die Werte vorliegen haben möchte. Aber ich 
werde es probieren.

Dennoch wäre es nicht schlecht wenn mir Trotzdem jemand schon im 
vorhinein Alternativen aufzeigen könnte.

Gruß

GundelGaukeley

von (prx) A. K. (prx)


Lesenswert?

GundelGaukeley schrieb:

> Ich denke ich bin zu langsam da ich im Verhältnis schon Recht viele
> Divisionen habe und alle 0,1s die Werte vorliegen haben möchte. Aber ich
> werde es probieren.

Damit würde ich mal anfangen bevor die hier alle wegen einer offenbar 
grad mal zweistelligen Anzahl Divisionen pro Sekunde rebellisch machst. 
Womit willst du den Controller eigentlich die übrige Zeit beschäftigen? 
Der langweilt sich dabei doch zu Tode.

Die Vorstellung, dass sich die Autoren der existierende Runtime 
besonders viel Mühe dabei geben, sie nur um dich zu ärgern so langsam 
wie möglich zu gestalten, kann ich nicht ganz nachvollziehen. Und 
ebensowenig, dass man dieser ach so fehlgeleiteten Runtime im 
Handumdrehen auf die Sprünge helfen kann.

Zumal du offensichlich gesteigerten Wert auf Genauigkeit legst (wer 
nimmt sonst einen 16bit-A/D), also wohl kaum irgendwelche 
Annäherungsverfahren in Frage kommen.

von (prx) A. K. (prx)


Lesenswert?

Um da mal eine Zahl reinzubringen: Bei 20MHz führt ein AVR ca. 43000 
Fliesskommadivisionen pro Sekunde durch. Quelle: Doku der avr-libc.

von GundelGaukeley (Gast)


Lesenswert?

Hallo A.K.,

  Vorhab entschuldige ich mich bei dir und allen die sich von meinem
  Thread angegriffen fühlen. Sorry das ich diesen auf gemacht habe.

  Aber kömmen wir wieder zum technischen

> Bei 20MHz führt ein AVR ca. 43000

 Leider benutze ich einen Baudraten Quarz 4,9152 MHz macht wenn ich das
 richtig abschätze ca. 1/4 also 10750 Fließkommaoperationen. OK 
versuchen
 wir ob das reicht. Dennoch habe ich hier nur eine technische Frage
 gestellt und vieleicht den Titel ein wenig falsch gewählt.

 Gruß

 Gundel Gaukeley

 P.S. Ich wusste leider bis gerade ebend nicht das der AVR ATMega128 
eine
      echtes Floating Point Wunder ist bevor ich hier alle wegen einer
      offenbar grad mal zweistelligen Anzahl Divisionen pro Sekunde
      rebellisch gemacht habe. mea culpa

von Schöner Designer (Gast)


Lesenswert?

Eine gewisse Arroganz und Schnodrigkeit ist bei einigen 
"Ständig-Postern" nicht zu überlesen.

von Schluck (Gast)


Lesenswert?

>Eine gewisse Arroganz und Schnodrigkeit ist bei einigen...

Meinst Du mich?
Wenn man einen µC mit Netzfrequenz taktet, darf man keine Rechenwunder 
erwarten.
Wenn man einen ATmega mit 20MHz taktet, braucht man keinen 
"Baudratenquarz".
Und wenn man Probleme damit hat, den Baudratenteiler mit leicht vom 
Ideal abweichenden Werten zu laden, gibt es auch 18,432MHz Quarze.

von (prx) A. K. (prx)


Lesenswert?

GundelGaukeley schrieb:

>   Vorhab entschuldige ich mich bei dir und allen die sich von meinem
>   Thread angegriffen fühlen. Sorry das ich diesen auf gemacht habe.

Nu bleib auf dem Teppich und sei nicht gleich beleidigt.

Für eingesparte Prozessorzyklen gibt es kein Geld zurück, und die Frage 
"so schnell wie möglich" ist meisten die falsche Frage, weil man im 
Bereich von Mikrocontrollern üblicherweise nur "so schnell wie nötig" 
braucht. Und es fehlte von vorneweg die Peilung, in welcher 
Grössenordnung von Anforderung sich das überhaupt bewegt.

Das klang eher so, als ob du irgendwo mal gehörst hast, 
Fliesskommadivisionen seien fürchterlich langsam und daraufhin schon mal 
vorsorglich die Muffen gekriegt hast. Du wärst nicht die erste Person, 
die sich wegen einer 2-3stelligen Zahl Divisionen pro Sekunde völlig 
überflüssige Sorgen macht.

Es gibt übrigens auch schnellere Baudratenquarze. 14,7456MHz und 
18,432MHz beispielsweise.

von GundelGaukeley (Gast)


Lesenswert?

A. K. schrieb:

> Nu bleib auf dem Teppich und sei nicht gleich beleidigt.

  Bin ich glaub es mir, beleidigt klinkt anders.

A. K. schrieb:

>Es gibt übrigens auch schnellere Baudratenquarze. 14,7456MHz und
>18,432MHz beispielsweise.

 Hab nun mal nur den kleinen Baudraten Quarz zur Verfügung ausserdem
 muss man leider damit Arbeiten das man Vorliegt --> ansonsten könnte
 ich auch einen µC mit Floating Point Unit verwenden :-)

Schluck schrieb:

>Und wenn man Probleme damit hat, den Baudratenteiler mit leicht vom
>Ideal abweichenden Werten zu laden, gibt es auch 18,432MHz Quarze.

Hätte ich nicht daher habe ich ja auch einen Echten Bautratenquarz :-)
dann Komme ich erst garnicht in bedrängnis

Gruß

GundelGaukeley

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.