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
Pb de link sur PIC16F17146
-
Marc16F17146

Membre- Messages : 6
- Enregistré en : avril 2025
Bonjour à tous,
je porte actuellement un code assembleur (fonctionnel) de PIC16F1847 vers son grand cousin PIC16F17146 (qui dispose d'une carte d'évaluation Curiosity Nano, en plus). A cette occasion, je passe également de MPLAB8 à MPLABX.
Le code cible 16 F17146 est syntaxiquement propre désormais.
Mais je me heurte à un problème au link : par des consignes ORG 0xXXXX, j'ai réparti le code sur 6 pages, et le fichier .lst me confirme la bonne localisation du code, sans conflit, et suivant bien les consigne ORG.
Mais le message retourné (sous MPLABX V6.20 /XC8 v3.00) par l'action de CLEAN and BUILD reste qu'à partir de la 2nde page, il calcule trop de lignes par page ... tout simplement parce qu'il totalise manifestement les lignes, à chaque fois, en repartant depuis l'origine absolue 0x0000, et non depuis la première instruction de la page courante.
Soyons humble : il y a forcément qqchose qui m'a échappé, mais que je n'arrive pas à fixer ... Cela parle-t-il à quelqu'un ? Merci d'avance et ceux qui pourront m'être d'un grand secours ...
Marc
je porte actuellement un code assembleur (fonctionnel) de PIC16F1847 vers son grand cousin PIC16F17146 (qui dispose d'une carte d'évaluation Curiosity Nano, en plus). A cette occasion, je passe également de MPLAB8 à MPLABX.
Le code cible 16 F17146 est syntaxiquement propre désormais.
Mais je me heurte à un problème au link : par des consignes ORG 0xXXXX, j'ai réparti le code sur 6 pages, et le fichier .lst me confirme la bonne localisation du code, sans conflit, et suivant bien les consigne ORG.
Mais le message retourné (sous MPLABX V6.20 /XC8 v3.00) par l'action de CLEAN and BUILD reste qu'à partir de la 2nde page, il calcule trop de lignes par page ... tout simplement parce qu'il totalise manifestement les lignes, à chaque fois, en repartant depuis l'origine absolue 0x0000, et non depuis la première instruction de la page courante.
Soyons humble : il y a forcément qqchose qui m'a échappé, mais que je n'arrive pas à fixer ... Cela parle-t-il à quelqu'un ? Merci d'avance et ceux qui pourront m'être d'un grand secours ...
Marc
Modifié en dernier par Marc16F17146 le mer. 30 avr. 2025 22:32, modifié 1 fois.
Pb de link sur PIC16F17146
Bonsoir Marc,
Il est difficile de bien comprendre quel est ton problème. Peux-tu joindre si possible le projet MPLABX en format zip, ou un un mini-projet qui fait apparaître le problème. Il y a une option menu "package" dans MPLABX.
Tu changes de processeur tout en restant en assembleur, donc tu utilises l'assembleur PIC-AS livré avec XC8 ? Ou alors tu es passé au C avec XC8 ?
Je crois que la directive ORG n'est plus en odeur de sainteté dans le nouvel assembleur car il n'y a plus de mode absolu, seul le mode relocatable reste et on déclare des sections PSECT.
The much-abused ORG directive moves the location counter to an offset relative to the base address of the current psect, not to an absolute address. The ORG directive is not commonly required in programs.
Il est difficile de bien comprendre quel est ton problème. Peux-tu joindre si possible le projet MPLABX en format zip, ou un un mini-projet qui fait apparaître le problème. Il y a une option menu "package" dans MPLABX.
Tu changes de processeur tout en restant en assembleur, donc tu utilises l'assembleur PIC-AS livré avec XC8 ? Ou alors tu es passé au C avec XC8 ?
Je crois que la directive ORG n'est plus en odeur de sainteté dans le nouvel assembleur car il n'y a plus de mode absolu, seul le mode relocatable reste et on déclare des sections PSECT.
The much-abused ORG directive moves the location counter to an offset relative to the base address of the current psect, not to an absolute address. The ORG directive is not commonly required in programs.
Pb de link sur PIC16F17146
-
Marc16F17146

Membre- Messages : 6
- Enregistré en : avril 2025
Bonsoir et merci Satinas,
Info : en effet, je suis resté en assembleur, avec l'assembleur PIC-AS V3.00.
Tu tiens très certainement la piste (que je ne connaissais pas.
Car depuis ce matin en tâtonnant sur les options des directives PSECT j'ai progressé :
- voici la rédaction adoptée, sytématique sur chaque rupture de page (2048 Kmots max), AVEC désormais en plus RELOC=2 et local à chaque PSECT, labellé identiquement mainCode
"
PSECT mainCode,class=CODE,space=0,reloc=2,delta=2,local
ORG 0x2000
mainCode8:
...
retlw 125
retlw 128
PSECT mainCode,class=CODE,space=0,reloc=2,delta=2,local
ORG 0x2600
mainCode9:
END
désormais seul le dernier segment (pourtant vide d'instructions) résiste au linker : le code global s'étalant jusqu'à l'adresse 0x02600, la fenêtre de résultat affiche ceci :
::: error: (1347) can't find 0x2600 words (0x2600 withtotal) for psect "mainCode" in class "CODE" (largest unused contiguous range 0x800)
NB : si j'enlève cette section de programme fictive N° 9, le linker reporte l'erreur sur la section d'avant N°8 : toujours la dernière section, donc. Comme si local n'était pas considéré sur une dernière section, ou un autre atypisme du genre sur la dernière section ...
Et le fichier .lst répartit correctement le code sur les adresses allouées par les consignes ORG
En //, je vais voir à faire un projet-étalon équivalent, témoignant du souci, mais peut-être y a-t-il qqchose de flagrant ?
Merci d'avance ...
PS : le fichier .zip est dispo, mais je ne vois pas trop d'option pour le déposer ou l'envoyer ...
Info : en effet, je suis resté en assembleur, avec l'assembleur PIC-AS V3.00.
Tu tiens très certainement la piste (que je ne connaissais pas.
Car depuis ce matin en tâtonnant sur les options des directives PSECT j'ai progressé :
- voici la rédaction adoptée, sytématique sur chaque rupture de page (2048 Kmots max), AVEC désormais en plus RELOC=2 et local à chaque PSECT, labellé identiquement mainCode
"
PSECT mainCode,class=CODE,space=0,reloc=2,delta=2,local
ORG 0x2000
mainCode8:
...
retlw 125
retlw 128
PSECT mainCode,class=CODE,space=0,reloc=2,delta=2,local
ORG 0x2600
mainCode9:
END
désormais seul le dernier segment (pourtant vide d'instructions) résiste au linker : le code global s'étalant jusqu'à l'adresse 0x02600, la fenêtre de résultat affiche ceci :
::: error: (1347) can't find 0x2600 words (0x2600 withtotal) for psect "mainCode" in class "CODE" (largest unused contiguous range 0x800)
NB : si j'enlève cette section de programme fictive N° 9, le linker reporte l'erreur sur la section d'avant N°8 : toujours la dernière section, donc. Comme si local n'était pas considéré sur une dernière section, ou un autre atypisme du genre sur la dernière section ...
Et le fichier .lst répartit correctement le code sur les adresses allouées par les consignes ORG
En //, je vais voir à faire un projet-étalon équivalent, témoignant du souci, mais peut-être y a-t-il qqchose de flagrant ?
Merci d'avance ...
PS : le fichier .zip est dispo, mais je ne vois pas trop d'option pour le déposer ou l'envoyer ...
Pb de link sur PIC16F17146
Pour joindre un fichier c'est ici https://www.fantaspic.fr/viewtopic.php?f=28&t=126
Il y a moyen de travailler avec des adresses absolues, ils en parlent ici https://forum.microchip.com/s/topic/a5C ... AS/t379630
La doc de l'assembleur est dans le dossier xc8 v3.00 docs
Pour ma part, j'ai essayé de démarrer un projet 16F17146, mais mes 2 versions 5.35 et 6.00 de MPLABX ne marchent plus. Elles veulent charger des packs, puis restent coincés. Peut être c'est dû à une mise à jour récente de Java, ou c'est l'IA de Microchip qui a décidé que les serveurs ne répondraient pas le 1er Mai. Bien qu'un peu ancienne, ma machine a tout de même 10 Go et un SSD de 1To. C'est à désespérer !
La 6.00 a démarré bien qu'elle boucle sur le message "Installing pack". Ce code marche avec le simulateur.
Il y a moyen de travailler avec des adresses absolues, ils en parlent ici https://forum.microchip.com/s/topic/a5C ... AS/t379630
La doc de l'assembleur est dans le dossier xc8 v3.00 docs
Pour ma part, j'ai essayé de démarrer un projet 16F17146, mais mes 2 versions 5.35 et 6.00 de MPLABX ne marchent plus. Elles veulent charger des packs, puis restent coincés. Peut être c'est dû à une mise à jour récente de Java, ou c'est l'IA de Microchip qui a décidé que les serveurs ne répondraient pas le 1er Mai. Bien qu'un peu ancienne, ma machine a tout de même 10 Go et un SSD de 1To. C'est à désespérer !
La 6.00 a démarré bien qu'elle boucle sur le message "Installing pack". Ce code marche avec le simulateur.
Code : Tout sélectionner
// 16F17146
#include <xc.inc>
psect code,delta=2,abs,global,class=CODE,space=SPACE_CODE
resetvct:
org 0
PAGESEL start
goto start
org 4
retfie
org 0x2000
start:
movlw 10
PAGESEL next
goto next
org 0x2600
next:
movlw 12
PAGESEL start
goto start
end resetvct
Pb de link sur PIC16F17146
-
Marc16F17146

Membre- Messages : 6
- Enregistré en : avril 2025
Merci Satinas,
J'ai compris l'esprit de ta solution (= utilisation minimaliste d'une SEULE directive PSECT sur la partie Code, avec rémanence des consignes ORG à l'intérieur), à laquelle je vais m'essayer.
Je me suis usé à essayer d'être académique, en m'efforçant de trouver une syntaxe substitutive de type PSECT, à chacun des points ORG de ton exemple (avec COPILOT + les renvois aux pages Microchip) ... mais je ne trouve pas de solution, et des méfiance sur la V6.20 de MPLAB qui n'est pas encore aboutie, buggée ...
Et ironie supplémentaire, je ne trouve pas le fichier .lkr pour 16F17146, il ne semble pas éditable aux usagers .... Tu attestes ? car certaines solutions COPILOT (RAM cette fois) demandaient d 'examiner si la syntaxe PSECT udata_bank4 était supportée dans le linker ...
Encore merci de ton retour d'expérience, je passe à sa mise en oeuvre ... Bon week-end Satinas !
J'ai compris l'esprit de ta solution (= utilisation minimaliste d'une SEULE directive PSECT sur la partie Code, avec rémanence des consignes ORG à l'intérieur), à laquelle je vais m'essayer.
Je me suis usé à essayer d'être académique, en m'efforçant de trouver une syntaxe substitutive de type PSECT, à chacun des points ORG de ton exemple (avec COPILOT + les renvois aux pages Microchip) ... mais je ne trouve pas de solution, et des méfiance sur la V6.20 de MPLAB qui n'est pas encore aboutie, buggée ...
Et ironie supplémentaire, je ne trouve pas le fichier .lkr pour 16F17146, il ne semble pas éditable aux usagers .... Tu attestes ? car certaines solutions COPILOT (RAM cette fois) demandaient d 'examiner si la syntaxe PSECT udata_bank4 était supportée dans le linker ...
Encore merci de ton retour d'expérience, je passe à sa mise en oeuvre ... Bon week-end Satinas !
Pb de link sur PIC16F17146
-
Marc16F17146

Membre- Messages : 6
- Enregistré en : avril 2025
Cela m'a fait passer l'obstacle, en effet !
Pour arriver à cet autre, assez laconique :
make[2]: Entering directory 'C:/Users/33660/MPLABXProjects/myPROJECTv625.X'
"C:\Program Files\Microchip\xc8\v3.00\pic-as\bin\pic-as.exe" -mcpu=PIC16F17146 -c \
-o build/default/debug/myPROJECTv625.o \
myPROJECTv625.asm \
-D__DEBUG=1 -mdfp="C:/Users/33660/.mchp_packs/Microchip/PIC16F1xxxx_DFP/1.27.418/xc8" -msummary=+mem,-psect,-class,-hex,-file,-sha1,-sha256,-xml,-xmlfull -fmax-errors=20 -mwarn=0 -xassembler-with-cpp -Wa,-a -Wl,-pintentry=4h
myPROJECTv625.asm:613:: error: (840) phase error
myPROJECTv625.asm:616:: error: (840) phase error
myPROJECTv625.asm:622:: error: (840) phase error
myPROJECTv625.asm:623:: error: (840) phase error
myPROJECTv625.asm:624:: error: (840) phase error
(suivi d'une belle infinité de cette pollution sur toutes les lignes suivantes ... )
La 1ère ligne dénoncée (613), c'est le goto TimeOUT (pourtant blindé par le PAGESEL, et de plus, figurant dans la même page (vérifié en . lst), sans ORG intercalé !
Il est un peu susceptible, le bougre, .. tu aurais une idée de sa contrariété ?
;_____________________________________________________________________________________________
;_______ INTERRUPT
;_____________________________________________________________________________________________
ORG 0x0004
Timer1ISR: ; écriture en EEPROM, sans retour ...
bank1
bcf TMR1IF
bank0
bsf TMR1IFS
PAGESEL TimeOUT
goto TimeOUT
finISR:
retfie
;_____________________________________________________________________________________________
;_______
;_______ PROGRAMME V0
;_______
;_____________________________________________________________________________________________
NOP
NOP
NOP
Pour arriver à cet autre, assez laconique :
make[2]: Entering directory 'C:/Users/33660/MPLABXProjects/myPROJECTv625.X'
"C:\Program Files\Microchip\xc8\v3.00\pic-as\bin\pic-as.exe" -mcpu=PIC16F17146 -c \
-o build/default/debug/myPROJECTv625.o \
myPROJECTv625.asm \
-D__DEBUG=1 -mdfp="C:/Users/33660/.mchp_packs/Microchip/PIC16F1xxxx_DFP/1.27.418/xc8" -msummary=+mem,-psect,-class,-hex,-file,-sha1,-sha256,-xml,-xmlfull -fmax-errors=20 -mwarn=0 -xassembler-with-cpp -Wa,-a -Wl,-pintentry=4h
myPROJECTv625.asm:613:: error: (840) phase error
myPROJECTv625.asm:616:: error: (840) phase error
myPROJECTv625.asm:622:: error: (840) phase error
myPROJECTv625.asm:623:: error: (840) phase error
myPROJECTv625.asm:624:: error: (840) phase error
(suivi d'une belle infinité de cette pollution sur toutes les lignes suivantes ... )
La 1ère ligne dénoncée (613), c'est le goto TimeOUT (pourtant blindé par le PAGESEL, et de plus, figurant dans la même page (vérifié en . lst), sans ORG intercalé !
Il est un peu susceptible, le bougre, .. tu aurais une idée de sa contrariété ?
;_____________________________________________________________________________________________
;_______ INTERRUPT
;_____________________________________________________________________________________________
ORG 0x0004
Timer1ISR: ; écriture en EEPROM, sans retour ...
bank1
bcf TMR1IF
bank0
bsf TMR1IFS
PAGESEL TimeOUT
goto TimeOUT
finISR:
retfie
;_____________________________________________________________________________________________
;_______
;_______ PROGRAMME V0
;_______
;_____________________________________________________________________________________________
NOP
NOP
NOP
Pb de link sur PIC16F17146
Bonjour,
Oui, il n'y a plus de fichier linker script, et il n'y a qu'un seul exécutable pic-as.exe lancé 2 fois. L'assemblage utilise les fichiers spécifiques 16f17146.ini, 16f17146.cfgdata et pic16f17146.inc, l'édition de liens utilise les 2 premiers. Il y a aussi les nombreuses options qu'on peut ajouter au lancement de pic-as.exe, modifiables dans MPLABX. Et peut-être d'autres paramètres non visibles.
Pour ton message d'erreur il figure dans la doc de l'assembleur :
(840) phase error (Assembler)
The assembler has calculated a different value for a symbol on two different passes. This is commonly due to the redefinition of a psect with conflicting delta values.
A la fin du fichier pic16f17146.inc il y a plusieurs PSECT prédéfinis. On peut les utiliser, mais il faut qu'il y ait cohérence dans les paramètres, notamment pour la valeur de delta. Le delta est à 1 par défaut. Pour ce pic mid-range le delta des sections de code est à 2.
Oui, il n'y a plus de fichier linker script, et il n'y a qu'un seul exécutable pic-as.exe lancé 2 fois. L'assemblage utilise les fichiers spécifiques 16f17146.ini, 16f17146.cfgdata et pic16f17146.inc, l'édition de liens utilise les 2 premiers. Il y a aussi les nombreuses options qu'on peut ajouter au lancement de pic-as.exe, modifiables dans MPLABX. Et peut-être d'autres paramètres non visibles.
Pour ton message d'erreur il figure dans la doc de l'assembleur :
(840) phase error (Assembler)
The assembler has calculated a different value for a symbol on two different passes. This is commonly due to the redefinition of a psect with conflicting delta values.
A la fin du fichier pic16f17146.inc il y a plusieurs PSECT prédéfinis. On peut les utiliser, mais il faut qu'il y ait cohérence dans les paramètres, notamment pour la valeur de delta. Le delta est à 1 par défaut. Pour ce pic mid-range le delta des sections de code est à 2.
Pb de link sur PIC16F17146
-
Marc16F17146

Membre- Messages : 6
- Enregistré en : avril 2025
Bonjour Satinas, super!
Passer de MPLAP8.92 à MPLLABX V6.25, c'est ré-apprendre à marcher. Et j'ai cherché en vain où trouver les syntaxes de PSECT dédiées à un 16F17146, je n'avais trouvé que la page Microchip inventoriant la liste et leurs options théoriques, tous µcontroleurs confondus ...
Pour le delta, j'avais bien noté que pour le code, c'était =2 ici (on aurait pu penser qu'en cas d'oubli d'explicitation, il s'en référerait au modèle de µc ...), je vais surveiller cela. Bon, tu m'as donné la lampe-torche, je repars en spéléo ... Bonne journée à toi.
Passer de MPLAP8.92 à MPLLABX V6.25, c'est ré-apprendre à marcher. Et j'ai cherché en vain où trouver les syntaxes de PSECT dédiées à un 16F17146, je n'avais trouvé que la page Microchip inventoriant la liste et leurs options théoriques, tous µcontroleurs confondus ...
Pour le delta, j'avais bien noté que pour le code, c'était =2 ici (on aurait pu penser qu'en cas d'oubli d'explicitation, il s'en référerait au modèle de µc ...), je vais surveiller cela. Bon, tu m'as donné la lampe-torche, je repars en spéléo ... Bonne journée à toi.
Pb de link sur PIC16F17146
Pb de link sur PIC16F17146
-
Marc16F17146

Membre- Messages : 6
- Enregistré en : avril 2025
OK, j'ai passé le pont, c'est compilé OK. Il m'a quand même contraint à déclarer une PSECT intentry, cela donne
;_____________________________________________________________________________________________
;_______
;_______ PROGRAM
;_______
;_____________________________________________________________________________________________
ORG 0x0000
PSECT resetVEC, class=CODE, reloc=2, delta=2
resetVEC:
PSECT myPGM,class=CODE,space=0,delta=2
ORG 0x0002
myPGM:
PAGESEL DEBUT
goto DEBUT
;_____________________________________________________________________________________________
;_______ INTERRUPT
;_____________________________________________________________________________________________
PSECT intentry,class=CODE,space=0,delta=2
ORG 0x0004
Timer1ISR: ; écriture en EEPROM, sans retour ...
bank1
bcf TMR1IF
bank0
bsf TMR1IFS
PAGESEL TimeOUT
goto TimeOUT
ISR:
retfie
Je rentre maintenant dans un cycle plus opérationnel de portage 16F1847, à 16F17146. Bonne journée !
;_____________________________________________________________________________________________
;_______
;_______ PROGRAM
;_______
;_____________________________________________________________________________________________
ORG 0x0000
PSECT resetVEC, class=CODE, reloc=2, delta=2
resetVEC:
PSECT myPGM,class=CODE,space=0,delta=2
ORG 0x0002
myPGM:
PAGESEL DEBUT
goto DEBUT
;_____________________________________________________________________________________________
;_______ INTERRUPT
;_____________________________________________________________________________________________
PSECT intentry,class=CODE,space=0,delta=2
ORG 0x0004
Timer1ISR: ; écriture en EEPROM, sans retour ...
bank1
bcf TMR1IF
bank0
bsf TMR1IFS
PAGESEL TimeOUT
goto TimeOUT
ISR:retfie
Je rentre maintenant dans un cycle plus opérationnel de portage 16F1847, à 16F17146. Bonne journée !

Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Baidu [Spider], LP_2 et 3 invités

