mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mathematik-Routinen


Autor: Holger P. (holg_i)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Makrocontroller (Gast)
Datum:

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

Autor: Holger P. (holg_i)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Makrocontroller (Gast)
Datum:

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

Autor: Holger P. (holg_i)
Datum:

Bewertung
0 lesenswert
nicht 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.....

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
:-)

Autor: Holger P. (holg_i)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Holger P. (holg_i)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Holger P. (holg_i)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Holger P. (holg_i)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Holger P. (holg_i)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
:-)

Autor: Holger P. (holg_i)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.