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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Caisse à outils
JJE
Amateur
Amateur
Messages : 128
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#21 Message par JJE » sam. 12 mai 2018 18:32

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 :

ADd16.JPG


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 :sifflotte: 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.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

Caisse à outils
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 445
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#22 Message par F6FCO » sam. 12 mai 2018 19:41

Bonsoir JJE,
Oupss, j'étais déjà passé à autre chose, il va falloir que je remette le nez dedans :lol:. 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 :wink:
Une porte nand prend 2 bits en entrée... cochonne va !!!

Caisse à outils
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 445
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#23 Message par F6FCO » sam. 12 mai 2018 20:06

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 :wink: .

D'ailleurs çà doit être aussi la même chose pour la routine d'addition 32 bits, il faudra que je regarde aussi.
Une porte nand prend 2 bits en entrée... cochonne va !!!

Caisse à outils
satinas
Passioné
Passioné
Messages : 274
Enregistré en : novembre 2015

#24 Message par satinas » sam. 12 mai 2018 20:48

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

Caisse à outils
Temps-x
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 814
Enregistré en : juillet 2016
Localisation : Terre

#25 Message par Temps-x » sam. 12 mai 2018 21:12

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. :sifflotte:

Merci pour le lien :wink:

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Caisse à outils
satinas
Passioné
Passioné
Messages : 274
Enregistré en : novembre 2015

#26 Message par satinas » sam. 12 mai 2018 21:18

On est d'accord, je pensais surtout à l'application CNC, qui n'est pas une mince affaire.
Des gens qui font de l'assembleur sur pic 16 bits et 32 bits, ça doit être difficile à trouver.

Caisse à outils
Temps-x
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 814
Enregistré en : juillet 2016
Localisation : Terre

#27 Message par Temps-x » sam. 12 mai 2018 21:56

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 :sifflotte:
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Caisse à outils
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 445
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#28 Message par F6FCO » sam. 12 mai 2018 22:16

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.
Une porte nand prend 2 bits en entrée... cochonne va !!!

Caisse à outils
JJE
Amateur
Amateur
Messages : 128
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#29 Message par JJE » dim. 13 mai 2018 09:19

bonjour à tous,
merci à satinas pour son lien où j'ai trouvé, entre autre, ceci qui devrait intéresser F6FCO.
Cordialement
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

Caisse à outils
JJE
Amateur
Amateur
Messages : 128
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#30 Message par JJE » dim. 13 mai 2018 09:28

Pour F6FCO,
je n'aime pas non plus du tout les "$" mais je crains que dans les macros, les étiquettes passent mal, et je les ai donc remplacées aussi dans le sous-programme par homogénéité.
Bon chantier
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 5 invités