-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Kommazahlen - addieren, multiplizieren - in ASSEMLBER

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2006
    Beiträge
    13

    Kommazahlen - addieren, multiplizieren - in ASSEMLBER

    Anzeige

    Hallo,
    folgender Sachverhalt:

    Ich habe den Pic 16f628 und muss hiermit Kommazahlen addieren und multiplizeiren, bisher habe ich leider keinen blassen schimmer wie das realiseren kann. ICH PROGRAMMIERE IN ASSEMBLER.

    Kurze Beschreibung des gesamten Systems:
    Hab einen Sensor der mir binär (8 bit) Werte ausgibt z.B. Temperatur, Spannung usw.

    Ich bekomme den Wert 80 binär am Sensor ausgegeben, diesen Wert lege ich im Pic an einem Speicherbereich ab. Nun um hieraus die Bestriebsspannung zu ermitteln muss ich diese Zahl mit 0.0184 multiplizieren und dann mit 1.74 addieren d.h.

    80 * 0.0184 + 1.74 = 3.212

    dass heisst ich habe die Betriebsspannung von 3.212 V an meinen Sensor anliegen habe.

    Wie kann ich nun den Wert 80 (binär) mit den Kommazahlen (auch binär da ich im assembler proggramiere) multiplizieren und addieren .

    Eine Stelle hinterm Komma ist nach der Rechnung völlig ausreichend.

    Vielen Dank für EURE hilfe.

    [flash width=100 height=100][/flash]

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    09.07.2005
    Ort
    Hangover
    Alter
    51
    Beiträge
    45
    Hallo,
    die Frage ist dann immer, was mit dem Ergebnis passieren soll ?
    Meist rechnet man nicht in "Kommazahlen", sondern kann eine geschickte Integer-Arithmetik nehmen...

    Also,
    was passiert mit dem Ergebnis ?

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    AM einfachstn geht das wohl, indem du auf 32- oder 16-Bit Zahlen zurückgreifst.

    Je nachdem, wie die Genauigkeit/Wertebereich sein soll und wie diese zwischen Vor- und Nachkommastellen verteilt sein soll. ETwa: 8 Bit vor dem komma und 8 Bit danach.

    Oder du multipliziert den genzen Salat mit 1000:

    80 * 18.4 + 1740 = 3212

    Die .4 musst du dann runden

    80 * 18 + 1724 = 3180

    Oder du nimmst 2000 und rundest auf 37:

    80 * 37 + 3480 = 6440 = 2 * 3220

    Hier reichen schon 16 Bit aus zum Berechnen. Du kannst natürlich auch jeden anderen Faktor nehmen, es bieten sich aber 2er Potenzen und evtl Zehnerpotenzen besonders an. Erstere, weil damit leicht zu rechen ich auf einem µC; Zweitere, weil man für die Darstellung oft Dezimal verwendet.
    Die 2000 ist eine Kombination aus beiden, danach noch durch 2 zu teilen ist ja ein Klacks...
    Disclaimer: none. Sue me.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2006
    Beiträge
    13
    Vorab Vielen dank einmal!!!

    An bigwumpus:
    Das ergebnis soll an einem LCD-Display ausgegeben werden. Es wäre für mich ausreichend erst mal die mathematischen operation anzuwenden. ich wüßte nicht einmal die ich multplizieren könnte, also wie der befehl in assembler aussehen würde. Ich will das ergebnis erst mal irgendwo im speicher ablgegen. ich habe mir auf der microchip seite umgeguckt und flouting point routines (an575) gefunden aber von denen habe ich nichts verstanden. erst weil ich noch anfänger bin und zweitens mein englisch ist auch nicht das ware.


    An sprintersb:

    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?

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2006
    Beiträge
    13
    Noch etwas, in der pdf datei der an575 stehen die pic bezeichnungen immer mit 16cXXX oder 17cXXX wäre diese dann auch für 16FXXX , also für die F variente geeignet?

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    09.07.2005
    Ort
    Hangover
    Alter
    51
    Beiträge
    45
    die Prozessoren verarbeiten die gleichen Befehle !

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    67
    Beiträge
    2.063
    Hallo funkuhr,
    einen MUL- oder DIV-Befehl gibt es beim PIC in Assembler leider nicht.
    Deshalb mußt Du bei Microchip (oder anderswo) nach geeigneten Routinen suchen.
    Bei Microchip gibt es die AN 526 Math Utillity Routines mit z.B. der Routine FXD1608U (FX=fixed Point, D=Division, 1608=16Bit DIV 08Bit, U=unsigned=ohne Vorzeichen) oder das Maco UDIV1608L (U=unsigned=ohne Vorzeichen, DIV=Division, 1608 = 16Bit DIV 08Bit, L=???)
    Für Multiplikation gibt es z.B. die Routine D_mpy = 16Bit MUL 16Bit.
    Mulu0810 (08Bit MUL 10 ohne Vorzeichen) oder Divu0810 (08Bit DIV 10 ohne Vorzeichen) findest Du unter http://www.domnick-elektronik.de/picasm.htm
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    04.01.2006
    Beiträge
    13
    hallo,

    hab meine rechung so umgestellt das ich nun ganze zahlen habe und die zahl

    ((x * 1772) +102400) / 1024

    verarbeiten muss. Nun habe ich einen 8 bit pic und die

    zahl x ist 8 bit lang.
    die zahl 1772 ist 11 bit lang und
    102400 ist 17 bit lang.

    nun habe ich auf der microchip seite die routine gefunden, die eine 16 bit und 8 bit zahl zusammen multipliziert. Routine FXM68.A16 (AN617)

    Nun weiß ich nicht, wie die diese routine in meinen Assembler code einbinde?

    und wie ich die 11 bit lange zahl der routine übergebe.? ich kann mir vorstellen das die 11 bit zahl in zwei teile aufgeteilt wird (hi teil und lo teil) aber ich verstehe nicht in welchen speicher welcher teil rein kommt.

    und des weiteren steht im quelltext der routine c quelltext änlicher text.ist das möglich? oder verstehe ich den quelltext falsch. ich schreibe in assembler wird mplab diesen text dann verstehen können.

    vielen dank

    p.s. um die addition kümmere ich mich später und die division habe ichmir sagen lassen bedeutet für 1024, das letzte byte verwerfen und die bits 2 stellen verschieben.(nach rechts).

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    27.01.2006
    Beiträge
    44
    hallo funkuhr,

    ich bin leider etwas "kurz angebunden", daher vorerst eine kurze Antwort. Also die Gleichung die Du auswerten musst ist ziemlich einfach. Zunächst solltest Du noch die Division durchführen:

    x*1772/1024 + 100

    Damit reduziert sich das ganze Problem auf die Auswertung des ersten Terms. Dieser kann mit einer Fixed-Point Multiplikation wie in der AN erledigt werden. Die .../1024 Division wird dann quasi "nebenbei" erledigt.
    Also FXM1608, bzw. bei signed x die FXM1608S. Wenn Du damit noch nicht zurecht kommst, kann ich Dir morgen (mehr zeit) den Code reinstellen.

    Grüße
    Mario

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

    hast recht - die 102400/1024 kann ich ja schon vorher teilen und somit das ganze vereinfachen.

    Wie gesagt, hab mir die Routine FXM68.A16 (AN617) angeguckt. hier
    ist auch das unterprogramm FXM1608 vorhanden. (FXM1608U =unsigned oder FXM1608S =signed) . x ist ist bei mir immer positiv also die "u"-version.
    wie halt beschrieben komme ich nicht so ganz klar damit. Mit der Einbindung in meinen code, und das stückchen quelltext was wie c-code aussieht macht mich auch stutzig.

    Wäre dir für jede hilfe dankbar.
    Vielen dank.

    cu und
    mfg

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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