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 ---
Bout de code posé là !

Modérateur : Jérémy

ASM: Hello World sur PIC32MX
satinas
Expert
Expert
Messages : 1486
Enregistré en : novembre 2015

#1 Message par satinas » mar. 14 mai 2024 18:20

Salut,
Dans la foulée de F6FCO, je mets un exemple de clignotement led avec un pic32, j'avais fait ça en 1997. Assemblage et debug avec MPLAB, toujours à la hauteur. Il y aura au moins un programme pic32 sur le forum :-)
Cela donne une idée de l'assembleur MIP32, assez accessible tout de même, sur les MIPS il faut régler le Cache, le Prefetch et les Wait states. Je ne sais pas si cette architecture va perdurer chez Microchip.

32MX_Test_01.S

Code : Tout sélectionner

#----------------------------------------------------------------------
# asm 32MX fichier .S pour utiliser le préprocesseur C
#----------------------------------------------------------------------

#include <p32xxxx.h>
#include "config.inc"
#include "macros.inc"

#----------------------------------------------------------------------
# defines
#----------------------------------------------------------------------
  #define INT_MULTI_VECT    # avec interruptions multi-vecteurs

# #define WAIT_BCL          # tempo 1s par boucle
  #define WAIT_CP0          # tempo 1s par core timer

#----------------------------------------------------------------------
# code
#----------------------------------------------------------------------
.global main                # symbole global

.text
.set noreorder              # pas d'optimisation, pas d'ajout nop après sauts

#----------------------------------------------------------------------
main:       
#----------------------------------------------------------------------
            #ifdef IS_CACHE_AND_PREFETCH
            jal     cache_prefetch_on # activer cache et prefetch flash
            nop
            #endif
            #ifdef INT_MULTI_VECT
            jal     int_multi_vect_on # activer interruptions multi-vecteurs
            #endif
            nop

            #ifdef __32MX220F032B__
            s0_a    CFGCON            # accès port B (inhiber jtag)
            s0_a    ANSELB            # port B numérique
            #else
          # s0_a    DDPCON            # accès port A (inhiber jtag)
          # si_a    AD1PCFG,0xffff    # port B numérique
            #endif

            si_a    TRISBCLR,LED      # output led

#----------------------------------------------------------------------
#ifdef WAIT_CP0
#----------------------------------------------------------------------
.equ CP01S, (FCY/2)                   # 1 seconde
            mtc0    zero,CP0_COUNTER  # clr core timer
            si_cp0  CP0_COMPARE,CP01S # set core timer 1s
            si_a    IPC0CLR,0x1f      # set priority 3 core timer int
            si_a    IPC0SET,3<<2
            si_a    IFS0CLR,1         # clr core timer int flag
            si_a    IEC0SET,1         # enable core timer int

bcl1:       j       bcl1
            nop
#endif

#ifdef WAIT_BCL
bcl2:       li      a0,1000           # wait 1s
            jal     wait_a0_ms
            nop
            jal     led_toggle        # toggle led
            nop
            j       bcl2
            nop

#-----------------------------------------------------------------
# tempo de a0 ms
#-----------------------------------------------------------------
.equ MSEC, (10000000/TCY/2)           # si boucle de 2 instructions

wait_a0_ms: sub_2   t0,t1
            move    t1,zero
waita0_10:  beq     t1,a0,waita0_exit
            li      t0,MSEC           # raz timout 1 ms

waita0_20:  bnez    t0,waita0_20      # .
            addiu   t0,t0,-1          # . boucle de tempo 1 ms

            j       waita0_10
            addiu   t1,t1,1
waita0_exit:end_2   t0,t1
#endif

#-----------------------------------------------------------------
# toggle led
#-----------------------------------------------------------------
led_toggle: sub_1   s0
            si_a    LATBINV,LED
            end_1   s0

#ifdef INT_MULTI_VECT
#-----------------------------------------------------------------
int_multi_vect_on:
#-----------------------------------------------------------------
# activer interruptions avec plusieurs vecteurs
            mfc0    s0,CP0_CAUSE
            lui     a0,0x0080
            or      s0,s0,a0
            mfc0    s0,CP0_CAUSE
            jr      ra
            ei
#endif

#ifdef IS_CACHE_AND_PREFETCH
#-----------------------------------------------------------------
cache_prefetch_on:
#-----------------------------------------------------------------
# le reset se fait avec cache off, prefetch off, 7 flash wait states, 1 sram wait state
# en activant cache et prefetch, boucle wait_ms 10 fois plus rapide
            mfc0    s0,CP0_CONFIG     # set kseg0 cache on
            li      a0,0xfffffff8
            and     s0,s0,a0
            ori     s0,s0,3
             mtc0    s0,CP0_CONFIG
            si_a    CHECONSET,0x30    # set uncached/cached predictive prefetch on
            jr      ra
            nop
#endif

#----------------------------------------------------------------------
#ifdef WAIT_CP0
#----------------------------------------------------------------------
#ifdef INT_MULTI_VECT
.section .vector_0, code
#else
.section .bev_handler, code           # marche pas !
#endif
            j       core_timer_isr
            nop

.text
core_timer_isr:
            rdpgpr  sp,sp             # read GPR from Previous Shadow Set
            mfc0    k0,CP0_CAUSE      # read CAUSE register
            mfc0    k1,CP0_EPC        # read EPC register
            srl     k0,k0,10          # align RIPL to bit 0
            addiu   sp,sp,-16         # 4 words space on stack
            sw      k1,12(sp)         # save EPC on stack
            mfc0    k1,CP0_STATUS     # read STATUS register
            sw      k1,8(sp)          # save STATUS on stack
            ins     k1,k0,10,6        # place 6 bits CAUSE.RIPL to STATUS.IPL field
            ins     k1,zero,1,4       #
            mtc0    k1,CP0_STATUS     # write STATUS register (erl=0, exl=0, ie=1)
            sw      ra,4(sp)          # save Return Addr on stack
            sw      a0,0(sp)          # save A0 on stack

            si_a    LATBINV,LED
            si_a    IFS0CLR,1         # clr core timer int flag
            mfc0    s0,CP0_COMPARE
            li      a0,CP01S          # add core timer 1s
            addu    s0,s0,a0
            mtc0    s0,CP0_COMPARE
         
            lw      a0, 0(sp)         # restore A0 from stack
            lw      ra, 4(sp)         # restore Return Addr from stack
            di                        # disable interrupts
            lw      k0, 12(sp)        # restore EPC from stack
            mtc0    k0, $14
            lw      k0, 8(sp)         # restore STATUS from stack
            addiu   sp, sp, 16        # adjust stack
            mtc0    k0, $12
            ei                        # enable interrupts

            eret                      # return from interrupt
#endif

#----------------------------------------------------------------------
# data en flash
#----------------------------------------------------------------------
data1:        .word     1
data2:      .word      0b1111111111111110
data3:      .word      0xaaaabbbb

#-----------------------------------------------------------------

config.inc

Code : Tout sélectionner

#------------------------------------------------------------------------------
# constantes
#------------------------------------------------------------------------------

.equ  FCY,          80000000              # 80 MHz
.equ  TCY,          (1000000000/(FCY/10)) # durée de 10 cycles en ns

.equ  CP0_COUNTER,  $9                    # registres CP0
.equ  CP0_COMPARE,  $11
.equ  CP0_STATUS,   $12
.equ  CP0_CAUSE,    $13
.equ  CP0_EPC,      $14
.equ  CP0_CONFIG,   $16

#ifdef __32MX220F032B__
.equ LED, 0x80                            # led en B7
#endif

#ifdef __32MX795F512H__
#define IS_CACHE_AND_PREFETCH
.equ LED, 0x01                            # led en B0
#endif

#ifdef __32MX795F512L__
#define IS_CACHE_AND_PREFETCH
.equ LED, 0x01                            # led en B0
#endif

#------------------------------------------------------------------------------
# config hardware 32MX220F032B
#------------------------------------------------------------------------------
#ifdef __32MX220F032B__
.section .config_BFC00BFC,code
.word 0x7EFFFFF8                # CP off, BWP off, PWP off, ICESEL=1, JTAGEN off, DEBUG on
.section .config_BFC00BF8,code
.word 0xFF60CF59                # FWDTWINSZ=25%, FWDTEN off, WINDIS off, WDTPS=PS1, FCKSM off, FBDIV=DIV_1
                                # OSCIOFNC off, POSCMD off, IESO off, FSOSCEN off, FNOSC=FRCPLL
.section .config_BFC00BF4,code
.word 0xfff8f9d9                # FPLLODIV=DIV_1, UPLLEN off, UPLLIDIV=DIV_2, FPLLMUL=MUL_20, FPLLIDIV=DIV_2
.section .config_BFC00BF0,code
.word 0xdfffffff                # FVBUSONIO on, FUSBIDO on, IOL1WAY off, PMDL1WAY on, USERID=0xffff

#------------------------------------------------------------------------------
# config hardware 32MX795F512X
#------------------------------------------------------------------------------
#else
.section .config_BFC02FFC,code
#ifdef __32MX795F512H__
.word 0x7EFFFFF6                # CP off, BWP off, PWP off, ICESEL=1, DEBUG on
#else
.word 0x7EFFFFFE                # CP off, BWP off, PWP off, ICESEL=2, DEBUG on
#endif
.section .config_BFC02FF8,code
.word 0xFF60CF59                # FWDTWINSZ=25%, FWDTEN off, WINDIS off, WDTPS=PS1, FCKSM off, FBDIV=DIV_1
                                # OSCIOFNC off, POSCMD off, IESO off, FSOSCEN off, FNOSC=FRCPLL
.section .config_BFC02FF4,code
.word 0xfff8f9d9                # FPLLODIV=DIV_1, UPLLEN off, UPLLIDIV=DIV_2, FPLLMUL=MUL_20, FPLLIDIV=DIV_2
.section .config_BFC02FF0,code
.word 0xffffffff                # FVBUSONIO on, FUSBIDO on, FCANIO def, FETHIO def, FMIIEN on, FSRSSEL=7, USERID=0xffff
#endif

#------------------------------------------------------------------------------

macros.inc

Code : Tout sélectionner

#------------------------------------------------------------------------------
# macros pour bootloader pic à instructions 32 bits                  01/05/2019
#------------------------------------------------------------------------------
# lw_a    reg_dst,adr                 # reg32     <- (adr32)      (s0)
# s0_a    adr_dst                     # (adr32)   <- 0            (s0)
# sui_a   adr_dst,d16                 # (adr32)   <- d16<<16      (s0,a0)
# si_a    adr_dst,d32                 # (adr32)   <- d32 ou d16   (s0,a0)
# sui_cp0 cp0_reg,d16                 # cp0_reg32 <- d16<<16      (a0)
# si_cp0  cp0_reg,d32                 # cp0_reg32 <- d32 ou d16   (a0)
#------------------------------------------------------------------------------

.macro  lw_a    reg_dst,adr           # reg32 <- (adr32)
        la      s0,\adr               # modifie s0
        lw      \reg_dst,0(s0)
.endm

.macro  s0_a    adr_dst               # (adr32) <- 0
        la      s0,\adr_dst           # modifie s0
        sw      zero,0(s0)
.endm

.macro  sui_a   adr_dst,d16           # (adr32) <- d16<<16
        la      s0,\adr_dst           # modifie s0,a0
        lui     a0,\d16
        sw      a0,0(s0)
.endm

.macro  si_a    adr_dst,d32           # (adr32) <- d32 ou d16
        la      s0,\adr_dst           # modifie s0,a0
        li      a0,\d32
        sw      a0,0(s0)
.endm

.macro  sui_cp0 cp0_reg,d16           # cp0_reg <- d16<<16
        lui     a0,\d16               # modifie a0
        mtc0    a0,\cp0_reg
.endm

.macro  si_cp0  cp0_reg,d32           # cp0_reg <- d32 ou d16
        li      a0,\d32               # modifie a0
        mtc0    a0,\cp0_reg
.endm

#------------------------------------------------------------------------------
# macros début/fin de sous-programme avec sauvegarde/restitution registres
#------------------------------------------------------------------------------

.macro  sub_0                         # début sous-programme avec
        addiu   sp,sp,-4              # sauvegarde registre ra
        sw      \reg,4(sp)
        sw      ra,0(sp)
.endm

.macro  end_0                         # retour de sous-programme après
        lw      ra,0(sp)              # restitution registre ra
        jr      ra
        addiu   sp,sp,4
.endm

.macro  sub_1   reg                   # début sous-programme avec
        addiu   sp,sp,-4-4*1          # sauvegarde registres reg et ra
        sw      \reg,4(sp)
        sw      ra,0(sp)
.endm

.macro  end_1   reg                   # retour de sous-programme après
        lw      \reg,4(sp)            # restitution registres reg et ra
        lw      ra,0(sp)
        jr      ra
        addiu   sp,sp,4+4*1
.endm

.macro  sub_2   reg0,reg1             # début sous-programme avec
        addiu   sp,sp,-4-4*2          # sauvegarde de 2 registres et ra
        sw      \reg1,8(sp)
        sw      \reg0,4(sp)
        sw      ra,0(sp)
.endm

.macro  end_2   reg0,reg1
        lw      \reg1,8(sp)
        lw      \reg0,4(sp)
        lw      ra,0(sp)
        jr      ra
        addiu   sp,sp,4+4*2
.endm

#------------------------------------------------------------------------------
Modifié en dernier par satinas le mar. 14 mai 2024 18:42, modifié 1 fois.

ASM: Hello World sur PIC32MX
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#2 Message par F6FCO » mar. 14 mai 2024 18:30

Hello,
Il faudrait montrer çà à l'épouse de Gérard, il nous a dit qu'elle adorait voir clignoter une led de façon simple :lol:
Une porte nand prend 2 bits en entrée... :eek:

ASM: Hello World sur PIC32MX
satinas
Expert
Expert
Messages : 1486
Enregistré en : novembre 2015

#3 Message par satinas » mar. 14 mai 2024 18:36

Quand on vous dit que les pics 16bits, c'est simple :-)
Je regrette de ne pas avoir pu continuer, c'était bien parti, la led qui clignote, ça a toujours été le plus dur.
Le programme date de 2017 pas 1997 oops

ASM: Hello World sur PIC32MX
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#4 Message par F6FCO » mar. 14 mai 2024 19:07

Je dis que tu es quand même un peu en avance sur nous :geek:
Une porte nand prend 2 bits en entrée... :eek:

ASM: Hello World sur PIC32MX
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1937
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#5 Message par Gérard » mar. 14 mai 2024 21:17

F6FCO a écrit :Hello,
Il faudrait montrer çà à l'épouse de Gérard, il nous a dit qu'elle adorait voir clignoter une led de façon simple :lol:



Mais comment tu sais?
Tu connais ma moitié?

Je vois que toi aussi tu te moques : surtout n'arrête pas. :lol: :lol: :lol:
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.


Retourner vers « Recueil de mini programmes »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité