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

pic-as
satinas
Expert
Expert
Messages : 1489
Enregistré en : novembre 2015

#61 Message par satinas » sam. 24 janv. 2026 17:30

Code : Tout sélectionner

PSECT udata_shr
global byte1,byte2
byte1:        ds  1
byte2:        ds  1
 
PSECT udata_bits,space=1,class=COMMON,bit
global flag_ready,flag_busy,flag_error
flag_ready:   ds  1
flag_busy:    ds  1
flag_error:   ds  1

D'après le simulateur, il place bien tout cela dans la zone ACCESS en 0x70 :
- les 3 bits d'abord en 0x70 (adresses 0x380 à 0x382 car 0x380 = 0x70*8)
- puis les 2 octets en 0x71 et 0x72

Par contre il ne veut pas de bcf flag_busy, jamais à cours de surprise :-)
bcf flag_busy/8,flag_busy ça passe

Avec un define on simplifie un peu :
#define BIT(adr_bit) (adr_bit)/8,adr_bit

pic-as
LP_2
Amateur
Amateur
Messages : 141
Enregistré en : août 2022
Localisation : Haute-Loire

#62 Message par LP_2 » dim. 25 janv. 2026 13:27

Pour l'instant je garde la méthode mpasm, on verra ça plus tard quand j'aurai compris . . .

Une tentative d'analyse en attendant, premier bout pour commencer.

Code : Tout sélectionner

PSECT udata_shr
global byte1,byte2
byte1
:        ds  1
byte2
:        ds  1

- nom du psect prédéfini pour désigner la bank commune
- les flag class et space sont implicites
- global . . . est là uniquement pour permettre l'affichage des valeurs dans le simulateur
- les adresses 070h et 071h sont affectées aux variables byte1 et byte2

J'ai bon ?
Les deux psect sont-ils indépendants l'un de l'autre ? -j'ai l'impression que non-
J'y arriverai . . .

pic-as
satinas
Expert
Expert
Messages : 1489
Enregistré en : novembre 2015

#63 Message par satinas » dim. 25 janv. 2026 14:06

Ils sont indépendants l'un de l'autre, et comme ils appartiennent à une même zone mémoire, la zone ACCESS (COMMON), ils sont placés l'un derrière l'autre.
Mon exemple montre qu'il met les variables bit en premier, bien après qu'elles apparaissent après les autres dans le programme, mais bon c'est un détail. On n'a pas à se préoccuper de l'emplacement des variables.

pic-as
LP_2
Amateur
Amateur
Messages : 141
Enregistré en : août 2022
Localisation : Haute-Loire

#64 Message par LP_2 » dim. 25 janv. 2026 14:07

Ce n'est pas très important, mais j'aimerai bien savoir ce que ça veut dire en pratique.
Sortie du clean/builds :
/home/kamaz/MPLABXProjects/chargeur.S:178:: warning: (528) no start record; entry point defaults to zero
Non line specific message::: warning: (2092) relocatable list file is not available; fixup overflow list file messages cannot be generated
J'y arriverai . . .

pic-as
LP_2
Amateur
Amateur
Messages : 141
Enregistré en : août 2022
Localisation : Haute-Loire

#65 Message par LP_2 » dim. 25 janv. 2026 14:12

satinas a écrit :Mon exemple montre qu'il met les variables bit en premier, bien qu'elles apparaissent après les autres dans le programme . . .

D'accord
J'y arriverai . . .

pic-as
satinas
Expert
Expert
Messages : 1489
Enregistré en : novembre 2015

#66 Message par satinas » dim. 25 janv. 2026 14:22

Pour la 528, il faut mettre le nom de ton étiquette de reset à droite de la directive end de fin de programme.
Pour la 2092 envoie ton code, après avoir coché "Expand tabs to spaces" dans MpLabX.
Si c'est important, certains considèrent que les warnings ne le sont pas, ce n'est pas mon avis.

PS: Je n'avais pas vu que j'ai aussi le message 2092, et même en lisant la doc, je ne sais pas pourquoi, alors on va dire que c'est pas très important :-)

pic-as
LP_2
Amateur
Amateur
Messages : 141
Enregistré en : août 2022
Localisation : Haute-Loire

#67 Message par LP_2 » dim. 25 janv. 2026 14:57

OK
C'était déjà le cas, j'ai remplacé "all languages" par "assembler".
C'est un peu brouillon . . .

Code : Tout sélectionner

/* en-tête  pour les 16fxxxx En l'occurence 16f1719  */
PROCESSOR 16F1719
    
CONFIG 1
  CONFIG  FOSC 
INTOSC         Oscillator Selection Bits (INTOSC oscillatorI/function on CLKIN pin)
  
CONFIG  WDTE SWDTEN        Watchdog Timer Enable (WDT controlled by the SWDTEN bit in the WDTCON register)
  
CONFIG  PWRTE ON            Power-up Timer Enable (PWRT enabled)
  
CONFIG  MCLRE ON            MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
  
CONFIG  CP OFF        Flash Program Memory Code Protection (Program memory code protection is disabled)
  
CONFIG  BOREN SBODEN        Brown-out Reset Enable (Brown-out Reset controlled by the SBOREN bit in the BORCON register)
  
CONFIG  CLKOUTEN OFF        Clock Out Enable (CLKOUT function is disabledI/or oscillator function on the CLKOUT pin)
  
CONFIG  IESO OFF            Internal/External Switchover Mode (Internal/External Switchover Mode is disabled)
  
CONFIG  FCMEN ON            Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
CONFIG 2
  CONFIG  WRT 
OFF             Flash Memory Self-Write Protection (Write protection off)
  
CONFIG  PPS1WAY ON          Peripheral Pin Select one-way control (The PPSLOCK bit cannot be cleared once it is set by software)
  
CONFIG  ZCDDIS ON           Zero-cross detect disable (ZCD disabledZCD can be enabled by setting the ZCDSEN bit of ZCDCON)
  
CONFIG  PLLEN ON            Phase Lock Loop enable (4x PLL is enabled)
  
CONFIG  STVREN ON           Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
  
CONFIG  BORV HI             Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), high trip point selected.)
  
CONFIG  LPBOR ON        Low-Power Brown Out Reset (Low-Power BOR is disabled)
  
CONFIG  DEBUG ON            In-Circuit Debugger Mode (In-Circuit Debugger enabledICSPCLK and ICSPDAT are dedicated to the debugger)
  
CONFIG  LVP OFF             Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
    
#include <xc.inc>

les define uniquement pour ce fichier (chargeur.S)
#define        pmcon1        PMCON1        //  *** CFGS LWLO FREE WRERR WREN WR RD
#define        pmcon2        PMCON2
#define        pmadrh        PMADRH
#define        pmadrl        PMADRL
#define        pmdath        PMDATH
#define        pmdatl        PMDATL
#define        pcon        PCON        // STKOVF STKUNF *** RWDT RMCLR RI POR BOR
  
définition variables
  PSECT udata_bank3
,space=1,class=BANK3
  
global    rst_h_0,rst_l_0,rst_h_pre,rst_l_pre,var_t_h,var_t_l
    rst_h_0
:        ds    1    1a0h contient STATUS actuel
    rst_l_0
:        ds    1    contient PCON actuel
    rst_h_pre
:        ds    1    contient STATUS précédent
    rst_l_pre
:        ds    1    contient PCON précédent
    var_t_h
:        ds    1    remplace STATUS pour test
    var_t_l
:        ds    1    remplace PCON pour test
    
  PSECT    udata_shr
,space=1,class=COMMON
  
global    cmpt_divers
    cmpt_divers
:    ds    1    // ici, le bit0 compte le nbre de passages dans la boucle - pmadrh pmadrl -

  
PSECT data,class=STRCODE,space=0,delta=2
    
  PSECT code
,abs,class=CODE,space=0,delta=2
  ORG    0h
rst_0
:
 goto    
test_0

/*******************
**** test reset ****
********************/
définition registres la flashHE concerne uniquement les bit 7-0 de chaque mot mémoire
les registres STATUS et PCON seront écrits aux adresses consécutives 3f80 et 3f81
STATUS bkx pcon bk1
le reste bk3

  ORG    0005h
;test_rst:

// -début- uniquement pour test ****************************************
// premier passage : pmadrx ne contient "rien" et
// STATUS-PCON = 00010000 - 000000
// deuxième pmadrx = valeurs ci-dessus et
// les valeurs de STATUS-PCON incrémentées de 1 à chaque cycle
test_0:
 
movlw        0001000B
 movwf        var_t_h
 movlw        0000000B
 movwf        var_t_l
test_1

// uniquement pour test -fin- ******************************************
lecture flash adresse 3f80 puis 3f81 avec boucle par PMADRL
 banksel    PMADRH
 movlw        3fh
 movwf        pmadrh
 movlw        79h            
 movwf        pmadrl        
écriture adresse premier mot de la flashHE terminée
 
lect_1
:
 
incf        pmadrl
 bcf        pmcon1
,    6
 bsf        pmcon1
,    0
 nop
 nop
 movf        pmdatl
,    w
 btfsc        pmadrl
,    0
 
goto        lect_2
 movwf        rst_h_pre
 
goto        lect_1
lect_2
:
 
movwf        rst_l_pre
lecture terminée
LSB 3f80 (STATUS précédentécrite dans rst_h_pre LSB 3f81 (PCON précédentdans rst_l_pre
écriture STATUS et PCON actuels dans rst_h_0 et rst_l_0

/* movf        STATUS,    w
 movwf        rst_h_0
 banksel    PCON
 movf        PCON,    w
 movwf        rst_l_0 */
remplacé par
début
 movf        var_t_h
,    w
 movwf        rst_h_0
 movf        var_t_l
,    w
 movwf        rst_l_0
fin

effacement mêmes adresses
 banksel    PMADRH
 movlw        079h            
 movwf        pmadrl
effac_1
:
 
incf        pmadrl
 bcf        pmcon1
,    6
 bsf        pmcon1
,    4
 bsf        pmcon1
,    2
unlock sequence début
 movlw        055h
 movwf        pmcon2
 movlw        0aah
 movwf        pmcon2
 nop
 nop
fin
 bcf        pmcon1
,    2
 nop
 btfsc        pmadrl
,    0
 
goto        effac_2
 
goto        effac_1
effac_2
:
;
effacement terminé
;******************************************************************************
tout ce qui suit est uniquement pour test
écriture début
 banksel    PMADRH
 movlw        079h            
 movwf        pmadrl
ecrit_1
:
 
incf        pmadrl
 bcf        pmcon1
,    6
 bsf        pmcon1
,    2
 bsf        pmcon1
,    5
unlock sequence début
 movlw        055h
 movwf        pmcon2
 movlw        0aah
 movwf        pmcon2
 nop
 nop
fin
 bcf        pmcon1
,    5
unlock sequence début
 movlw        055h
 movwf        pmcon2
 movlw        0aah
 movwf        pmcon2
 nop
 nop
fin
 bcf        pmcon1
,    2
écriture fin
incrémentation variable de test
 incf        var_t_h
 incf        var_t_l

 
goto        test_1

 
/*
   PSECT isrVec,class=CODE,delta=2
isr: */
END rst_0
J'y arriverai . . .

pic-as
satinas
Expert
Expert
Messages : 1489
Enregistré en : novembre 2015

#68 Message par satinas » dim. 25 janv. 2026 15:42

Tu as dû taper le code avant de modifier l'option, c'est pourquoi c'est pas encore pas bon. Cela devait rentrer dans l'ordre pour les prochains programmes. Je me demande pourquoi cette option fait peur, le texte prend un peu plus de place sur le disque, les disquettes 360k c'est fini.

Pour la 2092, c'est le gros problème de pic-as. Il ne veut pas tronquer les adresses des variables, contrairement à MPASM. Quoique cela à l'air de fonctionner quand même, c'est juste un warning.
Si tu veux enlever ce warning, il faut utiliser systématiquement la macro BANKMASK(var_t_h) qui ne garde que la partie basse de l'adresse de la variable, son index dans la bank.

movwf BANKMASK(var_t_h)

pic-as
LP_2
Amateur
Amateur
Messages : 141
Enregistré en : août 2022
Localisation : Haute-Loire

#69 Message par LP_2 » dim. 25 janv. 2026 16:08

movwf BANKMASK(var_t_h) -> encore un mécanisme à comprendre (je ne m'en suis jamais servi), pour l'instant ça reste comme ça.

Dans une prochaine version ce sera corrigé ? :lol:
La v6.20 est la dernière qui permet d'utiliser pickit3 sans patch. Et un patch c'est rajouter de l'incertitude . . .

Bonne soirée
J'y arriverai . . .

pic-as
gwion
Expert
Expert
Messages : 1122
Enregistré en : février 2022

#70 Message par gwion » dim. 25 janv. 2026 19:05

LP_2 a écrit :La v6.20 est la dernière qui permet d'utiliser pickit3 sans patch. Et un patch c'est rajouter de l'incertitude . . .


Voir l'excellent PicKitMinus qui lève cette limitation.

https://github.com/jaka-fi/PICkitminus


Retourner vers « Langage ASM »

Qui est en ligne

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