Lineare Abbildung ?!?!



  • Okay, ich wär zutiefst beeindruckt und unheimlich dankbar wenn mir jemand dabei helfen könnte. Folgendes Problem:
    Ein 8-Bit-Eingabewert (Port 1) mit Wertebereich 00000000b..11111111b soll linear auf dem dezimalen Ausgabewertebereich 0..50 ausgegeben werden.

    Die Gleichung dafür ist: Ausgabewert = Eingabewert * 51/256
    also ungefähr Eingabewert * 1/5

    Heißt im Klartext:
    Die ersten 5 binären Werte werden dezimal der 0 zugeordnet, die nächsten 5 der dezimalzahl 1 usw.

    Ich könnte das entweder in einer Tabelle machen oder eben über o.g. Gleichung. Jedoch muss ich dafür binäre Multiplikation/Division anwenden und weiß nicht so recht wie das funktioniert.

    Hab mich mal "schlau" gemacht und folgendes herausgefunden:

    Binäre Multiplikation (die Zahl *2)
    0100
    <-
    1000

    d.h. einfach den Binärcode um eine Stelle nach links schieben.

    Division (die Zahl / 2 )
    0100
    ->
    00100

    d.h. um eine Stelle nach rechts verschieben.

    Ich hab jedoch keinen Plan wie ich das auf 1/5 bzw. die gesamte Gleichung realisieren könnte, bitte deshalb auf Knieen bettelnd um Hilfe.

    Falls es echt wer verstanden hat und mir helfen kann danke ich schonmal vielmals 🙂



  • Hi!

    ;Vorzeichenlose 8-Bit Division
             mov    cl, 5    ;Divisor 
             xor    ah, ah
             mov    al, AchtBitWert  ;(in  al, 01h  ?!)
             div    cl
             ; danach ist in al das Ergebnis und in ah der Rest
    

    MfG



  • ;noch etwas genauer mit vorzeichenloser Multiplikation & Division
    
             xor    eax, eax
             mov    al, AchtBitWert
             mov    cx, 51
             mul    cx
             shr    ax, 8        
    
             ;Ergebnis in al, ax und eax
    


  • Hab mich mit meinem Chef mal auseinander gesetzt, der meint aber, dass das nicht funktioniert (....)

    Er meinte, dass man ins Register b den Wert 5 laden soll, den Bitwert in den Akku (a). Durch den Div-Befehl kann man dann das Ergebnis im Akku finden und der Rest braucht man bei der Rechnung ja nicht.

    Naja ich befürcht mal dass das für mich ein Buch mit 7 Siegeln ist, versuch mich aber trotzdem weiterhein reinzubeißen ^^

    Danke fürs Helfen 🙂



  • Mit welchem Assembler programmierst du denn, bzw. fuer welche CPU?
    freak11s Code (auch wenn vllt. nicht optimal) funktioniert auf einer i386-kompatiblen CPU (also mit jedem Standard-PC).


  • Mod

    Kurzform ab P6:

    movzx   eax, AchtBitWert
    imul    eax, 51
    shr     eax, 8
    


  • Also ich habs jetzt mit dem Register gemacht, den Wert hab ich dann durch ne Tabelle wieder für die LED-Anzeige umgewandelt.
    Dummerweise hab ich nicht bedacht, dass 255/5 nicht 50 sondern 51 ergibt.. in meiner Tabelle standen jedoch nur 50 Werte. An der Stelle 51 war deshalb also der Inhalt FF. Aber alles in allem hats ganz gut hingehauen ^^

    Vielen Dank für die Hilfe 🙂


Anmelden zum Antworten