Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
Multiplication 16 bits par 16 bits
Bonjour Temps-x,
tout à fait d'accord, merci de corriger cette erreur, mais ça milite plutôt pour ma proposition puisque ça ajoute encore quatre lignes de code à taper à l'utilisateur . Imagine que tu fournisses, en parallèle de ton sous-programme la macro suivante :
L'utilisateur qui veut effectuer l'opération suivante Résultat = Opérande1* Opérande2, les trois étiquettes désignant des variables 16 bits, n'a plus qu'à écrire :
N'est-ce pas plus facile pour lui ?
J'ai bien vu la fonction de remise à 0 d'un espace de zone mémoire dont je ne doute pas qu'il marche et qui doit être bien commode . Mais comme cette remise à zéro est obligatoire pour lancer la multiplication, pourquoi la confier à l'utilisateur qui risque de l'oublier plutôt que de la faire au début du code de multiplie (pas dans la macro que je propose ce qui gâcherait de la mémoire programme)
Tout à fait au début de multiplie on peut ajouter
C'est ton code légèrement modifié pour ne mettre à 0 que le produit. Toujours ça de moins à faire pour l'utilisateur .
Remarque que, dans les propos ci-dessus, je suis très léger. Ceci ne peut marcher, sans soucis, que si l'utilisateur n'utilise qu'une page de code et qu'une banque de RAM ce qui est très restrictif. Encore pas mal de lignes à écrire pour rendre ces questions transparentes à l'utilisateur.
Dans ces échanges, je ne veux surtout pas mettre de polémique, ce sont des points de vue différents et complémentaires. Ton propos est de montrer la mise en oeuvre d'un algorithme sur un point précis dont beaucoup ont besoin et c'est très bien réussi, mon propos pousse le bouchon un peu plus loin et essaye de faciliter le réemploi de ce travail par un tiers qui, a priori ne devrait avoir à se soucier que de la fonctionnalité, s'il fait confiance à l'auteur, et de sa mise en oeuvre. Comme cela a pu être observé dans pas mal de mes posts, c'est un de mes dadas. Il est vrai qu'ils ont peu d'écho
Le résultat du produit se fait sur une longueur de 32 bits, ce qui donne,
tout à fait d'accord, merci de corriger cette erreur, mais ça milite plutôt pour ma proposition puisque ça ajoute encore quatre lignes de code à taper à l'utilisateur . Imagine que tu fournisses, en parallèle de ton sous-programme la macro suivante :
Code : Tout sélectionner
_multiplie macro V1, V2, res8
movf V1, W
movwf multiplicateur
movf V1+1, W
movwf multiplicateur+1
movf V2 W
movwf multiplicande
movf V2+1, W
movwf multiplicande+1
call multiplie
movf produit,W
movwf res8
movf produit+1,W
movwf res8+1
movf produit+2,W
movwf res8+2
movf produit+3,W
movwf res8+3
L'utilisateur qui veut effectuer l'opération suivante Résultat = Opérande1* Opérande2, les trois étiquettes désignant des variables 16 bits, n'a plus qu'à écrire :
Code : Tout sélectionner
_multiplie Opérande1, Opérande2, Résultat
N'est-ce pas plus facile pour lui ?
Temps-x a écrit :Source du message Il appartient à l'utilisateur de remettre les variables à zéro, c'est bien pour cela que j'ai fait dans l'exemple une fonction de remis à zéro
J'ai bien vu la fonction de remise à 0 d'un espace de zone mémoire dont je ne doute pas qu'il marche et qui doit être bien commode . Mais comme cette remise à zéro est obligatoire pour lancer la multiplication, pourquoi la confier à l'utilisateur qui risque de l'oublier plutôt que de la faire au début du code de multiplie (pas dans la macro que je propose ce qui gâcherait de la mémoire programme)
Tout à fait au début de multiplie on peut ajouter
Code : Tout sélectionner
;********************** mettre à zéro du résultat **************************
movlw D'4' ; nombre d'octets utilisés par le produit
movwf loop1
movlw low(produit) ; adresse de départ du produit
movwf FSR
call efface_variable
C'est ton code légèrement modifié pour ne mettre à 0 que le produit. Toujours ça de moins à faire pour l'utilisateur .
Remarque que, dans les propos ci-dessus, je suis très léger. Ceci ne peut marcher, sans soucis, que si l'utilisateur n'utilise qu'une page de code et qu'une banque de RAM ce qui est très restrictif. Encore pas mal de lignes à écrire pour rendre ces questions transparentes à l'utilisateur.
Dans ces échanges, je ne veux surtout pas mettre de polémique, ce sont des points de vue différents et complémentaires. Ton propos est de montrer la mise en oeuvre d'un algorithme sur un point précis dont beaucoup ont besoin et c'est très bien réussi, mon propos pousse le bouchon un peu plus loin et essaye de faciliter le réemploi de ce travail par un tiers qui, a priori ne devrait avoir à se soucier que de la fonctionnalité, s'il fait confiance à l'auteur, et de sa mise en oeuvre. Comme cela a pu être observé dans pas mal de mes posts, c'est un de mes dadas. Il est vrai qu'ils ont peu d'écho
Multiplication 16 bits par 16 bits
Bonjour JJE, et tout le forum,
Oui pour la simplicité, pas pour le programme qui va grossir à chaque fois que tu vas utiliser cette macro, tu vas augmenter la taille du programme.
Un sous programme le fait pas, donc quand c'est possible utilisation d'un sous programme.
La macro doit être utilisé à dose modéré, sinon on va se retrouvé avec un fichier énorme.
Oui c'est ce que je préconise ICI regarde l'exemple 2 le commentaire.
Avec les Pic18Fxxxx plus de problème de bank, quand l'utilisateur écrit son programme, c'est à lui de gérer c'est bank.
On va pas tout lui faire
J’apprécie tes remarques, et je ne vois aucune polémique dans tes propos, et à toi pour nous reprendre. et on discuté.
Un forum ça sert à ça, heureusement qu'il y a pas qu'une idée, sinon le monde serais triste.
A+
JJE a écrit :Source du message L'utilisateur qui veut effectuer l'opération suivante Résultat = Opérande1* Opérande2, les trois étiquettes désignant des variables 16 bits, n'a plus qu'à écrire :Code : Tout sélectionner
_multiplie Opérande1, Opérande2, Résultat
N'est-ce pas plus facile pour lui ?
Oui pour la simplicité, pas pour le programme qui va grossir à chaque fois que tu vas utiliser cette macro, tu vas augmenter la taille du programme.
Un sous programme le fait pas, donc quand c'est possible utilisation d'un sous programme.
La macro doit être utilisé à dose modéré, sinon on va se retrouvé avec un fichier énorme.
JJE a écrit :Source du message C'est ton code légèrement modifié pour ne mettre à 0 que le produit. Toujours ça de moins à faire pour l'utilisateur
Oui c'est ce que je préconise ICI regarde l'exemple 2 le commentaire.
JJE a écrit :Source du message Ceci ne peut marcher, sans soucis, que si l'utilisateur n'utilise qu'une page de code et qu'une banque de RAM ce qui est très restrictif.
Avec les Pic18Fxxxx plus de problème de bank, quand l'utilisateur écrit son programme, c'est à lui de gérer c'est bank.
On va pas tout lui faire
JJE a écrit :Source du message Dans ces échanges, je ne veux surtout pas mettre de polémique, ce sont des points de vue différents et complémentaires.
J’apprécie tes remarques, et je ne vois aucune polémique dans tes propos, et à toi pour nous reprendre. et on discuté.
Un forum ça sert à ça, heureusement qu'il y a pas qu'une idée, sinon le monde serais triste.
A+
Modifié en dernier par Temps-x le ven. 7 juin 2019 16:27, modifié 1 fois.
Multiplication 16 bits par 16 bits
Temps-x a écrit :Source du message Oui pour la simplicité, pas pour le programme qui va grossir à chaque fois que tu vas utiliser cette macro, tu vas augmenter la taille du programme.
Un sous programme le fait pas, donc quand c'est possible utilisation d'un sous programme.
il faudra bien que l'utilisateur recopie ses variables dans celles du sous-programme, autant que la macro le fasse, ça ne prendra pas plus de code. Même chose pour la récupération du résultat.
Temps-x a écrit :Source du message Avec les Pic18Fxxxx plus de problème de bank, quand l'utilisateur écrit son programme, c'est à lui de gérer c'est bank.
Je ne suis pas du tout clair sur les Pic18, je vais m'y mettre, mais si j'ai bien compris il y a un registre BSR, je crois, qu'il faut renseigner par le numéro de la banque avant d'accéder à une variable de cette banque
Temps-x a écrit :Source du messageOn va pas tout lui faire
J'ai un avis différent, si on propose un outil, c'est pour décharger l'utilisateur de tâches standard. Ceci lui permet de ne s'intéresser qu'à son problème. Si je prends l'exemple de la CNC, l'intérêt du projet, dans sa partie informatique, c'est plus d'envoyer des pulses aux trois moteurs, de bien positionner leur sens de rotation en fonction des données lues, ce n'est pas tellement de faire des additions, multiplications 16, 24 ou 32 bits.
Si on me prête un couteau, j'aime bien qu'il coupe, s'il me faut l’affûter, je suis moins content
Multiplication 16 bits par 16 bits
Bonjour JJE, et tout le forum,
Si cette macro est utilisé 10 fois, tu réécris 10 fois les mêmes lignes dans ton code, je veux même pas imaginé la taille du programme, je reviendrais pas dessus.
BSR doit être mis à 0 au départ de ton pic, normalement il est à 0, mais moi je le mets des le départ, comme ça je suis tranquille, c'est tout, après
il faut se servir des nouvelles instructions pour ses Pics qui élimine l’accès au banc, exceptés les interruptions ou il faut manipuler BSR.
Il faut un peu évoluer pour l'affuter quand il faut.
A+
JJE a écrit :Source du message il faudra bien que l'utilisateur recopie ses variables dans celles du sous-programme, autant que la macro le fasse, ça ne prendra pas plus de code.
Si cette macro est utilisé 10 fois, tu réécris 10 fois les mêmes lignes dans ton code, je veux même pas imaginé la taille du programme, je reviendrais pas dessus.
JJE a écrit :Source du message Je ne suis pas du tout clair sur les Pic18, je vais m'y mettre, mais si j'ai bien compris il y a un registre BSR, je crois, qu'il faut renseigner par le numéro de la banque avant d'accéder à une variable de cette banque
BSR doit être mis à 0 au départ de ton pic, normalement il est à 0, mais moi je le mets des le départ, comme ça je suis tranquille, c'est tout, après
il faut se servir des nouvelles instructions pour ses Pics qui élimine l’accès au banc, exceptés les interruptions ou il faut manipuler BSR.
JJE a écrit :Source du message Si on me prête un couteau, j'aime bien qu'il coupe, s'il me faut l’affûter, je suis moins content
Il faut un peu évoluer pour l'affuter quand il faut.
A+
Multiplication 16 bits par 16 bits
Bonjour Temp-x,
M'intéressant à des problèmes voisins de ceux là, j'ai remis le nez dans le sous-programme que tu proposes dans ce sujet. En fait, je n'avais pas encore analysé comment tu sortais de la boucle sur les 16 bits. Je subodore des problèmes.
As-tu essayé quelque chose comme H'xx01' comme multipliCATEUR ? Je dirais bien qu'on sort de la boucle dès le traitement du premier chiffre.
En fait, tout nombre dont l'écriture en binaire comporte la suite de chiffre '00000001' dans son écriture posera problème, sauf si tous ceux situés à sa gauche sont des zéros.
unà la place du devrait corriger le problème.
Je n'ai pas fait de test réel, je me trompe dans mon analyse ?
M'intéressant à des problèmes voisins de ceux là, j'ai remis le nez dans le sous-programme que tu proposes dans ce sujet. En fait, je n'avais pas encore analysé comment tu sortais de la boucle sur les 16 bits. Je subodore des problèmes.
As-tu essayé quelque chose comme H'xx01' comme multipliCATEUR ? Je dirais bien qu'on sort de la boucle dès le traitement du premier chiffre.
En fait, tout nombre dont l'écriture en binaire comporte la suite de chiffre '00000001' dans son écriture posera problème, sauf si tous ceux situés à sa gauche sont des zéros.
un
Code : Tout sélectionner
iorwf multiplicateur+1,
Code : Tout sélectionner
xorlw D'1'
Je n'ai pas fait de test réel, je me trompe dans mon analyse ?
Multiplication 16 bits par 16 bits
Bonjour JJE, et tout le forum,
Regarde le début de la routine, et essai là, STP
Au début de la routine on teste la variable multiplicateur du poids faible, histoire de voir si celle-ci est impaire sur bit 0.
Puis en dessous si c'est pas le cas on test si elle n'est pas à 1
Si tu passe le premier test, tu arrives à la routine paire, hors tu ne pourras jamais avoir 1 au début de ta routine en passant le premier test
En réalité, c'est pareil ....., mais il y a une astuce ou ça demande réflexion, là il faut pensée en binaire ..... ,
Il y a qu'un truc qui peu planter la routine, c'est si le multiplicateur sur 16 bits est à 0, c'est tout.
J'ai omis cette fonction parce que faire une multiplication par 0, c'est ballot.
A+
Regarde le début de la routine, et essai là, STP
Code : Tout sélectionner
multiplie
btfsc multiplicateur+0,0
call impaire
paire
movf multiplicateur+0,W
xorlw D'1'
btfsc STATUS,Z
return
Au début de la routine on teste la variable multiplicateur du poids faible, histoire de voir si celle-ci est impaire sur bit 0.
Puis en dessous si c'est pas le cas on test si elle n'est pas à 1
Si tu passe le premier test, tu arrives à la routine paire, hors tu ne pourras jamais avoir 1 au début de ta routine en passant le premier test
En réalité, c'est pareil ....., mais il y a une astuce ou ça demande réflexion, là il faut pensée en binaire ..... ,
Il y a qu'un truc qui peu planter la routine, c'est si le multiplicateur sur 16 bits est à 0, c'est tout.
J'ai omis cette fonction parce que faire une multiplication par 0, c'est ballot.
A+
Multiplication 16 bits par 16 bits
Bonjour Temps-x,
J' ai commencé à mettre en doute mes vieux neurones, et, ne comprenant pas où je me trompais, j'ai fait un projet MPLAB avec ton source, en ne modifiant QUE la valeur des variables et voici le résultat sous MPSim
On constate bien que l'on sort de la boucle trop tôt, ni le multiplicateur ni le multiplicande n'ont été touchés, sans voir le bit armé dans multiplicateur+1
La modification que je t'ai suggérer semble marcher, au moins sur un test.
En effet, un multiplicateur nul va planter, mais ce n'est rien à tester en début de routine, de plus le résultat est déjà prêt dans ce cas. C'est vrai que c'est ballot de multiplier par 0, mais l'appelant n'en sait parfois rien.
J' ai commencé à mettre en doute mes vieux neurones, et, ne comprenant pas où je me trompais, j'ai fait un projet MPLAB avec ton source, en ne modifiant QUE la valeur des variables et voici le résultat sous MPSim
On constate bien que l'on sort de la boucle trop tôt, ni le multiplicateur ni le multiplicande n'ont été touchés, sans voir le bit armé dans multiplicateur+1
La modification que je t'ai suggérer semble marcher, au moins sur un test.
En effet, un multiplicateur nul va planter, mais ce n'est rien à tester en début de routine, de plus le résultat est déjà prêt dans ce cas. C'est vrai que c'est ballot de multiplier par 0, mais l'appelant n'en sait parfois rien.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Multiplication 16 bits par 16 bits
Bonjour JJE, et tout le forum,
Fait un test avec un nombre, sur le multiplicateur et le multiplicande, et dit moi le nombre que tu as pris pour les deux
Pour le test du 0 on peut effectivement le faire, car si on a une routine qui tourne, et qui fasse des multiplications tout seule
C'est mieux......
A+
Fait un test avec un nombre, sur le multiplicateur et le multiplicande, et dit moi le nombre que tu as pris pour les deux
Pour le test du 0 on peut effectivement le faire, car si on a une routine qui tourne, et qui fasse des multiplications tout seule
C'est mieux......
A+
Multiplication 16 bits par 16 bits
Multiplication 16 bits par 16 bits
Bonjour JJE, et tout le forum,
Le programme fonction très bien, je vois pas ou est le problème.
Regarde le résultat, qui est affiché à droit, il est correct, et de plus il y a bien sortie de la boucle comme tu peux le voir à gauche.
H'10F1145' = H'201' X H'8745'
17764677 = 512 X 34629
A+
Le programme fonction très bien, je vois pas ou est le problème.
Regarde le résultat, qui est affiché à droit, il est correct, et de plus il y a bien sortie de la boucle comme tu peux le voir à gauche.
H'10F1145' = H'201' X H'8745'
17764677 = 512 X 34629
A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le ven. 14 juin 2019 19:49, modifié 1 fois.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 101 invités