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
Caisse à outils
Bonjour à tous et en particulier à F6FCO
En relisant ta routine d'addition 16 bits non signé, j'ai noté le problème soulevé par l'exemple suivant. Je veux ajouter les nombres 0x0363 et 0xFFA2, Le tableau suivant donne les valeurs des différentes variables concernées à chaque étape de ta procédure :
On trouve comme résultat 0x0305 avec STATUS,C = 0. Il faudrait que STATUS,C = 1 pour un résultat correct (0x10305 qui demande 17 bits)
Le problème vient de la retenue pouvant se produire dans l'ajout des octets de bas poids que tu traites très élégamment d'ailleurs, mais tu ne traites pas le cas où, la prise en compte de cette retenue en provoque une à son tour (c'est le rôle du FF en haut poids du deuxième opérande). Plus loin, STATUS,C est effacé par le dernier addwf.
Je te propose cette altenative
mais pourquoi pas cette alternative utilisant une macro :
qui est bien sûr un peu plus gourmande en code (mais moins en données) mais fait gagner les 8 instructions d'initialisation de valeur1 et valeur2.
Et pourquoi pas pendant qu'on y est :
qui a l'avantage de travailler sur les variables avec lesquelles on invoque la macro, c'est presque un passage de paramètres des langages évolués par valeur pour les deux premiers par référence pour le troisième.
En fait, on trouve ici un résultat sur 17bits dont le bit de haut poids (b16) est la valeur de STATUS, C.
Cordialement
En relisant ta routine d'addition 16 bits non signé, j'ai noté le problème soulevé par l'exemple suivant. Je veux ajouter les nombres 0x0363 et 0xFFA2, Le tableau suivant donne les valeurs des différentes variables concernées à chaque étape de ta procédure :
On trouve comme résultat 0x0305 avec STATUS,C = 0. Il faudrait que STATUS,C = 1 pour un résultat correct (0x10305 qui demande 17 bits)
Le problème vient de la retenue pouvant se produire dans l'ajout des octets de bas poids que tu traites très élégamment d'ailleurs, mais tu ne traites pas le cas où, la prise en compte de cette retenue en provoque une à son tour (c'est le rôle du FF en haut poids du deuxième opérande). Plus loin, STATUS,C est effacé par le dernier addwf.
Je te propose cette altenative
Code : Tout sélectionner
addition16
movf valeur1,W
addwf valeur2
btfsc STATUS,C
goto $+4
movf valeur1+1,W
addwf valeur2+1
return
incfsz valeur2+1,f
goto $+5
movf valeur1+1,W
addwf valeur2+1,f
bsf STATUS,C
return
movf valeur1+1,W
addwf valeur2+1
return
mais pourquoi pas cette alternative utilisant une macro :
Code : Tout sélectionner
addition16 macro valeur1, valeur2
movf valeur1,W
addwf valeur2
btfsc STATUS,C
goto $+4
movf valeur1+1,W
addwf valeur2+1
goto $+9
incfsz valeur2+1,f
goto $+5
movf valeur1+1,W
addwf valeur2+1,f
bsf STATUS,C
goto $+3
movf valeur1+1,W
addwf valeur2+1
endm
qui est bien sûr un peu plus gourmande en code (mais moins en données) mais fait gagner les 8 instructions d'initialisation de valeur1 et valeur2.
Et pourquoi pas pendant qu'on y est :
Code : Tout sélectionner
addition16 macro valeur1,valeur2,resultat
; initialiser resultat
clrf resultat
clrf resultat+1
; additionner les octets de bas poids
movf valeur1,W
addwf valeur2,w
movwf resultat
btfsc STATUS,C
goto $+.5 ; si retenue, aller 5 instructions plus loin
; ici pas de retenue dans l'addition des octets de bas poids
; on s'occupe des octets de haut poids
movf valeur1+1,W
addwf valeur2+1,w
movwf resultat+1 ; ne touche pas à STATUS,C
goto $+.10 ; aller à l'instruction qui suit l'invocation de la macro
; ici, l'addition des octets de bas poids a provoqué une retenue
; on la compte dans le résultat
incf resultat+1,f
; on ajoute les octets de haut poids, résultat dans W
movf valeur1+1,W
addwf valeur2+1,W
btfss STATUS,C
goto $+4 ; si pas de retenue dans cette addition
; ici, il y a eu une retenue,on ajoute quand même au résultat précédent
addwf resultat+1,f
; et on le dit
bsf STATUS,C
goto $+.2 ; aller à l'instruction qui suit l'invocation de la macro
; on ajoute au résultat précédent ce qui arme STATUS,C en fonction du résultat
addwf resultat+1,f
endm
qui a l'avantage de travailler sur les variables avec lesquelles on invoque la macro, c'est presque un passage de paramètres des langages évolués par valeur pour les deux premiers par référence pour le troisième.
En fait, on trouve ici un résultat sur 17bits dont le bit de haut poids (b16) est la valeur de STATUS, C.
Cordialement
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Caisse à outils
- F6FCO
Expert- Messages : 1417
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Bonsoir JJE,
Oupss, j'étais déjà passé à autre chose, il va falloir que je remette le nez dedans . Je n'ai pas le temps de regarder cela de suite parce que je me prépare à retourner sur mon chantier mais j'emmène une copie de tout çà sur ma clé (pas d'internet la_bas) et je regarderai cela de près le soir après le boulot, et vu la météo qu'ils annoncent j'aurai le temps. Par contre il faudra que je rajoute des étiquettes dans tes exemples parce que les "$" me piquent les yeux. On en reparle à mon retour, c'est sympa de t'être penché sur mes routines
Oupss, j'étais déjà passé à autre chose, il va falloir que je remette le nez dedans . Je n'ai pas le temps de regarder cela de suite parce que je me prépare à retourner sur mon chantier mais j'emmène une copie de tout çà sur ma clé (pas d'internet la_bas) et je regarderai cela de près le soir après le boulot, et vu la météo qu'ils annoncent j'aurai le temps. Par contre il faudra que je rajoute des étiquettes dans tes exemples parce que les "$" me piquent les yeux. On en reparle à mon retour, c'est sympa de t'être penché sur mes routines
Caisse à outils
- F6FCO
Expert- Messages : 1417
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Re,
Finalement çà me turlupinait et j'ai pris le temps de regarder çà rapidement. C'est normal, j'avais bien pensé à cette retenue et c'est d'ailleurs un souci abondamment évoqué sur le net mais au départ j'ai développé ces routines pour servir dans mon programme de conduite d'axes CNC et le résultat doit-être lu dans V2 qui est une variable 16bits, donc je n'ai pas traité le bit dépassant.
Mais tu as raison et même si ce 17ème bit n'est pas utilisé il doit être traité par la routine, je vais m'en occuper .
D'ailleurs çà doit être aussi la même chose pour la routine d'addition 32 bits, il faudra que je regarde aussi.
Finalement çà me turlupinait et j'ai pris le temps de regarder çà rapidement. C'est normal, j'avais bien pensé à cette retenue et c'est d'ailleurs un souci abondamment évoqué sur le net mais au départ j'ai développé ces routines pour servir dans mon programme de conduite d'axes CNC et le résultat doit-être lu dans V2 qui est une variable 16bits, donc je n'ai pas traité le bit dépassant.
Mais tu as raison et même si ce 17ème bit n'est pas utilisé il doit être traité par la routine, je vais m'en occuper .
D'ailleurs çà doit être aussi la même chose pour la routine d'addition 32 bits, il faudra que je regarde aussi.
Caisse à outils
Les instructions apportées par le 18F simplifient grandement les choses.
ADDWFC W+F+C
SUBFWB W-F-C
SUBWFB F-W-C
NEGF complément à 2
plus les opérations de comparaison
Ne pas oublier http://www.piclist.com/techref/microchip/routines.htm
c'est un peu fouillis, mais y a plein de code
ADDWFC W+F+C
SUBFWB W-F-C
SUBWFB F-W-C
NEGF complément à 2
plus les opérations de comparaison
Ne pas oublier http://www.piclist.com/techref/microchip/routines.htm
c'est un peu fouillis, mais y a plein de code
Caisse à outils
Bonsoir satinas et tout le forum,
Je suis d'accord avec toi, mais il faut penser à ceux qui ne veulent pas passer par les 18F, c'est un peu comme si je te disais
le passage au pic32 te simplifie grandement les choses, bon je sais, j’exagère, mais je vais y réfléchir.
Merci pour le lien
A+
Je suis d'accord avec toi, mais il faut penser à ceux qui ne veulent pas passer par les 18F, c'est un peu comme si je te disais
le passage au pic32 te simplifie grandement les choses, bon je sais, j’exagère, mais je vais y réfléchir.
Merci pour le lien
A+
Caisse à outils
Caisse à outils
satinas a écrit :
Source du message je pensais surtout à l'application CNC
Ne le dit pas à F6FCO, j'ai fait tout le programme de la CNC avec un 18F, pourvu qu'il ne lise pas ce post
Caisse à outils
- F6FCO
Expert- Messages : 1417
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Je me suis caché les yeux avec la main, Keskidit ?
Moi les 18F çà me dit bien, les nouvelles instructions semblent être bien pratiques. Reste le choix du PIC, pour le moment j'ai écris mes routines d'accélérations sur un 16F88 en pensant les porter sur un 16F877. Donc je n'en suis qu'aux prémices du projet et je me dis que démarrer carrément par une immersion 18f c'est la meilleure façon d'apprendre. Il faut que je trouve un template soit pour 18F4525 ou 18F4550 (que j'ai en stock). Pas envie de me battre avec la config dés le départ, j'aurai le temps de voir cela quand je serai plus moustachu.
J'ai vu que Bigonoff utilise un 18F258 dans son cours, j'espère qu'il n'y a pas grande différence.
Moi les 18F çà me dit bien, les nouvelles instructions semblent être bien pratiques. Reste le choix du PIC, pour le moment j'ai écris mes routines d'accélérations sur un 16F88 en pensant les porter sur un 16F877. Donc je n'en suis qu'aux prémices du projet et je me dis que démarrer carrément par une immersion 18f c'est la meilleure façon d'apprendre. Il faut que je trouve un template soit pour 18F4525 ou 18F4550 (que j'ai en stock). Pas envie de me battre avec la config dés le départ, j'aurai le temps de voir cela quand je serai plus moustachu.
J'ai vu que Bigonoff utilise un 18F258 dans son cours, j'espère qu'il n'y a pas grande différence.
Caisse à outils
Caisse à outils
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 120 invités