TD 4 : Système d'interruption

Sommaire[Masquer]

Il s'agit d'étudier le système d'interruption des PIC18F4550.

Pour rappel, le processus d'interruption d'un uC permet d'exécuter un code spéficique au moment où se présente la requête d'interruption. Au moment où la requête apparaît, le programme en cours d'exécution est temporairement abandonné, l'adresse de la prochaine instruction qui devait être exécutée est placée dans la pile, et le uC exécute le code spécifique de l'interruption.
Lorsque la fonction de traitement d'interruption est achevée, le uC récupère dans la pile l'adresse du programme principal où l'exécution avait été interrompue.

1. Etude du bloc logique d'interruption.

1.1. Sources d'interruptions

Les interruptions sont présentées dans la section 9.0 de la documentation. La figure 9-1 suffit en grande partie à la compréhension du dispositif.

  1. Lister quelques sources d'interruptions du PIC18F4550.
  2. Pour une source donnée, indiquer à quoi correspondent les bits terminant par IE (exemple TMR0IE), IF (exemple TMR0IF) et IP (exemple TMR0IP) ?

1.2. Propagation d'un signal de demande d'interruption

On s'intéresse plus particulièrement à l'interruption émanant du Timer 2. Elle n'apparaît pas sur la figure 9-1 mais son fonctionnement est schématiquement identique au traitement de l'interruption du Timer 1.

  1. Préciser la liste des bits à configurer et leurs valeurs pour que l'interruption du Timer 2 soit prise en charge avec un niveau de priorité haute, agissant donc sur l'entrée Interrupt to CPU vector to location 0008h du CPU.

1.3. Fonction spécifique d'interruption en C

En plus de la configuration de ces différents bits, il est nécessaire d'ajouter à nos programmes une fonction faisant office de fonction d'interruption. Le compilateur XC8 dispose de directives permettant la mise en place d'une telle fonction.

  1. En vous aidant du manuel de l'utilisateur du compilateur XC8, écrire l'entête d'une telle fonction pour une interruption de haut niveau de priorité.
  2. Idem pour une interruption de basse priorité.

2. Application : activation d'un indicateur temporel

Au cours du TD 2, le Timer 2 a été configuré pour fournir une base de temps de 5ms par l'intermédiaire de TMR2IF. Et c'est dans la boucle infinie de la fonction principale qu'on avait disposé un compteur permettant d'élaborer une seconde base de temps de 500ms à partir du traitement de TMR2IF, en mettant en place un compteur s'incrémentant à chaque mise à 1 de TMR2IF. Le compteur arrivant à 100, on pouvait en déduire qu'une durée de 100 x 5ms soit 500ms s'était écoulée.

Cette approche possède un inconvénient évident : si le temps de traitement de la boucle infinie excède 5ms, il n'est plus possible de comptabiliser les déclenchements successifs de TMR2IF par la circuiterie du Timer 2. Il faut donc trouver une autre approche. La plus simple consiste à traiter la mise à 1 de TMR2IF par le dispositif d'interruption. Et cela tombe bien, TMR2IF est une source d'interruption.

  1. Ecrire la fonction d'interruption permettant de générer un indicateur nommé Indicateur500ms qui pourra être traité dans le programme principal pour changer l'état de la LED1 toutes les 500ms.
  2. Ecrire la partie permettant le traitement de l'indicateur dans la boucle infinie du programme principal.