- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: Kommazahlen - addieren, multiplizieren - in ASSEMLBER

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von funkuhr
    wie sieht den zum beispiel der code in assembler für 80 * 18 aus oder 45 / 2 oder 45/7 um es bischen schwere zu machen?
    Öhm... an Assembler kann ich nur bieten AVR, 6510, TriCore und XC16x

    Division und Multiplikation kann man immer so machen, wie man es in der Grundschule lernt, nur eben im Dualsystem anstatt zur Basis 10. Das Handwerkszeug, das man dazu braucht, hat jeder µC:

    -- eine Zahl auf 0 setzen
    -- eine Zahl negieren
    -- 2 Zahlen vergleichen und abhängig davon springen
    -- testen, ob eine Zahl durch 2 teilbar ist und abhängig davon springen
    -- 2 Zahlen addieren/subtrahieren, evtl mit Übertrag
    -- eine Zahl rechts/links schieben (also durch 2 teilen bzw. mit 2 multiplizieren), evtl mit Übertrag

    ...und das war's auch schon!

    Ist ne ganz gute Fingerübung das. Und man kann testen, ob man damals wirklich aufgepasst hat *g*.
    Disclaimer: none. Sue me.

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    27.01.2006
    Beiträge
    44
    Hallo,

    OK ich seh schon, Du bist richtig erst am Anfang. Ich würde Dir ein Buch zur Einführung in die Assemblerprogrammierung empfehlen. Der Umgang mit Dualzahlen ist unabdingbar und tägliches Brot. D.h. auch wenn ich Dir hier gleich die Lösung hinschreibe, hast Du damit eigentlich nichts gelernt und nichts gewonnen.

    Schau Dir am besten mal: http://de.wikipedia.org/wiki/Dualsystem
    an. Dort ist alles bestens anhand von Beispielen erklärt.

    So und jetzt geb ich Dir einen Tipp wie Du dein Problem "optimal" im Sinne von Laufzeit löst:

    y = x
    y <<= 1
    y += x
    y <<= 2
    y += x
    y = y + (y<<4)
    y = (y<<1) + x
    y <<= 2
    y += 0x19000

    Ergebnis: Die zahl die Du suchst, multipliziert mit 1024, d.h. Genauigkeit ca. 0,001. yi muss 24 Bit sein, also 3 Bytes. Im Anschluss musst Du das Ergebnis noch ins Dezimalsystem umrechnen und auf dem Display ausgeben.

    Überleg Dir mal warum das so passt (hoffe habe keinen Tippfehler).

    Grüße
    Mario

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2006
    Beiträge
    13
    Hallo Mario,

    irgendwie hast du mich misverstanden glaube ich.

    Noch mal eine Kurze Beschreibung.

    Ich habe die Formel (Luftdruck in k Pascal)

    p/(kPa) = x *1772/1024 +100

    die Zahl x ist eine 8-Bit Zahl, welches ich von meinem Drucksensor auslese und in den Pic hinterlege. Je nach Luftdruck ändert sich die Zahl x. Also x ist keine unbekannte. Wenn ich dann den Luftdruck in kilo pascal ermitteln will, muss ich die obige Formel ausrechnen. Nun habe ich halt probleme die Multiplikation auszuführen und das auch noch mit einem 8-bit Pic. Das ist nun eine 8-bit Zahl multipliziert mit einer 11-bit zahl. Auf papier ( auch in duazahl format)kein Problem aber nun halt das ganze zu programmieren .... ohh man.....hab die routinen gefunden, aber ich komm damit noch nicht so ganz klar. Weil ich noch ein newby im programmieren bin und bisher auch noch nie so etwas gemacht habe. Alle anfang ist halt schwer.

    Ich brauche halt ein stückchen quellcode an dem ich die 8-bit zahl und die 11-bit Zahl übergebe und der mir dann 3 byte groß (also dual) das ergebnis "ausspuckt".

    P.S. Ich kenne mich mit dualzahlen, dezimalzahlen, oktalzahlen und etc. ziemlich gut aus. Ich weiß wie ich von der einen Form in die andere Form umrechnen kann. (Auf papier) Das Ganze zu Programieren ist doch der tot. Daher wollte ich mir abhilfe mit den routinen schaffen, aber komm damit noch nicht ganz klar. (Wieso das Rad neu erfinden???)


    Vielen Dank

    Andi

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    27.01.2006
    Beiträge
    44
    Hallo Andi,

    irgendwie bin ich jetzt etwas verwirrt. Die Lösung ist in der AN, also einfach rauskopieren und fertig. Was Du so schreibst klingts wohl mehr nach Verständnisproblem, und nein, ich weiß schon dass x die Eingabegröße ist. Achja, je nachdem welche Genauigkeit Du brauchst werden 8-Bit unter umständen nicht ausreichen.
    Programmieren auf dem PIC ist ja ein Kinderspiel, nur 35 Befehle. Da musst Du halt jeden einzelnen Befehl in der Referenz nachschlagen und in einen für Dich verständlichen Pseudocode aufschreiben. Das bleibt Dir in keinem Fall erspart!

    So als kleine Gedankenanregung (alles andere als optimal, nur quick und dirty, nicht gestestet):
    Code:
     clrf  Y0
     movlw  0x08
     movwf  LOOPCOUNT
     goto $+5
    mul_loop
     bcf STATUS,C
     rlf Y2,f
     rlf Y1,f
     rlf Y0,f
     rlf x,f
     btfss STATUS,C
     goto no_add
     movlw low(1772)
     addwf Y2,f
     movlw high(1772)
     btfsc STATUS,C
     movlw high(1772+1)
     addwf Y1,f
     btfsc STATUS,C
     incf Y0,f
    no_add
     decfsz LOOPCOUNT,f
     goto mul_loop
    Den Rest must jetzt selber machen, das Programm schreibt Dir hier keiner. Es geht doch schließlich darum auch was zu lernen dabei.

    Grüße
    Mario

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    27.01.2006
    Beiträge
    44
    Nachtrag: es sollte natürlich low(D'1772') bzw. high(D'1772') heissen und (Y1, Y2) müssen vorher mit geladen werden. Y1 = low(D'1772'), Y2=high(D'1772').

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test