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

RETFIE RUTURN
bly51
Membre
Membre
Messages : 17
Enregistré en : janvier 2021

#1 Message par bly51 » ven. 19 mars 2021 10:35

Bonjour
j'ai ecrit le programme suivant (compteur d'impulsion)

Code : Tout sélectionner

#include <p16F84.inc>          ; remove this if not necessary
   __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
#define PRECISION 3             ; byte size for registers


BANC0  MACRO
               BCF STATUS,RP0
           ENDM
           
BANC1  MACRO
                BSF STATUS,RP0
           ENDM

   
M_STOR_STATUS macro WHERE
    movf    STATUS,w
    movwf   WHERE
    endm

M_RETR_STATUS macro WHERE
    movf    WHERE,w
    movwf   STATUS
    endm

   
   
    cblock 0x0C
    REG_X:3
    REG_Y:3
    REG_Z:3
    REG_COUNTER
    REG_STATUS
    REG_T1
    REG_T2
    REG_ROT_COUNTER
   
    A0
    A1
    A2
     
    B0
    B1
    B2
    B3
    B4
    B5
    B6
    B7
    T3
    T4
    T5
    T6
    T7
    signe
    W_TEMP
   STATUS_TEMP
    endc
    x0 equ 0x0C
    x1 equ 0x0D
    x2 equ 0x0E
   
    y0 equ 0x0F
    y1 equ 0x10
    y2 equ 0x11
   
    z0 equ 0x12
    z1 equ 0x13
    z2 equ 0x14
   
    RS  equ 3


   









   
GOTO STAR
 
 ORG   04H
    MOVWF W_TEMP
    MOVF  STATUS,W
    MOVWF  STATUS_TEMP
    INCF  A0
    BTFSS STATUS,Z
    INCF  A1
   
 

    MOVF STATUS_TEMP,W
    MOVWF STATUS
    SWAPF W_TEMP
    SWAPF W_TEMP

RETFIE

   
   

M_CLR                           ; clear a register
    movwf   FSR
    movlw   PRECISION
    movwf   REG_COUNTER
M_CLR_loop
    clrf    INDF
    incf    FSR,f
    decf    REG_COUNTER,f
    btfss   STATUS,Z
    goto    M_CLR_loop
    return

M_ROL                           ; rotate a register to the left
    movwf   FSR
    M_STOR_STATUS REG_STATUS
    clrf    REG_COUNTER
M_ROL_loop
    M_RETR_STATUS REG_STATUS
    rlf     INDF,f
    M_STOR_STATUS REG_STATUS
    incf    FSR,f
    incf    REG_COUNTER,f
    movlw   PRECISION
    subwf   REG_COUNTER,w
    btfss   STATUS,Z
    goto    M_ROL_loop
    return


M_ROR                          ; rotates a register to the right
    movwf   FSR
    movlw   PRECISION-1
    addwf   FSR,f
    M_STOR_STATUS REG_STATUS
    clrf    REG_COUNTER
M_ROR_loop
    M_RETR_STATUS REG_STATUS
    rrf     INDF,f
    M_STOR_STATUS REG_STATUS
    decf    FSR,f
    incf    REG_COUNTER,f
    movlw   PRECISION
    subwf   REG_COUNTER,w
    btfss   STATUS,Z
    goto    M_ROR_loop
    return


M_ADD                           ; Z + X -> Z
    bcf     STATUS,C
    clrf    REG_STATUS
    clrf    REG_COUNTER
M_ADD_loop
    clrf    REG_T1
    btfsc   REG_STATUS,C
    incf    REG_T1,f
    clrf    REG_STATUS
    movlw   REG_X
    addwf   REG_COUNTER,w
    movwf   FSR
    movf    INDF,w
    addwf   REG_T1,f
    btfsc   STATUS,C
    bsf     REG_STATUS,C
    movlw   REG_Z
    addwf   REG_COUNTER,w
    movwf   FSR
    movf    INDF,w
    addwf   REG_T1,f
    btfsc   STATUS,C
    bsf     REG_STATUS,C
    movf    REG_T1,w
    movwf   INDF
    incf    REG_COUNTER,f
    movlw   PRECISION
    subwf   REG_COUNTER,w
    btfss   STATUS,Z
    goto    M_ADD_loop
    return


M_MUL                           ; X * Y -> Z
    movlw   REG_Z
    call    M_CLR
    movlw   PRECISION*8+1
    movwf   REG_ROT_COUNTER
M_MUL_loop
    decf    REG_ROT_COUNTER,f
    btfsc   STATUS,Z
    return
    btfsc   REG_Y,0
    call    M_ADD
    bcf     STATUS,C
    movlw   REG_Y
    call    M_ROR
    bcf     STATUS,C
    movlw   REG_X
    call    M_ROL
    goto    M_MUL_loop
    return
M_CMP                           ; Z <=> X -> STATUS(C,Z)
                                ; STATUS,C set if Z => X;
                                ; STATUS,Z set if Z == X
    clrf    REG_COUNTER
M_CMP_loop
    movf    REG_COUNTER,w
    sublw   REG_Z+PRECISION-1 ; chargé  l'adresse  de  dernier  byte  de  Z  dans  fsr,puis chargé  l'avant dernier byte de Z dans fsr  en deuxiemme  boucle .......ext
    movwf   FSR
    movf    INDF,w
    movwf   REG_T1   ;    z4>>T1  transfré  le  contenu  de dernier  byte  de  Z  dans  un  registre temporaire T1 tous  ça  pour  utulisé  fsr  pour  d'autre  aplication (x>fsr)
    movf    REG_COUNTER,w
    sublw   REG_X+PRECISION-1 ; chargé  l'adresse  de  dernier  byte  de  X  dans  fsr,puis chargé  l'avant dernier byte de z dans fsr  en deuxiemme  boucle .......ext
    movwf   FSR
    movwf   FSR;
    movf    INDF,w          ;z4-x4, puis  z3-x3 dans  la  deuxieme  boucle ; puis......
    subwf   REG_T1,f
    btfss   STATUS,Z
    return                  ;  si  z4<x4   returne  en  programme  principale pour
    incf    REG_COUNTER,f   ; Z = X
    movlw   PRECISION
    subwf   REG_COUNTER,w
    btfss   STATUS,Z
    goto    M_CMP_loop
    return

M_SUB                           ; Z - X -> Z
    clrf    REG_COUNTER
    bsf     REG_STATUS,C
M_SUB_loop
    bsf     REG_T2,C
    movlw   REG_Z
    addwf   REG_COUNTER,w
    movwf   FSR
    movf    INDF,w
    movwf   REG_T1
    movlw   REG_X
    addwf   REG_COUNTER,w
    movwf   FSR
    movf    INDF,w
    subwf   REG_T1,f
    btfss   STATUS,C
    bcf     REG_T2,C
    btfsc   REG_STATUS,C
    goto    M_SUB_no_carry
    movlw   0x01
    subwf   REG_T1,f
    btfss   STATUS,C
    bcf     REG_T2,C
M_SUB_no_carry
    movlw   REG_Z
    addwf   REG_COUNTER,w
    movwf   FSR
    movf    REG_T1,w
    movwf   INDF
    bsf     REG_STATUS,C
    btfss   REG_T2,C
    bcf     REG_STATUS,C
    incf    REG_COUNTER,f
    movlw   PRECISION
    subwf   REG_COUNTER,w
    btfss   STATUS,Z
    goto    M_SUB_loop
    btfss   REG_STATUS,C
    bcf     STATUS,C
    return


M_DIV                           ; Z / X -> Y;  remainder -> Z
    movlw   REG_Y
    call    M_CLR
    movlw   PRECISION*8
    movwf   REG_ROT_COUNTER
M_DIV_rot_loop
    btfsc   REG_X+PRECISION-1,7
    goto    M_DIV_loop
    movlw   REG_X
    bcf     STATUS,C
    call    M_ROL
    decf    REG_ROT_COUNTER,f
    btfss   STATUS,Z
    goto    M_DIV_rot_loop
    bsf     STATUS,Z
    return
M_DIV_loop
    call    M_CMP
    M_STOR_STATUS REG_T2
    movlw   REG_Y
    call    M_ROL
    M_RETR_STATUS REG_T2
    btfsc   STATUS,C
    call    M_SUB
    bcf     STATUS,Z
    bcf     STATUS,C
    movlw   REG_X
    call    M_ROR
    incf    REG_ROT_COUNTER,f
    movlw   PRECISION*8+1
    subwf   REG_ROT_COUNTER,w
    btfss   STATUS,Z
    goto    M_DIV_loop
    return

   




   




ms100
    MOVLW 0X81
    MOVWF x1
LOOPX1
    NOP
    NOP
    NOP
    MOVLW 0xFF
    MOVF x0
LOOPX0
    DECFSZ x0
    GOTO LOOPX0
    DECFSZ  x1
    GOTO LOOPX1
    NOP
    NOP
    NOP
     RETURN
US100   
     MOVLW 0X70
     MOVWF x0
LOOP1
     DECFSZ  x0
     GOTO LOOP1
     RETURN

ms1
   MOVLW 0X5
   MOVWF x1
LOOP2
   CALL US100
   DECFSZ x1
   GOTO LOOP2
   RETURN


hex_to_dec
   
   MOVLW 0XFF
   MOVWF z0
   MOVWF z1
   MOVWF z2
 
   CLRF  B0
   CLRF  B1
   CLRF  B2

 
   MOVLW B7
   MOVWF T3
 
LOOP 
   MOVLW  0X0A
   MOVWF  x0
   CLRF   x1
   CLRF   x2
   
   CALL   M_DIV                           ; Z / X -> Y;  remainder -> Z*
   MOVF T3,w
   MOVWF FSR
   MOVF  z0,w
   MOVWF INDF  ;  sauvgarde z dans  B
   
   MOVF y0,w
   MOVWF z0
   MOVF y1,w
   MOVWF z1
   MOVF y2,w
   MOVWF z2
   
   DECF  T3
   MOVLW  A2
   SUBWF T3,w
   BTFSS STATUS,Z
   GOTO  LOOP
   
RETURN


   
LCD_init
     CALL ms100
     BCF  PORTA,RS
     MOVLW b'00000010'
     MOVWF PORTB
     CALL  VALIDATION
     CALL ms100

     MOVLW  b'00001111';001dsxxx     d=8bit  s=deux ligne
     CALL WRITECHAR
     CALL ms100
 
     MOVLW  b'00000001'
     CALL WRITECHAR
     CALL ms100

     
  RETURN

WRITECHAR
  MOVWF A0
  SWAPF A0,w
  MOVWF PORTB
  CALL VALIDATION
  MOVF  A0,w
  MOVWF PORTB
  CALL VALIDATION
 
  return


 LCD_WRITE
   BCF  PORTA,RS
   MOVLW  b'00000001'
   CALL WRITECHAR
   CALL ms4

   MOVLW  b'00000010'
   CALL WRITECHAR
   CALL ms4

   BSF  PORTA,RS
   MOVF B7,W
   IORLW 0x30
   CALL  WRITECHAR

   BSF  PORTA,RS
   MOVF B6,W
   IORLW 0x30
   CALL  WRITECHAR
   
   BSF  PORTA,RS
   MOVF B5,W
   IORLW 0x30
   CALL  WRITECHAR

  BSF  PORTA,RS
   MOVF B4,W
   IORLW 0x30
   CALL  WRITECHAR

   BSF  PORTA,RS
   MOVF B3,W
   IORLW 0x30
   CALL  WRITECHAR

   BSF  PORTA,RS
   MOVF B2,W
   IORLW 0x30
   CALL  WRITECHAR
   
   BSF  PORTA,RS
   MOVF B1,W
   IORLW 0x30
   CALL  WRITECHAR

   BSF  PORTA,RS
   MOVF B0,W
   IORLW 0x30
   CALL  WRITECHAR

   
  RETURN   

ms4
    CALL ms1
    CALL ms1
    CALL ms1
    CALL ms1
    return
VALIDATION
    CALL US100
    BSF PORTA,2
    CALL  US100
    BCF PORTA,2
    CALL US100
    RETURN
   


   
STAR
   
    BANC1
    MOVLW b'01110000'; pas de  resitance vers +5v/sens  declenchement en cas d'interuption/tocs=1 l'incrementation de timer a partire de Ra4/0000 division sur 255
    MOVWF OPTION_REG

    MOVLW b'11110000'
    MOVWF TRISB
    MOVLW b'11110011' 
    MOVWF TRISA
   
    BANC0
    MOVLW b'10001000' ; b7=1 autorisé  les interuption /b5=1 interuption timer compteur
    MOVWF  INTCON ;
    CLRF  TMR0

LP
CALL hex_to_dec

CALL ms100
CALL ms100
CALL ms100
CALL ms100
CALL ms100
CALL ms100

CALL ms100
CALL ms100
CALL ms100
CALL ms100
CALL ms100
CALL ms100
NOP
NOP
NOP
NOP
NOP
NOP



GOTO LP

   
   END

le problemme c'est que lorsque je fais une simulation avec mplab mplab8 lors interruption le simulateur refuse de sortir de a routine d'interruption
mais quand je remplace RETFIE par RETURN tous devient normal et le simulateur revient a le programme principal
est ce que c'est normal ?

RETFIE RUTURN
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » ven. 19 mars 2021 17:55

Bonsoir bly51, et tout le forum,

bly51 a écrit :Source du message est ce que c'est normal ?

Non, c'est pas normal

Ton programme, J'ai bien l’impression que c'est pour une CNC, c'est pour quoi faire ton programme ?

Voici un exemple pour le départ de ton programme

Code : Tout sélectionner



    Errorlevel
-302                        ; Supprime le message "Ensure that bank bits are correct" 

    radix dec                             
; par defaut en mode décimal
   
    list p
=16F84                          ; Définition de processeur    

    
#include <p16F84.inc>                 ; Définitions des constantes

;**********************************************************************************************

   __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;*************************************** assignations ***************************************** 

     
#define PRECISION 3                  ; byte size for registers

;****************************** déclaration des variables *************************************
   
     CBLOCK 0x0C
      
      REG_X               
:3
      REG_Y               
:3
      REG_Z               
:3

      REG_COUNTER         
:1
      REG_STATUS          
:1
      REG_T1              
:
      REG_T2              
:
      REG_ROT_COUNTER     
:1
   
      A0                  
:1
      A1                  
:1
      A2                  
:1
     
      B0                  
:
      B1                  
:
      B2                  
:1
      B3                  
:
      B4                  
:
      B5                  
:1
      B6                  
:1
      B7                  
:1

      T3                  
:1
      T4                  
:1
      T5                  
:1
      T6                  
:1
      T7                  
:

      signe               
:1
      W_TEMP              
:1
      STATUS_TEMP         
:1

     ENDC

;********************************** "déclaration des macros" ***********************************

;***********************************************************************************************
 
M_STOR_STATUS MACRO WHERE
    movf    STATUS
,w
    movwf   WHERE

    ENDM

;*********************************************************************************************** 
M_RETR_STATUS MACRO WHERE
    movf    WHERE
,w
    movwf   STATUS

    ENDM

;**************************** adresse de départ après reset ************************************   

       org H
'00'
      goto star

;********************************** lieu des interruptions **************************************    
     org  H
'04' 
   
      movwf w_temp              
      swapf STATUS
,W            
      movwf status_temp    

      BANKSEL INTCON                      
; on passe en bank 0 pour traiter l’interruption 
                                          
; pas besoin de macro, utilise BANKSEL "non du registre"
      incf A0,F

      btfss STATUS
,Z
      incf A1
,F

;***********************************************************************************************

      BANKSEL INTCON                      ; on passe en bank 0      

                                          
; effacer flag interruption  ?

      swapf status_temp,W        
      movwf STATUS                
      swapf w_temp
,F            
      swapf w_temp
,W                  

      retfie   

;***********************************************************************************************

Flag d'interruption qui ne son pas effacé, donc plantage du programme, oops il y a vraiment beaucoup à corriger

ça c'est pas bon, car tu prends les mêmes adresse que ta déclaration en ram

Code : Tout sélectionner



    x0 equ 0x0C
    x1 equ 0x0D
    x2 equ 0x0E
   
    y0 equ 0x0F
    y1 equ 0x10
    y2 equ 0x11
   
    z0 equ 0x12
    z1 equ 0x13
    z2 equ 0x14
   
    RS  equ 3


Ton programme n'est pas bien structurer, c'est pire que Gé..... dehors!!

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

RETFIE RUTURN
bly51
Membre
Membre
Messages : 17
Enregistré en : janvier 2021

#3 Message par bly51 » ven. 19 mars 2021 19:52

merci temp x
pour mieux expliqué le problème j'ai gardé que le essentiel de programme et il devient :

Code : Tout sélectionner

#include <p16F84.inc>         
   __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
#define PRECISION 3           


BANC0  MACRO
               BCF STATUS,RP0
           ENDM
           
BANC1  MACRO
                BSF STATUS,RP0
           ENDM

    cblock 0x0C

    W_TEMP
   STATUS_TEMP
    endc
 
GOTO STAR
 
ORG   04H
    MOVWF W_TEMP
    MOVF  STATUS,W
    MOVWF  STATUS_TEMP
   
    MOVF STATUS_TEMP,W  ;
    MOVWF STATUS
    SWAPF W_TEMP
    SWAPF W_TEMP
bcf INTCON, RBIF
RETFIE

STAR
   
    BANC1
    MOVLW b'01110000';
    MOVWF OPTION_REG

    MOVLW b'11110000'
    MOVWF TRISB
    MOVLW b'11110011' 
    MOVWF TRISA
   
    BANC0
    MOVLW b'10001000' ; b7=1 autorisé  les interuption /b3=1 interuption rb4 rb5 rb6 rb7
    MOVWF  INTCON ;
LP

NOP
NOP
NOP
NOP
NOP
NOP

GOTO LP

   END


et j'ai fais un capteur d'ecran
https://www.youtube.com/watch?v=zijmRjxIwBI

RETFIE RUTURN
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#4 Message par Gérard » ven. 19 mars 2021 20:10

Temps-x a écrit :
...

Ton programme n'est pas bien structurer, c'est pire que Gé..... dehors!!

==> A+


Oh le vilain... :lol:
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

RETFIE RUTURN
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#5 Message par Temps-x » sam. 20 mars 2021 10:33

Bonsoir bly51, et tout le forum,

Essai avec ça, ça doit fonctionne, sinon il y a quelque chose de mal configurer dans MPLAB 8.92

Code : Tout sélectionner


  
    Errorlevel
-302                        ; Supprime le message "Ensure that bank bits are correct" 

    radix dec                             
; par defaut en mode décimal
   
    list p
=16F84                          ; Définition de processeur    

    
#include <p16F84.inc>                 ; Définitions des constantes

;*********************************** configuration *********************************************

   __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;************************************ assignations ********************************************* 

     
#define PRECISION D'3'               ; byte size for registers

;****************************** déclaration des variables **************************************  

    CBLOCK 0x0C
      w_temp              
:1
      status_temp         
:1
    ENDC      

;**************************** adresse de depart après reset ************************************   

    org H
'00'
        goto star

;***********************************************************************************************    
    org  H
'04' 
      
      movwf w_temp              
      swapf    STATUS
,W            
      movwf    status_temp    

      btfss INTCON
,RBIF                   ; regarder si c'est bien l'interruption demandé       
      goto restor                         
; non 
                                          
; oui
;     traitement du programme          
; 
;

;***********************************************************************************************
      bcf INTCON,RBIF                    ; effacer flag interupttion causé par changement d'état  
                                         ; sur une des entrées RB4, RB5, RB6,RB7
restor                                     
      swapf status_temp,W        
      movwf STATUS                
      swapf w_temp,F            
      swapf w_temp,W                  

      retfie   

;*********************************************************************************************** 
star  
      BANKSEL OPTION_REG                  ; passer en bank 1 
    
      movlw B'
00000000'                   ; 
      movwf OPTION_REG

      movlw B'
11110000'                   ; entrée : RB7, RB6, RB5, RB4
      movwf TRISB                         ; sortie : RB3, RB2, RB1, RB0

      movlw B'
11110011'                   ; entrée : RA7, RA6, RA5, RA4, RA1, RA0
      movwf TRISA                         ; sortie : RA2, RA3
   
      BANKSEL PORTA                       ; passer en bank 0

      movlw B'
10001000'                   ; Bit 7: GIE autorise ou non les interruptions, quelles qu'elles soient
      movwf  INTCON                       
; Bit 3: RBIE aurorise ou non les interruptions par changement 
                                          
; d'état sur le port RB entrées RB4, RB5, RB6,RB7

;***********************************************************************************************
lp
      nop
      nop
      nop
      nop
      nop
      goto lp

      End



==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

RETFIE RUTURN
bly51
Membre
Membre
Messages : 17
Enregistré en : janvier 2021

#6 Message par bly51 » sam. 20 mars 2021 11:58

Bonjour temp x ,et tout le monde
malheureusement toujours le même problème
pour la configuration c'est une configuration par défaut j'ai rien changé
j'essai peut être d'autre version de mplab
encore merci temp x

RETFIE RUTURN
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#7 Message par Temps-x » sam. 20 mars 2021 12:08

Re

Dans Mplab 8.92 tu prends quoi comme microcontrôleur dans Select Device

Select Device.jpg


==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

RETFIE RUTURN
bly51
Membre
Membre
Messages : 17
Enregistré en : janvier 2021

#8 Message par bly51 » sam. 20 mars 2021 13:17

Temps-x a écrit :Re

Dans Mplab 8.92 tu prends quoi comme microcontrôleur dans Select Device

Select Device.jpg

==> A+

je met 16f84A
et je utilise mplab 8.00

RETFIE RUTURN
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#9 Message par Temps-x » sam. 20 mars 2021 13:24

Prends plutôt la version Mplab 8;92 téléchargeable ICI

As tu essayé de faire un test en réelle ?

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

RETFIE RUTURN
bly51
Membre
Membre
Messages : 17
Enregistré en : janvier 2021

#10 Message par bly51 » sam. 20 mars 2021 14:31

Temps-x a écrit :Prends plutôt la version Mplab 8;92 téléchargeable ICI

As tu essayé de faire un test en réelle ?

==> A+

même avec mplab 8.92 le problème est le meme :!:
j'ai pas fais un test réelle par ce que je utilise un programateur jdm et il faut que je réinstalle un autre pc qu a RS232


Retourner vers « Langage ASM »

Qui est en ligne

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