-
16/05/2010 - 16h45 hindou90
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+
-
16/05/2010 - 16h50 DAUDET78
Re : multiplication de 2 octets
Dans ton µC, tu as une instruction de multiplication ?
L'age n'est pas un handicap .... Encore faut-il arriver jusque là pour le constater ! -
16/05/2010 - 17h17 Jack
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.
-
16/05/2010 - 17h30 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)
L'age n'est pas un handicap .... Encore faut-il arriver jusque là pour le constater ! -
17/05/2010 - 08h01 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 -
17/05/2010 - 09h51 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).
-
17/05/2010 - 11h55 Jack
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+
-
17/05/2010 - 12h31 PA5CAL
Re : multiplication de 2 octets
 Envoyé par Jack 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).  Envoyé par Jack 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.
-
17/05/2010 - 21h26 Jack
Re : multiplication de 2 octets
je m'incline 
A+
-
19/05/2010 - 23h53 hindou90
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 -
20/05/2010 - 00h24 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.
-
20/05/2010 - 00h29 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).
-
26/05/2010 - 21h46 hindou90 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+
-
26/05/2010 - 22h59 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 ?
-
27/05/2010 - 06h45 hindou90
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 | | |