www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Höhere Mathematik


Autor: cyberlord (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann ich mit dem avr eigentlich komplexere rechenoperationen 
durchführen? hab im befehlssatz nix gefunden was mir beim wurzel ziehen, 
potenieren, ja noch nicht mal beim multiplizieren oder dividieren helfen 
könnte. muss ich mir alles selbst programmieren? :O o.O

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hardware-Multiplikation beherrschen die neueren MEGA AVRs schon aber es 
ist ja auch ein RISC Mikroconroller und kein CISC Pentium 4.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
außerdem helfen Hochsprachen-Compiler bei solche Sachen (C oder Basic, 
irgendwo soll es auch ein Pascal-Compiler geben.)

Autor: BernhardT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathe unter asm-programmierung ist eine sehr zeitraubende Angelegenheit. 
Bei Atmel gibt es Beispiele bei den AN. Wenn du den kostenlosen GNU 
C-Compiler (GCC) oder eine andere Hochsprache nimmst, sind viele 
Funktionen standardmäßig verwendbar, oder können über Libs eingebunden 
werden.
Gruß Bernhard

Autor: BernhardT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pascal gibt es bei http://www.e-lab.de/ ist sogar recht gut und in der 
Demo mit 4kB nutzbar.

Autor: Cyberlord (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich will nur asm benutzen

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na warum denn? und was verstehst du unter höherer Mathematik (was willst 
du denn machen??)
C ist doch eine tolle Sache, wenn man den MC etwas rechnen lassen 
möchte.....

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann lass es ihn doch in asm machen, das geht! Hab mich lange damit 
rumgeplagt (zu Zeiten, als es noch kein Internet gab, Z80...). Und ich 
bin wirklich froh, daß diese Kapitel hinter mir liegt.
Es ist ja nicht nur das Problem, einen effektiven Algorithmus für die 
diversen Funktionen zu finden und diesen zu programmieren, sondern die 
Fehlersuche treibt einen fast zur Verzweiflung, besonders die, die nur 
sporadisch auftreten.
Ich wüßte keinen Grund, diese Erfahrung andere auch selbst machen zu 
lassen...:-)

Autor: Stefan Heindel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, wie gesagt, ich würde in den Application Notes von Atmel schauen. 
Wenn du z.B. größere Zahlen multiplizieren willst, dann musst du das wie 
beim schriftlichen multiplizieren in zwei Teile aufteilen und addieren. 
Ist ein Riesenspass, wie meine Vorredner schon gesagt haben...
die division ist auch nicht soo schwer zu erweitern, wenn man das System 
dahinter verstanden hat...

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floating Point ist auch kein Problem - wenn man weiß wie es geht (ich 
weiß es nicht... ;-)
Mal im Ernst: Es gibt den Basic-Interpreter des legendären 8052-BASIC 
inzwischen als Freeware. Man muß sich dann zwar mit einem anderen 
Assembler-Dialekt herumschlagen, aber die Floating-Point Routinen 
sollten sich auf den AVR adaptieren lassen.

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß jetz nicht, wo das Problem liegt.

Die Algorithmen sind doch bekannt, bzw. lassen sich in 
Mathematik-Grundlagenbüchern finden.

Der AVR macht es einem besonders einfach, da er 32 Register zum Rechnen 
hat.

Da die Algorithmen schon uralt sind, muß man sich damit auch nicht lange 
rumplagen. Einfach die Instruktionen entsprechen der gewünschten 
Bitanzahl kaskadieren.

Anbei als Beispiel eine Division 56 / 24 Bit.


Peter

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Auch auf dem 8051-er gehts.

Mit Macros kann man die Erweiterung entsprechend der Bitanzahl sogar 
vollautomatisch machen lassen.


Peter

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, Mul und Div krieg ich auch noch hin. Aber was ist mit Quadrat und 
Wurzel? Ich brauchte mal sowas zur Berechnung einer Standardabweichung, 
der nötige Zahlenbereich ist dann ziemlich schnell ziemlich groß 
geworden, da hab ich's sein lassen.

Ok, Quadrat wäre Multiplikation einer Zahl mit sich selbst. Wurzel wäre 
sukkzessive Annäherung. Aber es muß doch auch eleganter gehen?

Sven

Autor: Stefan Heindel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Quadrat is ja nun WIRKLICH geschenkt. Ist doch mul mit derselben 
Zahl?!

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan: Hat Sven doch auch schon geschrieben...

@Sven:
"Eleganter" ist evtl. das Rechnen per Logarithmus. Auf alle Einzelheiten 
möchte ich nicht eingehen, das sprengt den Rahmen hier, aber man kann 
mit dieser Methode die Rechenoperationen vereinfachen:
Die Multiplikation läßt sich auf eine Addition zurückführen:
aus:

Ergebnis = Zahl1 * Zahl2

wird:

LN(Ergebnis) = LN(Zahl1) + LN(Zahl2)

Division wäre dann Subtraktion.

Oder Potenzieren:

LN(Ergebnis) = LN(Zahl) * LN(Potenz)

Die Quadratwurzel ist übrigens x^0,5. Mit dieser Methode kann man 
notfalls auch die 4. Wurzel ziehen: x^0,25.
Oder LN(Ergebnis) = LN(Zahl) / LN(Wurzel).

Der Nachteil bei dieser Sache: Man muß in einer Tabelle die Logarithmen 
ablegen und zwischenwerte durch interpolieren annähern. Allerdings läßt 
sich dann mit den Zahlen einiges anfangen....

Es ist übrigens egal, ob LN (der natürliche Logarithmus) oder LG 
(Logarithmus zur Basis 10) verwendet wird, man darf nur nicht mischen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@thkaiser,

am effektivsten ist der duale Logarithmus, da die Zahlen ja im 
Binärformat vorliegen.


Peter

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Tabelle ist nicht so doll, die wird ziemlich schnell ziemlich groß, 
und man braucht Zeit zum Suchen.

Für x=Wurzel(n) habe ich einen Näherungsalgorithmus gefunden, der ist 
recht schnell, braucht allerdings eine Division. Berechnet in 10 
Durchläufen Wurzel aus 65000, und nutzt die Bytes sehr gut aus. Heißt 
bei 2 Byte kann ich Wurzel bis 65534 ziehen. Hat allerdings noch keine 
Bereichsabfrage (Null) und keine Rundungsfehler berücksichtigt, das 
müßte man noch einbauen.

Ich hab das mal in QBasic simuliert.

Sven

'Rekursion xneu=1/2(xalt+n/xalt)

INPUT n

x = 1             'Startwert
FOR i = 1 TO 20   'oder bis Wert konstant *)
  z = x
  x = n \ z
  x = x + z
  x = x \ 2
  PRINT x, x * x  'Ergebnis bzw. Zwischenwert
NEXT

*) Achtung, einige Werte scheinen bei Rechnung mit ganzen Zahlen zu 
alternieren, bei Wurzel 255 kann er sich nicht zwischen 15 und 17 
entscheiden. Im Zweifelsfall der kleinere Wert.

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.