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
Pic16F84A probleme d'interruption
Gérard a écrit :J'ai trouvé une erreur qui peut être la cause du dysfonctionnement.
Dans le masque d'interruption, tu autorise RBIE (int portB) au lieu de INTE (int RB0)
Ton masque doit être %10010000 au lieu de %10001000
Tu as lu Bigonoff?
tu as raison monsieur Gérard, j'ai changé d'interruption pour tester l'interruption causée par le bouton poussoir relié à rb4, apres j'ai fait copier coller sans faire attention, apres la correction, ç'a marchéééé , c'est la gloire hhhh
Pic16F84A probleme d'interruption
Pic16F84A probleme d'interruption
monsieur #Mazertoc ce qui me gène, c'est de voir son programme très très logique mais quand même il ne fonctionne pas, ce qui me pousse à être vraiment anxieux de détecter l'erreur sans modification d'idée,
le problème était à l'activation de l'interruption, j'ai activé RBIE au lieu INTE , le seul problème que je rencontre maintenant, c'est que la led relié à RA4 ne s'allume pas, elle reste toujours éteinte, meme si je l'ai configuré comme les autres leds
le problème était à l'activation de l'interruption, j'ai activé RBIE au lieu INTE , le seul problème que je rencontre maintenant, c'est que la led relié à RA4 ne s'allume pas, elle reste toujours éteinte, meme si je l'ai configuré comme les autres leds
Pic16F84A probleme d'interruption
Jérémy a écrit :ç'a marchéééé , c'est la gloire hhhh
Génial !!!
Je suis content que grâce à FantasPic et ses membres tu ai pus réussir à trouvé ta solution.
Je te propose de poster le code qui fonctionne entre les balises fait pour ca STP .
Encore bravo !
Le voilà :
Code : Tout sélectionner
list p=16f84a, f=inhx8m, r=dec
include "p16f84a.inc"
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF
;*********************************************************************
; ASSIGNATIONS *
;*********************************************************************
optionval equ b'00000000' ; Valeur registre option
; Résistance pull-up ON
intconmask equ b'10010000' ;Interruptions sur rb0/int
;*********************************************************************
; DECLARATIONS DE VARIABLES *
;*********************************************************************
cblock 0x00c
wtemp :1
statustemp :1
n1 :1
n2 :1
n3 :1
flags :1
endc
;*********************************************************************
; MACRO *
;*********************************************************************
bank0 macro
bcf STATUS,RP0
endm
bank1 macro
bsf STATUS,RP0
endm
;**********************************************************************
; DEMARRAGE SUR RESET *
;**********************************************************************
org 0x00
goto init
;**********************************************************************
; ROUTINE INTERRUPTION *
;**********************************************************************
;sauvegarder registres
;------------------------
org 0x04
movwf wtemp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf statustemp
; ----------------------------------------
bank0
bsf flags,0
bcf INTCON,INTF
swapf statustemp,w ; swap status avec résultat dans w
movwf STATUS
swapf wtemp,f ; sauver registre W
swapf wtemp,w
retfie
;*********************************************************************
; INITIALISATIONS *
;*********************************************************************
init
bank1
movlw optionval ; charger masque
movwf OPTION_REG ; initialiser registre option
; Effacer RAM
; ------------
movlw 0x0c ; initialisation pointeur
movwf FSR ; pointeur d'adressage indirect
init1
clrf INDF ; effacer ram
incf FSR,f ; pointer sur suivant
btfss FSR,6 ; tester si fin zone atteinte (>=40)
goto init1 ; non, boucler
btfss FSR,4 ; tester si fin zone atteinte (>=50)
goto init1 ; non, boucler
bank0
movlw intconmask ; charger masque
movwf INTCON ;charger interrupt control
bank1
movlw 0x01 ; configurer rb0 comme une entrée
movwf TRISB
movlw 0x00 ; configurer rb0 comme une entrée
movwf TRISA
bank0 ; accés à la banque 0
movlw b'00000000'
movwf PORTA
clrf PORTB
goto start
clign
bank0
movlw 0xff
movwf PORTA
call tempo
clrf PORTA
call tempo
movlw 0xff
movwf PORTA
call tempo
clrf PORTA
call tempo
movlw 0xff
movwf PORTA
call tempo
clrf PORTA
call tempo
movlw 0xff
movwf PORTA
call tempo
bcf flags,0
return
;*********************************************************************
; Fonction de temporisation *
;*********************************************************************
tempo ; une temporisation de presque deux secondes
bank0
movlw 2
movwf n1
tempo1
movlw 0xff
movwf n2
tempo2
movlw 0xff
movwf n3
tempo3
decfsz n3
goto tempo3
decfsz n2
goto tempo2
decfsz n1
goto tempo1
return
;*********************************************************************
; PROGRAMME PRINCIPAL *
;*********************************************************************
start
bank0
btfsc flags,0
call clign
goto start
end
Pic16F84A probleme d'interruption
bon c'est bien, pour la RA4 c'est un drain ouvert, mettre une résistance avec +5V
Pour ton programme regarde ce que tu dois faire pour le rendre plus court et plus rapide par exemple pourquoi des appel a banque 0 si pas besoin ? il y a aussi un problème sur le restaure de W dans int .Pourquoi avoir mis ton P.P. a la fin tu fais un goto pour rien. Dans la tempo pourquoi recharger 2 fois W de la valeur X0FF une fois suffit
Dans int tu ne fais pas aussi un test sur la bonne int de déclenché.
allez encore un petit effort et c'est parfait
A=
Pour ton programme regarde ce que tu dois faire pour le rendre plus court et plus rapide par exemple pourquoi des appel a banque 0 si pas besoin ? il y a aussi un problème sur le restaure de W dans int .Pourquoi avoir mis ton P.P. a la fin tu fais un goto pour rien. Dans la tempo pourquoi recharger 2 fois W de la valeur X0FF une fois suffit
Dans int tu ne fais pas aussi un test sur la bonne int de déclenché.
allez encore un petit effort et c'est parfait
A=
Pic16F84A probleme d'interruption
maï a écrit :
Pourquoi avoir mis ton P.P. a la fin tu fais un goto pour rien.
Dans int tu ne fais pas aussi un test sur la bonne int de déclenché.
A=
Mai, j'ai bien suivi ce que tu a dit mais j'ai pas arrivé à saisir les deux remarque cité au dessus
j'ai mis mon P.P a la fin pour que mon programme ne traite pas à chaque fois le init
de quel test tu parles, j'ai activé une seule interruption au debut, donc il n y aura pas d'autre type d'interruptions , alors pour quoi je ferai un test ?
Pic16F84A probleme d'interruption
Pour le P.P. je ne suis mal exprime je voulez dire la boucle du P.P. tu gagnes un goto, un clrf TRISA ,c'est plus rapide que:
Un exemple
Avec une bonne gestion des banques (1 appel banque1 puis 1 banque 0)
Pour le test du flag de l'int .Tu peux aussi avoir d'autres int en service, c'est une bonne habitude de faire ce test, pour être certain du bon flag a traiter .Je te l'accord ici c'est pas la peine
Bon je chipote, quoi que on est en ASM . Une instruction de gagner c'est un cycle machine voir 2 en moins et 2 octets de gagnés en mem programme
A+
Code : Tout sélectionner
movlw 0x00 ; configurer rb0 comme une entrée
movwf TRISA
Un exemple
Code : Tout sélectionner
;********************** Programme Principale ************************
debut ;
bank1
;*********************** Initialisation des ports *******************
MOVLW MASQUEPORTB
MOVWF TRISB ; RB7:RB1 en sortie RB0 en entrée
CLRF TRISA ; RA4:RA0 en sortie
;*********************** Initialisation des int *******************
movlw optionval ; charger masque
movwf OPTION_REG ; initialiser registre option
movlw intconmask ; charger masque
movwf INTCON ;charger interrupt control
bank0 ; accés à la banque 0
;******************************************************************
bou BTFSC flag_RB0 ; on test si il y a eu un appui sur RB0
CALL AFFILED ; oui on appel le SPG AFFILED
GOTO bou ; non on retourne a la boucle
;************************ Sous programme ****************************
AFFILED BCF flag_RB0 ; raz flag int RBO
Avec une bonne gestion des banques (1 appel banque1 puis 1 banque 0)
Pour le test du flag de l'int .Tu peux aussi avoir d'autres int en service, c'est une bonne habitude de faire ce test, pour être certain du bon flag a traiter .Je te l'accord ici c'est pas la peine
Bon je chipote, quoi que on est en ASM . Une instruction de gagner c'est un cycle machine voir 2 en moins et 2 octets de gagnés en mem programme
A+
Pic16F84A probleme d'interruption
- Gérard
Expert- Messages : 1654
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
atmaxi a écrit :maï a écrit :
Pourquoi avoir mis ton P.P. a la fin tu fais un goto pour rien.
Dans int tu ne fais pas aussi un test sur la bonne int de déclenché.
A=
Mai, j'ai bien suivi ce que tu a dit mais j'ai pas arrivé à saisir les deux remarque cité au dessus
j'ai mis mon P.P a la fin pour que mon programme ne traite pas à chaque fois le init
de quel test tu parles, j'ai activé une seule interruption au debut, donc il n y aura pas d'autre type d'interruptions , alors pour quoi je ferai un test ?
Si tu ne travailles qu'avec une interruption, tu n'as pas besoin de faire de test, si tu es dans la routine d'interruption, c'est obligatoirement la seule validée qui est survenue.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 46 invités