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
RETFIE RUTURN
Bonjour
j'ai ecrit le programme suivant (compteur d'impulsion)
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 ?
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
Bonsoir bly51, et tout le forum,
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
Flag d'interruption qui ne son pas effacé, donc plantage du programme, il y a vraiment beaucoup à corriger
ça c'est pas bon, car tu prends les mêmes adresse que ta déclaration en ram
Ton programme n'est pas bien structurer, c'est pire que Gé.....
A+
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 :1
REG_T2 :1
REG_ROT_COUNTER :1
A0 :1
A1 :1
A2 :1
B0 :1
B1 :1
B2 :1
B3 :1
B4 :1
B5 :1
B6 :1
B7 :1
T3 :1
T4 :1
T5 :1
T6 :1
T7 :1
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, 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é.....
A+
RETFIE RUTURN
merci temp x
pour mieux expliqué le problème j'ai gardé que le essentiel de programme et il devient :
et j'ai fais un capteur d'ecran
https://www.youtube.com/watch?v=zijmRjxIwBI
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
RETFIE RUTURN
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
A+
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+
RETFIE RUTURN
RETFIE RUTURN
RETFIE RUTURN
RETFIE RUTURN
RETFIE RUTURN
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 46 invités