Je comprend que je suis peut-être allé un peu vite en te conseillant la fiche technique du PIC. Peux-tu nous éclairer sur ton niveau en anglais ?
J'ai un peu peur quand tu dis :
bypbop wrote:
j'ai compris qu'un interruption se definit sur 8 bits
Je te présente ma manière de voir les choses :
Tu as un code principal, dans void main(){ ... }. Ce code s'exécute séquentiellement, chaque ligne l'une après l'autre.
Ce code peut s'interrompre pour en exécuter un autre. Cet autre code se trouve dans void interrupt (void){ ... }. Dès que le code dans interrupt() a été exécuté, le programme reprend son cours dans le main(), à l'endroit exacte où il l'avait quitté.
Tu choisis les événements qui peuvent interrompre ton code avec des bits de configuration.
Dans ton code tu as activé les interruption pour deux types d'évènement :
- Les front montant (ou descendant) arrivant sur RB0 (INT0)
- Un changement d'état de l'une des pattes RB4, RB5, RB6, ou RB7
Le deuxième type d'évènement ne te sert à rien et bloquerait ton code si une interruption se déclenchait (parce que tu ne ferait rien qui "lève" l'interruption. Ton code entrerait et quitterait sans cesse la fonction interrupt().
Pour commencer , la magie est ici :
Code:
INTCON.GIE = 1;
INTCON.RBIE = 1;
INTCON.RBIF = 0;
INTCON.INT0IE = 1;
INTCON.INT0IF = 0;
Et un petit dessin ne fait jamais de mal :

Ce schéma présente toutes les sources possibles d'interruption, mais sans explication, c'est pas très clair.
Tu vois que tu as GIE (Global interruption Enable) qui permet de bloquer ou de débloquer toutes les interruptions. Si tu ne veux pas d'interruption, tu le mets à 0, sinon, si tu veux te servir d'au moins une interruption, tu le mets à 1.
Ensuite tu vois que pour chaque source d'interruption, tu as deux bits :
L'un qui passe automatiquement à un lorsque l'évènement se produit (le bit en "IF" => interrupt flag) - parfois appelé drapeau ou sémaphore.
L'autre que tu contrôles, et qui se termine en IE (interrupt enable) - qu'on peut traduite par "activation de l'interruption".
L'évènement ne déclenche une interruption que si les deux bits (IF et IE) sont à 1. Du coup, quand tu as choisis l'évènement pour lequel tu souhaites une interruption, tu mets son bit IE à 1.
Dans la pratique,
avant de mettre le bit IE à 1, on met le bit IF correspondant à 0, pour s'assurer que l'interruption ne se déclenche pas si le bit IF était à 1.
Tu as mis deux bit IE à 1, INTCON.INT0IE et INTCON.RBIE.
Tu ne veux pas des interruptions liés aux RB4 à RB7, tu peux supprimer la partie INTCON.RBIE et INTCON.RBIF.
Un petit mot sur PEIE, on voit que PEIE permet de bloquer tout un lot d'interruption. il ne faudra pas oublier de le passer à 1 si tu veux te servir d'une des interruptions indiquées tout à gauche. PEIE prétend gérer les interruptions liées aux périphériques (mais c'est un peu arbitraire).
J'espère t'avoir éclairé un peu, n'hésite pas à poser tes questions.
Si certains lecteurs trouvent que mon explication mérite d'être approfondie/améliorée/tronquée par leur soin qu'ils n'hésite pas à me le faire savoir.
_________________
Équipe PoivronCoupe 2012 : Équipe Poivron (73e)
Coupe 2011 : Équipe Poivron (122e) - Prix des équipes !
Coupe 2010 : Équipe Poivron (78e)
Passez voir le
Portail des équipes