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

Demande d'aide sur MPASM
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » sam. 23 juin 2018 18:30

Bonjour tous et chacun,
Je prépare un papier décrivant une technique qui permet de se passer des macros pagesel et autorise le déplacement d'un sous-programme d'une page à l'autre sans soucis.
Elle est opérationnelle sur le programme suivant, cependant, je rencontre quelques difficultés que je décris après et sur lequel, un coup de main me permettait d'améliorer mon prochain post.

Code : Tout sélectionner

;**********************************************************************
;
           Programme de test de la gestion de relais                           *
;
                     d'appel de sous-programme
;                                                                     *
;**********************************************************************
;                                                                     *
;    NOM: Test relais                                         *
;    Date: 23/06/2018 début de projet                                 *                         
;    Version: 1                                                       *
;    Circuit:  Tout Mid-range au moins                                                    *
;    Auteur        JJE
;                                                                     *
;**********************************************************************
;                                                                     *
;    Fichier requis:                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes: 
;                                                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************


;    LIST      p=16F876             ; Définition de processeur
;    #include <p16F876.inc>         ; Définitions des constantes
;
;    __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON     ; & _HS_OSC
;

;*********************************************************************
;                              ASSIGNATIONS                          *
;*********************************************************************
PCLATH    EQU 0xA

;*********************************************************************
;                             DEFINE                                 *
;*********************************************************************

; adresse de fin de la mémoire programme en page 0 plus 1
    variable RelaisSSP = 0x800    ; pour un 12F876 par exemple
    
; où installer le code du sous-programme
#DEFINE        SSP_Code    0x100    

;*********************************************************************
;                   DECLARATIONS DE VARIABLES                        *
;*********************************************************************

    CBLOCK 0x020                   ; début de la zone variables
    ENDC                        ; Fin de la zone                        

;**********************************************************************
;                      DEMARRAGE SUR RESET                            *
;**********************************************************************

    org 0x000                     ; Adresse de départ après reset
      goto    init                ; Adresse 0: initialiser

    
;*********************************************************************
;                       INITIALISATIONS                              *
;*********************************************************************

init
    call    AppelSSP    ;RelaisSSP-.12
    pagesel    init2
    call    init2
    pagesel    init3
    call    init3
    pagesel    init4
    call    init4
    pagesel init
    goto init

    org SSP_Code
SSP
    nop
    nop
    nop
    return
    
    org 0x800
init2
    call    AppelSSP    ;RelaisSSP-.12
    return
    
    org 0x1000
init3
    call    AppelSSP    ;RelaisSSP-.12
    return
    org 0x1800
init4
    call    AppelSSP    ;RelaisSSP-.12
    return
    

RelaisSSP -= .12    ;.5    

AppelSSP EQU    RelaisSSP


    ORG    RelaisSSP
    ; si on arrive ici, sauf sur erreur de programme, 
    ; on est sûr que PCLATH<4, 3> = b'
00'
;    if (SSP & 0x800) == 0x800
;        ; SSP est en page 1 ou 3
;        ; il faut armer PCLATH,3
;        bsf    PCLATH, 3
;    endif
    call    SSP
    ; et le désarmer avant de sortir
    bcf    PCLATH, 3
    return
    
    ORG    RelaisSSP + 0x800
    ; si on arrive ici, sauf sur erreur de programme, 
    ; on est sûr que PCLATH<4, 3> = b'
01'
    bcf    PCLATH,3
    call    SSP
    bsf    PCLATH,3
    return
    
    ORG    RelaisSSP + 0x1000
    ; si on arrive ici, sauf sur erreur de programme, 
    ; on est sûr que PCLATH<4, 3> = b'
10'
    bcf    PCLATH,4
    call     SSP
    bsf    PCLATH,4
    return
    
    ORG    RelaisSSP + 0x1800
    ; si on arrive ici, sauf sur erreur de programme, 
    ; on est sûr que PCLATH<4, 3> = b'
11'
    bcf    PCLATH,3
    bcf    PCLATH,4
    call    SSP
    bsf    PCLATH,3
    bsf    PCLATH,4
    return

    end


L'idée est d'installer en fin de chaque page programme un segment de code qui met PCLATH en état de relayer la demande effectue la demande te remet PCLATH en l'état initial.
Dans l'état ci-dessus, ça marche bien parceque SSP est en page 0, mais si je le déplace dans une autre page, il me faut modifier les 4 relais en conséquence. pour éviter ce travail, j'ai imaginé le code, en commentaire ci-dessus,

Code : Tout sélectionner


    ORG    RelaisSSP
    
; si on arrive ici, sauf sur erreur de programme, 
    
; on est sûr que PCLATH<4, 3> = b'00'
;    if (SSP & 0x800) == 0x800
;        ; SSP est en page 1 ou 3
;        ; il faut armer PCLATH,3
;        bsf    PCLATH, 3
;    endif
    call    SSP
*
qu'il faut bien sûr dupliquer en l'adaptant à tous les relais. Le problème est que, si j'enlève les commentaires le Linker se fâche :

Error[151] E:\DOCUMENTS DE JJ\MES PROJETS MPLAB\TUTOS\TEST RELAIS\TEST RELAIS.ASM 110 : Operand contains unresolvable labels or is too complex


J'ai pourtant déjà écrit des if plus compliqués. Une idée ?

Deuxième problème :
en ligne 102

Code : Tout sélectionner


RelaisSSP 
-= .12    ;.5    


La variable d'assemplage RelaisSSP est initialisé à la plus grande adresse mémoire programme plus 1 en page 0 tout au début du source.
Son but est de faciliter l'usage de cette technique pour plusieure sous-programmes.
Les relais faisant au plus 5 octets, les installer 5 octets avant me semblait cohérent. Si je le fais, le Linker gronde :
Error - section '.org_8' can not fit the absolute section. Section '.org_8' start=0x00001ffb, length=0x0000000c

d'où le .12 'length=0x0000000c) utilisé mais pac compris :?:

Troisième problème l'initialisation de la variable RelaisSSP

Code : Tout sélectionner

; adresse de fin de la mémoire programme en page 0 plus 1
    variable RelaisSSP 
= 0x800    ; pour un 16F876 par exemple

est en dur dans le programme, MPASM fournit-il un procédé, bien caché alors, pour connaître cette valeur. Un équivalent de __MAXRAM en fait mais pour la mémoire programme ? Si on laisse en l'état et qu'on assemble pour un 16F83, l'assembleur râle :
Error[126] E:\DOCUMENTS DE JJ\MES PROJETS MPLAB\TUTOS\TEST RELAIS\TEST RELAIS.ASM 70 : Argument out of range (07FB not between 0000 and 01FF)

Quatrième problème : Le code ci-dessus suppose que le Pic mis en oeuvre a 4 pages de mémoire programme, si ce n'est pas le cas, le Linker râle

Error - section '.org_3' can not fit the absolute section. Section '.org_3' start=0x00001000, length=0x00000004

MPASM fournit-il un procédé, bien caché alors, pour connaître le nombre de pages ou leur taille ? Une réponse au pb. précédent devrait donner une réponse à celui-ci, mais pas sûr.

Des réponses à ces questions me permettraient de finaliser ce sujet de manière beaucoup plus confortable pour l'utilisateur. Les pb. sont présentés dans leur ordre de priorité. Pouvoir déplacer un SSP sans n'avoir rien à faire d'autre me semble très utile, c'est vrai que ce n'est que pour les gros programmes :sifflotte:

merci d'avance à qui se penchera sur ces questions

Cordialement
Cordialement

JJE

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

Demande d'aide sur MPASM
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#2 Message par satinas » sam. 23 juin 2018 21:36

Bonjour JJE,

Pour la première question, on en a déjà parlé, il faut mettre le projet en mode "Absolute". Dans ce mode, on a droit à un seul fichier source (+ includes). Cela permet dès la phase d'assemblage de connaître les adresses exactes des variables et sous-programmes. Le linker n'a alors pas grand chose à faire, il se contente de produire le fichier hex. Dans ce mode la fenêtre watch réserve aussi moins de surprises.

Le mode "Relocatable" permet d'assembler plusieurs fichiers source de façon indépendante, et d'incorporer des bibliothèques, et dans ce cas c'est le linker qui attribue les adresses définitives. Il regroupe les divers fichiers assemblés avec des adresses relatives, pour produire le fichier hex. Tu risques donc d'avoir des messages d'erreur si tu cherches à connaître ou utiliser des adresses pas encore attribuées.

Pour la deuxième question, le sous-programme en 0x1800 + RelaisSSP comporte 6 instructions, il faut donc reculer d'au moins 6 et pas 5.

Code : Tout sélectionner

    ORG    RelaisSSP + 0x1800
    bcf    PCLATH,3
    bcf    PCLATH,4
    call    SSP
    bsf    PCLATH,3
    bsf    PCLATH,4
    return


Pour les dernières questions, si cela n'existe pas, reste plus qu'à se faire une macro ou quelque chose du même style, avec plein de if, qui
retourne la taille de la flash selon le type de pic.
En lisant ta prose, je découvre des choses nouvelles pour moi, comme l'utilisation de la directive "variable".

Demande d'aide sur MPASM
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#3 Message par JJE » dim. 24 juin 2018 07:12

merci satinas,
ma pauvre mémoire m'a encore trahi, j'avais bien dans la tête d'avoir déjà rencontré ce problème et qu'il avait trouvé une solution simplement, mais j'avais totalement oublié notre échange et donc tes conseils que j'avais pourtant très bien compris et largement appréciés mais ils n'ont pas refait surface . Je me demande bien pourquoi je me suis trouvé en mode relocatable, je ne m'en sers jamais :eek: . Sûrement une fausse manipe à la création du projet.

Pour la deuxième question, le sous-programme en 0x1800 + RelaisSSP comporte 6 instructions, il faut donc reculer d'au moins 6 et pas 5.

merci pour la remarque, je ne sais même plus compter jusqu' 6 :cry: et bien sûr ça marche :sifflotte:

Pour la suite, je vais me rabattre sur une ou deux variables supplémentaires que l'utilisateur aura à charge d'initialiser, je ne me vois pas étudier tous les pics et faire une macro géante qui donnerait les informations :roll:

Merci, grâce à toi, je vais pouvoir finaliser ce post.
Cordialement

JJE

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

Demande d'aide sur MPASM
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#4 Message par F6FCO » ven. 29 juin 2018 09:40

satinas a écrit :il faut mettre le projet en mode "Absolute". Dans ce mode, on a droit à un seul fichier source (+ includes). Cela permet dès la phase d'assemblage de connaître les adresses exactes des variables et sous-programmes. Le linker n'a alors pas grand chose à faire, il se contente de produire le fichier hex. Dans ce mode la fenêtre watch réserve aussi moins de surprises.

Le mode "Relocatable" permet d'assembler plusieurs fichiers source de façon indépendante, et d'incorporer des bibliothèques, et dans ce cas c'est le linker qui attribue les adresses définitives. Il regroupe les divers fichiers assemblés avec des adresses relatives, pour produire le fichier hex. Tu risques donc d'avoir des messages d'erreur si tu cherches à connaître ou utiliser des adresses pas encore attribuées.

Je comprends mieux maintenant pourquoi on ne peut pas visualiser les variables dans Watch en Relocatable, j'ai galéré avec çà au début.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Bing [Bot] et 47 invités