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
Demande d'aide sur MPASM
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.
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,
*
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 :
J'ai pourtant déjà écrit des if plus compliqués. Une idée ?
Deuxième problème :
en ligne 102
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 :
d'où le .12 'length=0x0000000c) utilisé mais pac compris
Troisième problème l'initialisation de la variable RelaisSSP
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 :
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
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
merci d'avance à qui se penchera sur ces questions
Cordialement
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
merci d'avance à qui se penchera sur ces questions
Cordialement
Demande d'aide sur MPASM
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.
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".
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
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 . Sûrement une fausse manipe à la création du projet.
merci pour la remarque, je ne sais même plus compter jusqu' 6 et bien sûr ça marche
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
Merci, grâce à toi, je vais pouvoir finaliser ce post.
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 . 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 et bien sûr ça marche
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
Merci, grâce à toi, je vais pouvoir finaliser ce post.
Demande d'aide sur MPASM
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
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.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 71 invités