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?
>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
intadc1,adc2;
2
3
intergebnis=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
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
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.
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
>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.
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.
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