Forum: Mikrocontroller und Digitale Elektronik Mathematik-Routinen


von Holger P. (Gast)


Lesenswert?

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.

von Makrocontroller (Gast)


Lesenswert?

Ja, und !?
Wer hält Dich davon ab, es so zu programmieren, wie Du es hier 
schreibst?

von Holger P. (Gast)


Lesenswert?

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.

von Makrocontroller (Gast)


Lesenswert?

In welcher Sprache proggst Du denn?
Müßte mit C eigentlich kein Problem sein...

von Holger P. (Gast)


Lesenswert?

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.....

von Peter D. (peda)


Lesenswert?

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

von Floh (Gast)


Lesenswert?

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.
:-)

von Holger P. (Gast)


Lesenswert?

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?

von Holger P. (Gast)


Lesenswert?

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

von Floh (Gast)


Lesenswert?

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. :-)

von Holger P. (Gast)


Lesenswert?

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

von Floh (Gast)


Lesenswert?

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. :-)

von Olaf (Gast)


Lesenswert?

> 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

von Holger P. (Gast)


Lesenswert?

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

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

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

von Holger P. (Gast)


Lesenswert?

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?

von Floh (Gast)


Lesenswert?

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.
:-)

von Holger P. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.