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

Pic16F84A probleme d'interruption
atmaxi
Membre
Membre
Messages : 17
Enregistré en : octobre 2015

#51 Message par atmaxi » dim. 18 oct. 2015 13:31

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éééé :D , c'est la gloire hhhh

Pic16F84A probleme d'interruption
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#52 Message par Jérémy » dim. 18 oct. 2015 13:42

ç'a marchéééé :D , c'est la gloire hhhh


Génial !!! +1

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 !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Pic16F84A probleme d'interruption
atmaxi
Membre
Membre
Messages : 17
Enregistré en : octobre 2015

#53 Message par atmaxi » dim. 18 oct. 2015 13:47

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

Pic16F84A probleme d'interruption
atmaxi
Membre
Membre
Messages : 17
Enregistré en : octobre 2015

#54 Message par atmaxi » dim. 18 oct. 2015 13:50

Jérémy a écrit :
ç'a marchéééé :D , c'est la gloire hhhh


Génial !!! +1

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=16f84af=inhx8mr=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
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#55 Message par Guest » dim. 18 oct. 2015 14:00

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=

Pic16F84A probleme d'interruption
atmaxi
Membre
Membre
Messages : 17
Enregistré en : octobre 2015

#56 Message par atmaxi » dim. 18 oct. 2015 15:39

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
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#57 Message par Guest » dim. 18 oct. 2015 17:22

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:

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
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#58 Message par Gérard » dim. 18 oct. 2015 19:44

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.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.


Retourner vers « Langage ASM »

Qui est en ligne

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