Gibt es für ASM fertige Mathematik-Routinen zum Downloaden oder muss ich
das Rad neu erfinden.
Möchte 1/(0,000000125*8001)=999,875 rechnen.
Also 0,000000125*8001=0,001000125
und 1/0,001000125=999,875
Nur die 8001 verändern sich immer wieder.
Makrocontroller schrieb:> Ja, und !?> Wer hält Dich davon ab, es so zu programmieren, wie Du es hier> schreibst?
Meine Kenntnisse in ASM, was nicht bedeutet das ich sie nicht erweitern
möchte. Aber mir fehlt der ansatz und zum zweiten wollte ich Division
und Multiplikation mit Kommastellen nicht neu erfinden.
Makrocontroller schrieb:> In welcher Sprache proggst Du denn?> Müßte mit C eigentlich kein Problem sein...Holger P. schrieb:> Gibt es für ASM fertige Mathematik-Routinen zum Downloaden.....Holger P. schrieb:> Meine Kenntnisse in ASM, was nicht bedeutet das.....
Holger P. schrieb:> Gibt es für ASM fertige Mathematik-Routinen zum Downloaden oder muss ich> das Rad neu erfinden.
Ohne Dein Target und den Assembler zu wissen, gibts nur ein ganz klares:
"Vielleicht"
Die meisten Assembler unterstützen allerdings keine float-Konstanten,
d.h. die muß man dann erstmal alle in ihre 4Byte-Representation
umrechnen.
Peter
Holger P. schrieb:> Möchte 1/(0,000000125*8001)=999,875 rechnen.> Also 0,000000125*8001=0,001000125> und 1/0,001000125=999,875> Nur die 8001 verändern sich immer wieder.
Formel aufstellen:
x Eingabe, y Ausgabe
1/(0,000000125* x ) = y
Bruch auseinander:
y = 1/0,000000125 * 1/x
y = 8 000 000 * 1 / x
y = 8 000 000 / x
so Wertebereiche anschauen:
x ca 8000
y ca 1000
Wenn du keine Kommastellen brauchst, kannst du das ganz einfach mit
einer Ganzzahldivision rechen.
Wenn du Kommastellen brauchst, blase das ganze mit z.B. Faktor 10 auf:
10y = 80 000 000 / (10x)
so hast du dann 1 Kommastelle Information, ohne mit Kommastellen rechnen
zu müssen.
:-)
Sorry ich versuche mich gerade auf einem ATMega88. Ich denke mir nur das
es doch noch mehr Leutz geben muss die dort rechnen.
Oder sollte ich Hier ASM verlassen und C lernen.
Ist C nicht langsamer und benötigt mehr Speicher?
Floh schrieb:> Wenn du keine Kommastellen brauchst, kannst du das ganz einfach mit>> einer Ganzzahldivision rechen.>> Wenn du Kommastellen brauchst, blase das ganze mit z.B. Faktor 10 auf:>>>> 10y = 80 000 000 / (10x)>> so hast du dann 1 Kommastelle Information, ohne mit Kommastellen rechnen>> zu müssen.>> :-)
Das ist doch schon mal ein Lösungsweg. Aber wie sieht es aus wenn ich
Morgen etwas anderes rechnen muss. Deswegen wollte ich ein Unterprogramm
schreiben/Downloaden in dem ich nur werte in ein Register schreibe und
danach das ergebniss zurück bekomme. So kann ich das doch immer wieder
verwenden
Holger P. schrieb:> Oder sollte ich Hier ASM verlassen und C lernen.
Nicht unbedingt. Viele Rechnungen lassen sich simpel umstellen und dann
ganzzahlig rechnen (siehe oben).
Allerdings wärs mal angebracht, den Verwendungszweck der Formel zu
nennen.
Das sieht für mich aus wie Timereinstellungen?
> Ist C nicht langsamer und benötigt mehr Speicher?
Ich sags mal so: Um einen C-Compiler zu schlagen, musst du schon sehr
gut Assembler programmieren können. :-)
Floh schrieb:> Allerdings wärs mal angebracht, den Verwendungszweck der Formel zu>> nennen.
Das Beispiel soll mir die Frequenz ausrechnen die an ICP1 liegt und ich
mit der Capture-Funktion ermittel
Holger P. schrieb:> Deswegen wollte ich ein Unterprogramm schreiben/Downloaden
Ich empfehle dir es zu schreiben.
ein Unterprogramm in Assembler für 32bit-Ganzzahl Rechenroutinen ist
eine gute Übung.
Also zuerst Addition, dann Subtraktion. Später Multiplikation und
Division.
Kannst das ja auch zuerst im Simulator testen, das ist komfortabel um zu
schauen, was aus den Werten wird.
Bei Fragen einfach den Code hier reinstellen.
Aber nur durch selbstmachen lernt man es richtig. :-)
> Aber mir fehlt der ansatz und zum zweiten wollte ich Division> und Multiplikation mit Kommastellen nicht neu erfinden.
Das Programmieren in Assembler ist sehr oft unklug und bringt keine
Vorteile, gelegentlich aber ist es sehr vorteilhaft und wichtig.
Fliesskommaberechnungen in Assembler gehoeren zu den besonders unklugen
Vorhaben, besonders dann wenn man faul sein moechte und anderer Leute
Libarie verwenden will.
Du koenntest so ein Programm auch problemlos in einer Hochsprache wie
z.B C schreiben und dann wuerde dort die Libarie des Compilers
verwendet. Da die meiste Rechenzeit in der Libarie drauf geht, wird dir
Assembler keinen Vorteil bringen. Ausserdem macht jeder es so, und
keiner anders. Das fuehrt dazu das die Fliesskommalibary des C-Compilers
haeufig verwendet und gut getestet ist. Eine Libarie fuer Assembler die
du irgendwo auftust ist da schon zweifelhafter.
Anders kann es dagegen aussehen wenn du eine besonderes geringe oder
eine besonders hohe Genauigkeit braucht die von ueblichen Libaries nicht
abgedeckt wird. Dann solltest du aber hier nicht nach anderer Leute
Arbeit fragen sondern soetwas selber schreiben und es genau an deine
Beduerfnisse anpassen.
Abschliessend sei noch erwaehnt das es sehr verbreitet ist
Fliesskommazahlen zu skalieren und als Festkomma zu berechnen. Das geht
nicht immer, aber oft. Und es geht besonders oft wenn man sich tiefere
Gedanken ueber Wertebereich und Reihenfolgen bei den Operationen macht.
Das hat dann den Vorteil eines grossen Geschwindigkeitsgewinns.
Wenn uebrigens Fliesskomma wichtig, Geschwindigkeit unabdingbar und
Faulheit nicht besiegbar ist, dann wuerde ich einen Controller mit
eingebauter Fliesskommaeinheit nehmen. .-)
Olaf
Das ist richtig.
Ich bin auch schon am überlegen.
Brauch wohl 10 Register So könnte ich Zahlen bis 16777215,999
miteinander berechnen 1-2-3 Register müsste für die Ganzahl hinhalten
und 4-5 müsste für die kommastelle ran
[r1][r2][r3],[r4][r5]/[r6][r7][r8],[r9][r10]
oder
[r1][r2][r3],[r4][r5]*[r6][r7][r8],[r9][r10]
So hätte ich doch eine Fuktion für alles
Hi
Im Anhang eine 32Bit-Division. Du kannst das auch für Fliesskomma
benutzen indem du den Dividend (deine 80 000 000) um eine bestimmte
Bitzahl nach links schiebst. Die 'Nachkommastellen' sind dann die Bits,
um die du nach links geschoben hast.
MfG Spess
Olaf schrieb:> Du koenntest so ein Programm auch problemlos in einer Hochsprache wie>> z.B C schreiben und dann wuerde dort die Libarie des Compilers>> verwendet. Da die meiste Rechenzeit in der Libarie drauf geht, wird dir>> Assembler keinen Vorteil bringen. Ausserdem macht jeder es so, und>> keiner anders.
Und wie binde ich in ASM die C-Lib ein?
Holger P. schrieb:> 16777215,999
Das sind ca 10^11 Möglichkeiten, also mindestens 34 bit Auflösung.
Das ist Schwachsinn, sorry.
Dein Messwert an sich ist der ICP-Wert, der hat 16bit. Meinetwegen zähl
noch die Timeroverflows mit. Aber du erreichst niemals diese Genauigkeit
bei der Frequenzmessung, außer du wartest ein paar Tage beim Messen.
Lass die Kommastellen weg und rechne ganzzahlig, erspart dir ne Menge
Arbeit.
:-)