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.
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.
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.
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.
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.