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