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.
Ja, und !? Wer hält Dich davon ab, es so zu programmieren, wie Du es hier schreibst?
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.
In welcher Sprache proggst Du denn? Müßte mit C eigentlich kein Problem sein...
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. :-)
Wie getippt wenn ich mich dran mache so möchte ich eine Funktion die eine weile hält. Aber ich habe hier ja auch schon eine 32/32 bekommen DANKE
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.