Dernière mise à jour le 10/02/18

Présentation


Commençons en douceur sur l’utilisation des interruptions du Timer1 qui à pour but de faire clignoter uniquement 3 leds de couleur Bleu/Rouge/Verte.

Schéma PIC32 Interruptions Timer1


Programme PIC32 Interruptions Timer1


Programme disponible aussi en MikroC

program PIC32_Interruptions_Timer1;
 
procedure init;
begin
AD1PCFG:= $FFFF; // Initialise les broches en numérique ou digital
TRISB:= 0; // Initialise le PORTB en sortie
LATB:= 0; // Initialise toutes les sorties du PORTB à l’état logique BAS
PORTB :=$0000; // On fixes les sorties à l’état zéro
 
EnableInterrupts(); // Activations des interruptions IVT
 
ON__T1CON_bit:=1; // On active le du TIMER1
 
TCKPS0_bit:=1; // |
TCKPS1_bit:=1; // | prescaler sur 256
 
 
T1IP0_bit:=1; // |
T1IP1_bit:=1; // | Réglage du TIMER1 en priorité 7
T1IP2_bit:=1; // |
 
T1IE_bit:=1; // On active le TIMER1 en mode interrutpion sur débordement
 
TMR1 := 0; // On met à zéro le TIMER1 pour commencer à compter…
end;
 
procedure Timer1_Interruption; // Nom du programme de l’interruption
iv IVT_TIMER_1; // Appel de l’interrutpion du TIMER1
ilevel 7; // Propriété niveau 7
begin
 
LATB.1:=LATB.1 xor 1;
LATB.4:=LATB.4 xor 1;
LATB.5:=LATB.5 xor 1;
 
IFS0.T1IF:= 0; // On sort de l’interruption et on recommence à compter
end;
 
begin
init;
while true do
begin
// On ne fait rien dans le programme principale
end;
end.
end.

Si on applique la structure comme expliqué précédemment dans les interruptions on y retrouve bien :
1 – La procédure nommée : procedure init; avec les instructions situé entre le début « begin » et la fin « end ; »
2 – L’interruption du Timer1 ;
3 – Le programme principal ;
 
Regardons en détails cette première programmation :

Activation du Timer1 – bit : T1CON


ON__T1CON_bit:=1; // On active le du TIMER1 afin de mettre en fonctionnement le Timer1

Réglage du prescaler – bit : TCKPS0/TCKPS1/TCKPS2


TCKPS0_bit:=1; // |
TCKPS1_bit:=1; // | prescaler sur 256

Exemple en vidéo?


Le réglage de ces bits permet de faire clignoter plus ou moins vite les leds. Une “grosse” vidéo ci-dessous permettra de mieux cerner l’intérêt du prescaler.

Réglage des priorités – bit : T1IP0/T1IP1/T1IP2

T1IP0_bit:=1; // |
T1IP1_bit:=1; // | Réglage du TIMER1 en priorité 7
T1IP2_bit:=1; // |
 
Nous retrouvons les 3 bits qui permettent de modifier la priorité soit 111 en binaire donne iLevel 7 – et 001 en binaire donne iLevel 1

Activation des interruptions sur débordement – bit : T1IE


T1IE_bit:=1; // On active le TIMER1 en mode interrutpion sur débordement.

Réglage des priorités – bit : T1IP0/T1IP1/T1IP2

Ce bit est accessible par le registre (REGISTER) IEC0.
 

 
Pour que l’interruption iv IVT_TIMER_1 se déclenche il faut que le bit d’interruption sur débordement du timer1 soit activée et c’est le rôle du bit T1IE_bit:=1. Ainsi Chaque fois que le Timer 1 va avoir terminé de compter, son drapeau d’interruption (voir Remarques) va se lever ce qui entraine la mise à l’état logique 1 du bit T1IF. Ensuite pour sortir de l’interruption du Timer, il suffit de mettre à 0 le bit T1IF.
Remarque : On parle de drapeau d’interruption chaque fois que le Timer est arrivé à sa dernière valeur de comptage (soit 255 pour le Timer1 qui compte sur 16 bits) ce qui entraine la mise à l’état logique 1 du bit T1IF. Plus généralement un drapeau levé correspond à l’état logique 1 et un drapeau baissé correspond à l’état logique 0.

iv IVT_TIMER_1;

Nous avons évoqué l’activation sur débordement du Timer1, mais nous n’avons pas vraiment approfondi la chose… Si vous avez manquez le début sur les interruptions il suffit de cliquer juste ici.
 
Nous savons maintenant que Iv IVT_TIMER_1 est une routine qui permet d’être appelé lorsque le Timer1 a débordé, mais c’est quoi un débordement ?
 
Pour n’importe quel Timer le débordement est le faite qu’un Timer va compter jusqu’à sa valeur maxi. Pour le Timer1 qui celui-ci compte sur 16 bits, sa valeur maxi est de 255 en décimal, c’est-à-dire qu’il va compter de 0 à 255 à chaque coup d’horloge, puis, lorsqu’il aura compté jusqu’à 255 son drapeau d’événement (drapeau d’interruption) va passer à l’état logique « 1 » indiquant que le Timer1 a débordé et qu’il a fini de compter ce qui va donc entrainer par la même occasion une interruption géré par iv IVT_TIMER_1 . Pour redémarrer de nouveau un cycle de comptage il suffit de remettre le drapeau d’interruption à 0 ce qui nous permettra de sortir de l’interruption iv IVT_TIMER_1.

D’autre Réglage du Timer1


Avant d’aborder les autres réglages du Timer1 je tiens à faire une parenthèse, Reprenons le tableau ci-dessous ensemble :

Ce tableau est le Registre (REGISTER) du T1CON qui permet de contrôler le Timer1. Ce registre est composé de 32 bits (0 à 31 on compte le zéro) 1 bit correspond à une case. Pour ma part, j’ai utilisé les routines de MikroPascal mais rien ne vous empêche d’utiliser le registre .
 
Plutôt que d’écrire en utilisant les routines de MikroPascal

 

ON__T1CON_bit:=1; // On active le du TIMER1
 
TCKPS0_bit:=1; // |
TCKPS1_bit:=1; // | prescaler sur 256
 

J’aurais bien pu écrire sous cette forme :

T1CON:=$8030

Il en résulte que sur 32 bits le registre T1CON donne en binaire
 
T1CON := 00000000 00000000 10000000 00110000 (en Hexadécimal donne : $8030)
 
On commence toujours de gauche à droite (bit le plus fort=32 au bit le plus faible=0)
 
Comme vous pouvez le voir, cela en fait des 0 et des 1 à mettre il va falloir bien faire attention et c’est assez fastidieux comme méthode surtout si nous sommes pressés… Vous comprenez maintenant pourquoi j’ai un petit faible pour les routines toutes faites ?!
 
Bon !! Fermons la parenthèse, et regardons en détails les possibilités du Timer1. Je vous laisse lire…



Autre exemple pour le bit TCKPS bit compris entre 0 et 1, je peux mettre la valeur de 1:64 en écrivant comme ceci :
 
TCKPS0_bit:=0; // |
TCKPS1_bit:=1; // | prescaler sur 64
 
Il reste plus qu’à écrire cette nouvelle ligne à la place de l’ancienne, de compiler, de flasher et le tour est joué !!
 
Je vous remets la vidéo, car une erreur volontaire est glissée. Regarder bien les bits du prescaler j’ai indiqué TCKPS0/TCKPS1/TCKPS2, alors que le DataSheet indique seulement TCKPS0/TCKPS1. Il en résulte que le bit TCKPS2 est inutile!!

Historiques


– 10/02/18
Programmation du PIC32 disponible aussi en MikroC.
– 03/02/18
Première mise à disposition.