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
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
Hallo, auf http://users.i.com.ua/~birua/math32.html , da ist außerdem eine Riesenmenge Makros für allgemeine Anwendungen dabei. MfG Andreas
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
.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
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 ;))
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.