Forum: Mikrocontroller und Digitale Elektronik Rechenoperationen


von BA (Gast)


Lesenswert?

bräuchte mal ein paar infos über rechenoperationen bei der avr family. 
gibts da irgendwo ein tutorial ??

muss folgende formel berechnen:  X = (ZAHL1 * ZAHL2) / 2

von Steffen (Gast)


Lesenswert?

Hmm...
Multiplizieren kann man, indem man Zahl1 auf sich selbst addiert und das 
Zahl2 mal. Die Division durch 2 erreicht man durch as Verschieben nach 
rechts.

Sollte ich mich täuschen, dann berichtigt mich.


Bye
Steffen

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hallo,

auf http://users.i.com.ua/~birua/math32.html , da ist außerdem eine 
Riesenmenge Makros für allgemeine Anwendungen dabei.

MfG
Andreas

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hallo Steffen,

ein Beispielprogramm für eine einfache 8bit x 8bit = 8bit Addition, so 
wie du es dir überlegt hast, findest du hier:
http://www.mikrocontroller.net/forum/read.php?f=1&i=632&t=631

MfG
Andreas

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

schau dort in den Anhang mul.asm!

von Steffen (Gast)


Lesenswert?

.include "d:\tools\wavrasm\appnotes\4433def.inc

.def zahl1 = r20
.def zahl2 = r21



    ldi  ZH, 0
    mov  ZL, ZH
mul:    add  ZL, zahl1
    brcs  ueber
    rjmp  n_ueber
ueber:    inc  ZH    ;Übertrag nach ZH addiert
n_ueber:  dec  zahl2
    breq  div    ;wenn Zahl2 = 0 dann ist Multiplikation fertig
    rjmp  mul
div:    lsr  ZH
    brcc  div_1    ;kein Übertrag? ..dann spring
    inc  zahl2    ;der Übertrag muss zu ZL dazu, aber erst nach der 
Division
div_1:    lsr  ZL
    brcc  fertig    ;kein Übertrag? ..dann spring
          ;sonst, Rest vorhanden...
fertig:    add  ZL, zahl2  ;fertig, Das Ergebnis steht in ZH:ZL
main:    rjmp main

von Steffen (Gast)


Lesenswert?

Ist ne 8Bit*8Bit Multiplikation mit anschließender Division durch 2
Das Ergebnis ist 16Bit (ZH:ZL)
Zahl2 wird während der Berechnung überschrieben!

Achtung: Es kann zu einem gerundetem Ergebnis kommen (Rest entsteht 
->Carry-Flag wird gesetzt; 1Bit läßt sich eben schlecht teilen ;))

von BA (Gast)


Lesenswert?

ok..thx ich werds mal testen

von Steffen (Gast)


Lesenswert?

@BA

Noch ein Nachtrag:
Da wo steht ";sonst, Rest vorhanden..."
müsstest du die Nachkommastelle erzeugen. Ist nicht weiter schwer. Das 
Carry-Flag representiert den "Verlust" eines Bits bei dem Schieben. Das 
Bit bedeutet also, daß deine Nachkommastelle 5 ist (1/2).

Der Algorithmus ist im ungünstigsten Fall (worst case) ziehmlich 
langsam. Das tritt dann auf, wenn Zahl2 größer ist als Zahl 1. Nach 
möglichkeit sollte man also die beiden untereinander austauschen.

Bsp: 3*100 (Zahl1 * Zahl2)

So durchläuft man 100 mal eine Schleife...und addiert immer 3 auf Zahl1

Vertauscht man Zahl1 und Zahl2 so durchläuft man die Schleife nur 3 mal 
und addiert 100 zu Zahl1.


Bye
Steffen

PS: man kann einen Sprung in dem Algorithmus sparen

brcc      k_ueber    ;Carry nicht gesetzt -> kein Übertrag ->springe
inc       ZH         ;Übertrag nach ZH addiert
k_ueber:  dec  zahl2

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.