Nous avons 55 invités et aucun membre en ligne

Allez voir ma vidéo Youtube  : [5] Programmation PIC en C : Gestion du temps / Timers

Gérer le temps avec un microcontrôleur peut sembler difficile, mais une fois que l'on connaît les techniques, la gestion du temps devient très utile pour réaliser divers projets!

Pour gérer le temps avec un microcontrôleur PIC, il existe différentes techniques logicielles et vous avez aussi la possibilité d'utiliser les « timers » internes qui sont intégrés au microcontrôleur.

Techniques logicielles :

Lorsque l'on parle de délai, en fait, on veut « faire perdre du temps » à notre programme principal afin de le ralentir et de voir, par exemple, les lumières clignoter. Donc, pour perdre du temps, on peut utiliser la structure conditionnelle «while()» qui va incrémenter une variable jusqu'à une certaine valeur afin de ralentir le programme. On peut l'écrire comme suit :

unsigned int compteur = 0;
while(compteur <= 20 000) compteur++;    // Cette ligne de code s'effectue 20 000 fois.

Ainsi, la variable compteur va s’incrémenter 20 000 fois avant de passer à l’instruction suivante.

L'autre structure de programmation qui peut réaliser le même travail est le «for()». Pour faire le même travail que le «while()», on peut écrire le programme de la manière suivante :

unsigned int compteur = 0;
for(compteur = 0; compteur <= 20 000; compteur++);

Avec ces deux techniques, vous pouvez faire perdre du temps à votre programme pour créer des délais. Le problème, avec ce genre de gestion du temps, c'est que le temps perdu est d'une durée inconnue (ce délai peut être mesuré avec le simulateur). Ce n'est pas recommandé d'utiliser ce genre de structure pour créer des délais à moins que vous n'ayez pas la possibilité de faire autrement.

Une autre technique, pour les débutants, consiste à créer des délais en utilisant la librairie disponible dans MikroC PRO. Cette librairie est déjà installée avec le compilateur et vous permet de créer des délais facilement et avec une très bonne précision. Ces délais utilisent la fréquence de votre crystal choisi pour établir la temporisation. Pour l'utiliser, il vous suffit d'inscrire le nom de la fonction et le temps que vous désirez. Il existe deux fonctions préprogrammées. Une qui fait des délais en microsecondes et l'autre en millisecondes.

Delay_us(453);    // Délais de 453 us

Delay_ms(296);   // Délais de 296 ms

Pour faire clignoter une LED, cette technique peut être vraiment efficace puisque c'est simple d'utilisation et c'est très précis. Encore là, si vous faite un système qui nécessite un contrôle très rapide, il faut éviter ce genre de fonction puisque le programme boucle sur cette partie tant que le délai programmé n’est pas écoulé.

Technique utilisant les timers :

Finalement, une technique qui mérite d'être connue et bien maîtrisée est celle qui utilise les « timers » internes du microcontrôleur. Tout d'abord, il faut savoir qu'il peut y avoir plusieurs timers dans un seul microcontrôleur. Il faut également savoir que, les timers peuvent être conçus de différentes façons. Il existe des timers 8-bits, 16-bits et même plus ! Les timers internes des microcontrôleurs PIC peuvent être contrôlés avec seulement 2 ou 3 registres, tout dépendant du PIC choisi. Pour le PIC16F84A, il y a un seul timer et c'est le timer0. Ce timer est de 8-bits, donc il compte jusqu'à 256. Les registres à mettre à jour pour ce PIC sont OPTION_REG et INTCON.

Les bits importants pour le registre OPTION_REG sont T0CS, PSA, PS2, PS1 et PS0. Dans notre cas, on utilise un crystal, donc on met le bit T0CS à 0. On va mettre PSA à 1 et les autres PSx (PS2, PS1, PS0) à 0 pour utiliser la fréquence de notre crystal.

Pour le registre INTCON, les bits importants sont GIE, T0IE et T0IF. Le bit GIE doit être mis à 1 pour activer toutes les interruptions du microcontrôleur et le bit T0IE doit aussi être à 1 pour activer l'interruption créée par le dépassement du tampon (Overflow) du timer0. Finalement, dans la routine d'interruption, il faudra tester si le bit T0IF est à 1, dans ce cas, il y a un dépassement du tampon (Overflow) du timer0.

void interrupt()
{
  if(T0IF == 1)
  {
     action;
  }
}

Pour calculer la valeur à mettre dans TMR0, utilisez la formule suivante en y mettant les valeurs correspondant à votre projet (cette formule s'applique aux timers 8-bits) :

Sans abonnement Abonnés et Abonnés VIP
 <--- Schéma  <--- Schéma Complet
<--- Code en Hexa    <--- Code en C modifiable

Allez voir ma vidéo Youtube  : [5] Programmation PIC en C : Gestion du temps / Timers