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
mazertoc
Passioné
Passioné
Messages : 201
Enregistré en : juillet 2015
Localisation : Auvernha

#31 Message par mazertoc » mer. 14 oct. 2015 11:25

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
atmaxi
Membre
Membre
Messages : 17
Enregistré en : octobre 2015

#32 Message par atmaxi » mer. 14 oct. 2015 12:23

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 :geek:

Pic16F84A probleme d'interruption
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#33 Message par Gérard » mer. 14 oct. 2015 20:42

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

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

#34 Message par atmaxi » mer. 14 oct. 2015 22:16

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

#35 Message par Gérard » mer. 14 oct. 2015 22:51

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

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

#36 Message par atmaxi » jeu. 15 oct. 2015 02:19

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


Image

Pic16F84A probleme d'interruption
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#37 Message par Gérard » jeu. 15 oct. 2015 07:57

C'est quoi les instructions 3 à 8?
A 4 MHz, une instruction dure 1µs, alors pour quelques instructions, tu n'y verras rien.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Pic16F84A probleme d'interruption
mazertoc
Passioné
Passioné
Messages : 201
Enregistré en : juillet 2015
Localisation : Auvernha

#38 Message par mazertoc » jeu. 15 oct. 2015 10:19

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
Avatar de l’utilisateur
Expert
Expert
Messages : 2586
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#39 Message par paulfjujo » jeu. 15 oct. 2015 11:19

atmaxi a écrit :j'essaie avec le schema
Image



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.
Aide toi, le ciel ou FantasPic t'aidera

Pic16F84A probleme d'interruption
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#40 Message par Guest » jeu. 15 oct. 2015 11:27

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

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 : Bing [Bot] et 4 invités