Dernière mise à jour le 03/02/18
Présentation
Dans ce présent article nous allons débroussailler le terrain afin d’avoir un aperçu de ce qu’on appel les interruptions, puis nous verrons dans des autres articles leurs utilisations. Avant d’aborder les autres articles, nous allons nous contenter d’expliquer simplement le rôle de ces interruptions afin de nous familiariser avec ces nouveaux outils de programmation, puisqu’ils sont différents des PICs de la famille 10F/12F/16F/18F.
Les interruptions sont des évènements qui sont exécutés en dehors du programme principal. Afin de pouvoir exécuter une interruption il faut dans un premier temps faire un préréglage dans la procédure d’initialisation du PIC qui celle-ci permettra de bien initialiser le PIC. Dès lors de sa mise sous tension (Attention !!! 3,3V pour rappel), cette initialisation sera effectuée dans la « procedure init ». Nous verrons plus en détails toutes les possibilités concernant les interruptions proposées par le PIC32 dans les prochains articles car la liste est longue.
Dans la procédure d’initialisation du PIC32, il faut avant tout insérer quelques lignes de programmation pour que l’interruption que vous désirez exécutée soit appelée.
EnableInterrupts()
Cette première routine est située dans le logiciel MikroPascal, mais pour ceux qui utiliserais MikroC ou MikroBascic…, cette routine est aussi présente. EnableInterrupts permet de faire appel aux “Interruptions Vecteurs” (IV). Pour faire simple sur ces interruptions, immaginez que vous ayez un classeur munis d’intercalaires, et que sur ces intercalaires le nom des thèmes, ou bien un classement alphabétique sont situés afin que vous puissiez retrouvez l’ensemble des documents que vous êtes entrain de rechercher. Et bien c’est la même chose avec les interruptions vector, au moment ou une interruption va se produire le nom de cette interruption sera “indexé” et son programme sera exécutée. (si on fait une analogie au niveau de “l’indexage” cela représente le nom de l’intercalaire sélectionné). Mais attention!! Si vous ne mettez pas « EnableInterrupts() » dans l’initialisation du PIC, aucune interruption vecteur ne sera appelés se qui empêchera sont éxécution!!.
IVT_XXXX
L’appel des interruptions sont faites par IVT_XXXX, ou XXX est à remplacer par l’interruption que vous désirez. Une interruptions est exécutée en fonction de notre besoin. Par exemple si on désire utiliser les interruptions du timer 1 nous mettrons iv IVT_TIMER_1, ou bien un autre exemple si nous désirons obtenir des interruptions sur une capture d’entrée, nous mettrons iv IVT_INPUT_CAPTURE_1. Nous verrons un peu plus loin qu’ils existes d’autres interruptions.
Gabarit du programme des interruptions
Comme nous l’avons dis précédemment, puisque ces interruptions sont appelées en dehors du programme principal le gabarit du programme est le suivant
//Initialisation du PIC
procedure init ; begin EnableInterrupts(); // Activations des interruptions IVT ilevel 7; // Propriété niveau 7 IC1IP0_bit:=1; // | IC1IP1_bit:=1; // | Capture 1 sur le niveau 7 IC1IP2_bit:=1; // | end ; // Interruption procedure Capture_1(); iv IVT_INPUT_CAPTURE_1; // Interruption de la capture sur la broche 1 ilevel 5; // Propriété niveau 5 begin //programme de l’interruption…. end ; // Programme principal begin init() ; while true do begin // On exécute en boucle le programme principal end; end. |
Visualisez bien cette mise en forme car celle-ci sera toujours réalisée de cette façon.
1 – L’initialisation du PIC ;
2 – L’interruption (ici dans l’exemple il s’agit de l’interruption INPUT- CAPTURE 1) ;
3 – Le programme principal exécuté en boucle.
Quelques interruptions en vues
MikroPascal for PIC32 propose une série d’interruptions possibles avec un PIC32. Les exemples ci-dessous montre quelques interruptions envisageables sur le MINI-32.
Possibilité de faire des interruptions sur :
– des interruptions externes,
– sur les Timers,
– sur des captures,
– sur des comparaisons,
– et bien d’autre encore….
Rq:Comme vous pouvez le constater, on retrouve l’interruption nommée INPUT_CAPTURE_1 comme dans l’exemple du gabarit du programme
C’est que le niveau de priorité? iLevel?
Prenons un exemple ou 2 voitures rentrent les unes après les autres dans un garage situé au sous-sol. La première voiture voit une led rouge (1er interruption) afin d’être stopper pour pouvoir prendre un ticket, et lorsque ce ticket a été pris cette même voiture verra une autre led qui passera au vert (2ème interruptions) indiquant au conducteur qu’il peut rentrer dans le parking. La voiture suivante se verra de nouveau avec une led Rouge allumée pour prendre de nouveau un ticket et rentrée elle aussi dans le parking souterrain.
Le programme va donc exécuter 2 interruptions, une pour la led Verte (par exemple une impression de ticket) et l’autre pour la led rouge (par exemple lever la barrière). Tout se passe bien puisque les voitures sont les unes derrière les autres et donc aucune voiture arrivera en même temps devant la barrière. Mais admettons que cette fois-ci nous nous retrouvons dans une situation ou les voitures sont les unes à côtés des autres! Et bien! c’est ce que nous allons voir tout de suite puisque c’est dans ce cas de figure que nous allons faire appel à la priorité (quelle voiture sera prioritaire par rapport à l’autre).
Niveau de priorité – iLevel X – bit xxIP
Nous avons dit précédemment que les interruptions pouvaient être prioritaires sur d’autre. Reprenons l’exemple précédent et imaginez maintenant que les voitures ne sont pas les unes après les autres mais cotes à côtes. Ce cas de figures est un peu plus complexe à réaliser car si 2 voitures arrivent au même moment , et qu’elles sont détectées en même temps, la seule manière de pouvoir rendre prioritaire l’une des deux pour « décoincer » la situation c’est de mettre des niveaux de priorités sur ces interruptions. Le PIC32 à la possibilité de mettre 7 niveaux de priorités, ainsi le premier niveau est prioritaire sur le 2ème, le 2ème niveau prioritaire sur le 3ème etc… etc … et cela jusqu’à 7!! Il en résulte que si nous avons 2 barrières situées l’une à côté de l’autre avec une barrière nommée barrièreA et l’autre nommée barrièreB , et que nous décidons de mettre une priorité sur la barrièreA et en 2ème priorité la barrièreB, il en résulte que si 2 voitures arrivent en même temps à la même seconde , c’est donc la barrièreA qui sera levée avant la barrièreB.
Dans ce cas iLevel X (ou X représente le niveau compris entre 1 et 7) permettra et vous l’aurez compris de rendre des interruptions prioritaires par rapports à d’autres. Imaginer vous qu’au même moment tout arrives en même temps!!! L’interruption (IV) à tout son intérêt, puisque il va interruptions concernée et en plus de choisir en fonction du “iLevel” celle qui sera prioritaire par rapport à l’autre tout simplement!. Hum!! qu’est ce qu’il nous raconte encore?!!
Ah oui!! une dernière chose, le réglage des niveaux de priorités sont réalisés par le bit xxIP (XX coresspond à l’interrutpion en question . par exemple si nous décidons d’utiliser le timer1 nous écrirons T1IP, si nous décidons le timer2 nous écrirons T2IP. Bien évidemment d’autre interrutpions sont accessible mais allons y doucement!!
Historiques
– 03/02/18
Première mise à disposition.