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 | 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
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.
Um da mal eine Zahl reinzubringen: Bei 20MHz führt ein AVR ca. 43000 Fliesskommadivisionen pro Sekunde durch. Quelle: Doku der avr-libc.
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 "Ständig-Postern" nicht zu überlesen.
>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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.