multiplication de 2 octets
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

multiplication de 2 octets



  1. #1
    invitee2f3230c

    multiplication de 2 octets


    ------

    bonsoir
    svp je voudrais mesurer la fréquence d'un signal pour cela j'utilise le microcontroleur 68hc11 et plus précisément le timer .
    j'utilise ce dernier parce qu'il me donne N1 et N2 qui ce sont les valeurs du timer :
    N1=>premier front montant.
    N2=>deuxième front montant.
    fmes=10^3/(N2-N1)*résolution.
    fmes =fréquence mésurée (en KHZ)
    resolution c'est une valeur de 1 octet
    (N2-N1) est sur 2 octets car le timer 16 bits

    bon,le probléme qui me bloque c'est le calcul de dénominateur c à d je n'arrive pas à faire la multiplication entre une valeur sur 2 octets et une autre sur 1 octet

    si quelque peut m'aider, je serais très reconnaissante

    merci d'avance
    a+

    -----

  2. #2
    DAUDET78

    Re : multiplication de 2 octets

    Dans ton µC, tu as une instruction de multiplication ?
    J'aime pas le Grec

  3. #3
    Jack
    Modérateur

    Re : multiplication de 2 octets

    Il faut tout de suite savoir que le résultat sera sur 24 bits (3 octets).

    Pour le calcul, il faut appliquer ce qu'on voit à l'école primaire pour les multiplications à 2 chiffres: ça donne 2 multiplications à 1 chiffre et une addition (en prenant bien soin de décaler d'un chiffre à gauche le résultat de la 2ème multiplication avant l'addition.

    Ex: je vais te montrer qu'on peut multiplier 5 par 23 avec uniquement des multiplication à 1 chiffre:

    3 x 5 = 15
    2 x 5 = 10, j'ajoute un 0 à droite ce qui donne 100
    j'additionne: 15 + 100 = 115, ce qui est bien égal à 5 x 23.

    Pour Daudet
    Dans ton µC, tu as une instruction de multiplication ?
    oui: MUL

    A+
    Dernière modification par Jack ; 16/05/2010 à 17h21.

  4. #4
    DAUDET78

    Re : multiplication de 2 octets

    bon, il y a l'instruction MUL (8bit par 8bit résultat sur 16bit)
    http://louispayen.apinc.org/pedagogie/cboyf1/hc11ji.pdf

    Donc tu as un mot de 16 bits , soit deux octets B1 et B0
    Donc tu as un octet de 8 bits A0

    Multiplication de B0xA0 résultat sur 16 bits soit deux octets X1 X0
    Multiplication de B1xA0 résultat sur 16 bits soit deux octets Y1 Y0

    C0 represente un octet contenant la valeur 0 (0x00 en héxa)
    Addition sur 24 bits des mots 24 bits : (C0 X1 X0)+(Y1 Y0 C0)
    J'aime pas le Grec

  5. A voir en vidéo sur Futura
  6. #5
    freepicbasic

    Re : multiplication de 2 octets

    le résultat d'une multiplication de 2 octets sera un int de 16 bits.

    considérons pas exemple;
    12 x 137
    137 en binaire ;1000 1001
    Nous devons additionner le resultat de tous les décalages qui correspondent aux 1

    Code:
    1000 0000 = 128 = 7 décalages
    0000 1000 =   8 = 3 décalages
    0000 0001 =   1 = aucun décalage
    
    12 x 128 = 1536
    12 x 008 = 0096
    12 x 0001= 0012
    
      1536 + 96 + 12   = 1644
    
      12 x 137   = 1644
    A+, pat

  7. #6
    PA5CAL

    Re : multiplication de 2 octets

    Bonjour

    Comme l'a justement rappelé DAUDET78, le 68HC11 possède la multiplication dans son jeu d'instruction. Quand il est apparu sur le marché, c'était d'ailleurs son principal intérêt, ses concurrents 8 bits ne proposant pas cette opération.

    De mémoire (parce que ça fait des lustres que je n'ai pas fait d'assembleur 68HC11), le code pour une multiplication du type:
    ¨¨ op3 = op1 x op2
    avec
    ¨¨ op1 sur 1 octet
    ¨¨ op2 sur 2 octets (msb,lsb = b1,b0)
    ¨¨ op3 sur 3 octets (msb-lsb = b2,b1,b0)
    doit donner quelque chose comme :
    Code:
    LDAA op1      ; A = op1
    LDAB op2_b0   ; B = op2:b0 (poids faible)
    MUL           ; D = A x B
    STD  op3_b1   ; résultat dans op3:b1,b0 (poids faible)
    LDAA op1      ; A = op1
    LDAB op2_b1   ; B = op2:b1 (poids fort)
    MUL           ; D = A x B
    ADDB op3_b1   ; B = B + op3:b1
    ADCA #0       ; A = A + retenue
    STD  op3_b2   ; résultat dans op3:b2,b1 (poids fort)
    Pour rappel, l'accumulateur 16 bits D est constitué des accumulateur 8 bits A (msb) et B (lsb), et le stockage en mémoire procède en commençant par l'octet de poids fort (convention Motorola).

  8. #7
    Jack
    Modérateur

    Re : multiplication de 2 octets

    j'aurais mis la carry à 0 avant
    ADDB op3_b1

    et je remplacerais
    STD op3_b2

    par
    STA op3_b2

    car tu as déjà additionné le registre B

    A+

  9. #8
    PA5CAL

    Re : multiplication de 2 octets

    Citation Envoyé par Jack Voir le message
    j'aurais mis la carry à 0 avant
    ADDB op3_b1
    Ce n'est pas nécessaire, car ADDB fait l'addition sans tenir compte de la retenue existante (contrairement à ADCB).

    Citation Envoyé par Jack Voir le message
    et je remplacerais
    STD op3_b2

    par
    STA op3_b2

    car tu as déjà additionné le registre B
    Non.

    La première addition doit modifier le contenu du deuxième octet du résultat.

    Il faut donc bien re-stocker la valeur finale de B dans op3:b1.

    .
    Dernière modification par PA5CAL ; 17/05/2010 à 12h36.

  10. #9
    Jack
    Modérateur

    Re : multiplication de 2 octets

    je m'incline

    A+

  11. #10
    invitee2f3230c

    Re : multiplication de 2 octets

    merci pour toutes ces riches réponses
    si j'avais bine compris our faire la multiplication A 2otect* B 1octet, je prend B 1 octet*le poind faible de la valeur A dont la taille est 2 octet
    et puis je multiplier B avec le poind le plus fort et enfin je fait l'addiction,non?

    Mais SVP il y a une instruction que je l'ai pas saisi:
    ADCA #0 ; A = A + retenue
    réponse de PA5CAL
    merci de m'exepliquer de quoi s'agit-il?

    enfin MERCI beaucoup


  12. #11
    PA5CAL

    Re : multiplication de 2 octets

    Code:
    ADCA #0 ; A = A + retenue
    ADCA signifie "Add with carry to accumulator A", c'est-à-dire addition avec retenue à l'accumulateur A.

    Le # indique une valeur immédiate.

    Ici l'instruction ajoute 0 à A (poids fort du résultat) en tenant compte du bit de retenue (C=carry) qui a éventuellement été positionné lors de l'addition précédente (poids faible du résultat). C'est une manière simple et rapide d'ajouter la retenue à un accumulateur.

    Au lieu de cela, on aurait pu tester le bit de retenue C, puis incrémenter A dans le cas où C=1. Mais cela aurait nécessité plusieurs instructions, et donc un gaspillage de temps et de mémoire.

  13. #12
    PA5CAL

    Re : multiplication de 2 octets

    Dit autrement, la suite des deux additions :
    Code:
    ADDB op3_b1   ; B = B + op3:b1
    ADCA #0       ; A = A + retenue
    réalise l'addition de l'octet op3_b1 à l'accumulateur 16 bits D (constitué de A et B).

  14. #13
    invitee2f3230c

    Question Re : multiplication de 2 octets

    ok
    l'opération ,que je veux réaliser:
    Fmes=E83*2/(N2-N1)

    le probléme qui se pose maintenant ,c'est que le résultat du numérateur est sur 3 octet ,alors que pour faire la division ,je charge le numérateur dans D, mais le D est juste sur 2 octet!!
    Code:
    LDAA #2
    LDAB #$83
    MUL
    STD resultat_lsb
    LDAA #2
    LDAB #$E
    MUL
    ADDB resultat_lsb
    ADCA #0
    STA   resultat_msb
    le resultat_lsb est sur 2 octet ainsi que le resultat_msb donc au total 4 octet ,donc comment le chargé dans le l'accumulateur D !

    a+

  15. #14
    PA5CAL

    Re : multiplication de 2 octets

    Pour la multiplication, on a utilisé la même méthode que si l'on faisait le calcul à la main sur plusieurs chiffres.

    Pour la division, c'est pareil.

    Tu sais faire la division d'un nombre à plusieurs chiffres à la main ? Par exemple, comment fais-tu pour diviser 298 par 14 ?

  16. #15
    invitee2f3230c

    Re : multiplication de 2 octets

    ah ok
    je vais diviser resultat_msb/(N2-N1) et puis je l'aditionne à resultat_lsb/(N2-N1):
    Fmes=E83*2/(N2-N1)=resultat_msb/(N2-N1)+resultat_lsb/(N2-N1).
    n'est ce pas ?

    merci tjrs pour votre réponse

Discussions similaires

  1. octets
    Par invite254e45a5 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 21/11/2007, 14h25
  2. reception 2 octets en I2C
    Par noisyboxes dans le forum Électronique
    Réponses: 15
    Dernier message: 05/06/2007, 08h43
  3. Octets envoyés ?!
    Par freesbeep dans le forum Internet - Réseau - Sécurité générale
    Réponses: 155
    Dernier message: 25/01/2007, 21h25
  4. bits et octets
    Par frgo84 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 5
    Dernier message: 04/12/2005, 19h56
  5. imagerie médicale : pixels/ octets/ couleurs...
    Par vero0oo dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 09/03/2005, 22h55
Découvrez nos comparatifs produits sur l'informatique et les technologies.