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
atmaxi a écrit :j'ai essayé plusieurs façon de programmer mais sans aucun résultat, pour le cours je vais le lire , et si j'arrive à résoudre mon problème je vais le poster ici pour que d'autres personne se bénéficient
Pour en revenir au sujet, et si tu n'as jamais réalisé un programme qui fonctionne, commance par le début.
Tu veux faire clignoter une led par appui sur BP et gestion du BP par interruption.
Si tu commences par la gestion de l'interruption :
On peut créer un bout de code qui, dans la routine d'interruption, va positionner une variable.
Dans le programme principal, tu vas tester cette variable pour savoir si le BP a été pressé ou pas.
La règle générale veut qu'on passe le moins de temps possible dans la routine d'interruption,
on n'y place donc pas des programmes fonctionnels (clignotement de led, traitements divers, etc).
Sur ton schéma, j'inverserais R1 et BP.
Pic16F84A probleme d'interruption
mazertoc a écrit :atmaxi a écrit :j'ai essayé plusieurs façon de programmer mais sans aucun résultat, pour le cours je vais le lire , et si j'arrive à résoudre mon problème je vais le poster ici pour que d'autres personne se bénéficient
Pour en revenir au sujet, et si tu n'as jamais réalisé un programme qui fonctionne, commance par le début.
Tu veux faire clignoter une led par appui sur BP et gestion du BP par interruption.
Si tu commences par la gestion de l'interruption :
On peut créer un bout de code qui, dans la routine d'interruption, va positionner une variable.
Dans le programme principal, tu vas tester cette variable pour savoir si le BP a été pressé ou pas.
La règle générale veut qu'on passe le moins de temps possible dans la routine d'interruption,
on n'y place donc pas des programmes fonctionnels (clignotement de led, traitements divers, etc).
Sur ton schéma, j'inverserais R1 et BP.
bien reçu chef
Pic16F84A probleme d'interruption
- Gérard
Expert- Messages : 1661
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
Ci-dessus, ce que je t'ai répondu sur Futura.
Je décris ce que tu devrais essayer. L'interruption ne fait que mettre un bit à 1. Après ça, tu sors de l'interruption.
Le programme principal va lire ce bit, si = 1, alors clignotement, si = 0 aller à début
debut:
lire bit placé dans IRQ
si = 1, alors clignotement
sinon goto debut
Dans la routine d'interruption, ne pas oublier de baisser le flag qui a généré l'interruption.
Je décris ce que tu devrais essayer. L'interruption ne fait que mettre un bit à 1. Après ça, tu sors de l'interruption.
Le programme principal va lire ce bit, si = 1, alors clignotement, si = 0 aller à début
debut:
lire bit placé dans IRQ
si = 1, alors clignotement
sinon goto debut
Dans la routine d'interruption, ne pas oublier de baisser le flag qui a généré l'interruption.
Pic16F84A probleme d'interruption
Gérard a écrit :Ci-dessus, ce que je t'ai répondu sur Futura.
Je décris ce que tu devrais essayer. L'interruption ne fait que mettre un bit à 1. Après ça, tu sors de l'interruption.
Le programme principal va lire ce bit, si = 1, alors clignotement, si = 0 aller à début
debut:
lire bit placé dans IRQ
si = 1, alors clignotement
sinon goto debut
Dans la routine d'interruption, ne pas oublier de baisser le flag qui a généré l'interruption.
ouii monsieur Gérard j'ai apprécié ta réponse
s'il te plait explique moi cela
c'est très claire , mais si mon programme principal contient plusieurs instructions alors que le teste est au début de programme et l'interruption se fasse apres le teste , on peut aussi trouver dans le programme des temporisations , alors dans ce cas on va attendre que le programme termine toutes les instructions qui lui reste pour qu'il reprenne dès le début et puis rencontrer de nouveau le test !! le clignotement ne se fera pas immédiatement
Pic16F84A probleme d'interruption
- Gérard
Expert- Messages : 1661
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
Le programme principal ne fait que lire le bit placé dans l'interruption. Il ne fait rien d'autre (pour l'instant). Pas de clignotement. Dès que tu appuies sur BP, tu entres en interruption, tu places le bit, tu ressorts de l'interruption. Ton prog principal va lire le bit et faire clignoter tes LED.
Qu'est ce que tu ne comprends pas?
Le principe de l'interruption est aussi d'interrompre le prog principal quel que soit l'endroit où il se trouve.
Qu'est ce que tu ne comprends pas?
Le principe de l'interruption est aussi d'interrompre le prog principal quel que soit l'endroit où il se trouve.
Pic16F84A probleme d'interruption
Gérard a écrit :Le programme principal ne fait que lire le bit placé dans l'interruption. Il ne fait rien d'autre (pour l'instant). Pas de clignotement. Dès que tu appuies sur BP, tu entres en interruption, tu places le bit, tu ressorts de l'interruption. Ton prog principal va lire le bit et faire clignoter tes LED.
Qu'est ce que tu ne comprends pas?
Le principe de l'interruption est aussi d'interrompre le prog principal quel que soit l'endroit où il se trouve.
apparement je me suis mal exprimé :/
j'essaie avec le schema
Pic16F84A probleme d'interruption
Pic16F84A probleme d'interruption
atmaxi a écrit :j'essaie avec le schema
Tu es en train d'essayer de comprendre comment on met en oeuvre une interruption.
Ne rajoute pas des difficultés, restes-en à l'idée de départ :
1 - détecter pression BP
2 - si pressé, activer un clignotement
Donc met en place la gestion INT, et quand c'est fait on va plus loin.
Pic16F84A probleme d'interruption
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
atmaxi a écrit :j'essaie avec le schema
bonjour,
dans ton post #36 sur l'execution du programme
je comprends que tu fais intervenir la notion de temps reels .. qui n'existe pas
surtout avec un systeme mono processeur
C'est une vue de l'esprit, dans lequel on definit une duree temporelle suffisament petite pour dire
que c'est du temps reel ..
celui ci peut etre de 100mS sur des (vieux) automates, < 1µS sur des machines evoluees..
et en langage machine (asm) jusqu'à compter en details chaque duree d'instruction
concerne surtout les timers ,pour amener des corrections sur la duree globale.
Les interruptions sont là pour pouvoir reagir le plus rapidement possible
sur des evenements MATERIEL.S.
donc par du hardware interne au PIC
L'evenement considéré ici est le changement d'etat de RB0,
qui arme le bit int0IF . et genere une interruption
Cet evenement demande quelques instructions en amont et en aval du traitement lui meme
(transparent en langae C ..)
- Sauvegarde du contexte // ou on en etait dans le programme principal
- Si Flag autorisation =1 sinon test IT suivante
- Test du bit Flag interrupt ,
- si armé => .. action utilisateur : exemple mettre un Flag specifique à 1
- Raz du flag Restitution du contexte
retour à la suite du programme principal
la duree globale de ce traitement doit etre la plus courte possible
cela represente quelques µS maximum
car il peut y avoir d'autres Interrup à traiter : ex: Timer, UART ,...
c'est pourquoi on arme un flag specifique qui pourra etre lu ensuite par le programme principal
Le clignotement d'une led à plusieur centaines de mSec
represente > 99% du temps alloué par le processeur
donc l'influence de la reactivité de l'interruption est negligeable
car on est en simili temps reel ..
il est vrai que si ton programme principale avait d'autres taches à effectuer
durant plusieurs centaines de mS, tu pourrais observer un decalage entre l'action et le clignotement
à noter que ton clignotement de led pourrait etre lui meme interrompu par BP RB0
sauf si dans l'interrupt RB0 tu inhibes l'interruption Int0IE=0.. ..
pour ne la rearmer qu'en fin de clignotement led.
Pic16F84A probleme d'interruption
bonjour
Alors comment gérer les INT
1/un int il faut valide cette int (RB0) dans le P.P. (programme principale)
2/bien sur la gérer. INT sur un 16F est a l'adresse 0X04 d’où ORG 0X04
3/la traité dans P.P.
Que trouve ton dans l'int:
-un,test éventuel si c'est bien la bonne int qui nous intéresse sinon on sort de INT
-si c'est la bonne on fait un RAZ du flag de cette int
-faire les sauvegarde adéquate
Puis pour dire au PP qu'il y a eu un INT on va mettre un flag en service c'est quoi se flag et bien par exemple
d’où vient ce flag et c'est une assignation sur une variable j'explique:
1/dans les variables declarer une variable par exemple drapeau
2/dans assignation faire:
Donc une fois fait cela
on restore la sauvegarde et un retfie on sort bien de l'int mais on a aussi mis ce flag flag-RB0 a 1
On peut aussi dans int faire un test de ce flag_RB0 pour éviter les redondances du BP
du style:
si flag_RB0 =1 sortie de INT
sinon on continue
Dans le P.P.que trouve-ton
-l'init de interruption RB0 bien sur.
-Comme tout PP, une boucle qui tourne en rond
et comment faire pour géré cette int dans P.P. ,et bien, tout simplement en faisant un test sur le flag_RB0.
Sil est a zéro il n' a pas d'int on reste dans notre boucle.
si le flag est a un il ya eu une int et on appel la routine (spg) lié a cette int
Dans le spg de int que trouve-ton
Et bien dans ton cas la gestion des leds avec les tempos
mais surtout
une RAZ du flag_RB0 sinon sortie de SPG rebelote appel du SPG dans P.P. et oui tu est en train de faire le traitement de l'int, tu prépares l’éventuel nouvelle INT (un nouvel appui sur le BP)
A+
Alors comment gérer les INT
1/un int il faut valide cette int (RB0) dans le P.P. (programme principale)
2/bien sur la gérer. INT sur un 16F est a l'adresse 0X04 d’où ORG 0X04
3/la traité dans P.P.
Que trouve ton dans l'int:
-un,test éventuel si c'est bien la bonne int qui nous intéresse sinon on sort de INT
-si c'est la bonne on fait un RAZ du flag de cette int
-faire les sauvegarde adéquate
Puis pour dire au PP qu'il y a eu un INT on va mettre un flag en service c'est quoi se flag et bien par exemple
Code : Tout sélectionner
BSF flag_RB0; on a mis un UN sur ce bit
d’où vient ce flag et c'est une assignation sur une variable j'explique:
1/dans les variables declarer une variable par exemple drapeau
2/dans assignation faire:
Code : Tout sélectionner
#define flag_RBO drapeau,0 ; le bit zéro de la variable drapeau sera flag_RB0
Donc une fois fait cela
on restore la sauvegarde et un retfie on sort bien de l'int mais on a aussi mis ce flag flag-RB0 a 1
On peut aussi dans int faire un test de ce flag_RB0 pour éviter les redondances du BP
du style:
si flag_RB0 =1 sortie de INT
sinon on continue
Dans le P.P.que trouve-ton
-l'init de interruption RB0 bien sur.
-Comme tout PP, une boucle qui tourne en rond
et comment faire pour géré cette int dans P.P. ,et bien, tout simplement en faisant un test sur le flag_RB0.
Sil est a zéro il n' a pas d'int on reste dans notre boucle.
si le flag est a un il ya eu une int et on appel la routine (spg) lié a cette int
Dans le spg de int que trouve-ton
Et bien dans ton cas la gestion des leds avec les tempos
mais surtout
Code : Tout sélectionner
BCF flag_RB0; on a mis un 0 sur ce bit
une RAZ du flag_RB0 sinon sortie de SPG rebelote appel du SPG dans P.P. et oui tu est en train de faire le traitement de l'int, tu prépares l’éventuel nouvelle INT (un nouvel appui sur le BP)
A+
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 131 invités