Utilisation des interruptions


Les delay sont des fonctions a éviter en programmation car ils bloquent le programme pendant x us /ms /s. Pour faire des petits test simple s'est bien mais dés qu'on fait plus que faire clignoter une led, lorsque s'est possible l'utilisation des interruptions est souhaitable.

Pour cette exemple nous allons améliorer le programme Faire clignoter une led

Choix du module


Le PIC16F876 est composée de 3 Timer ( 0 , 1 , 2 ), qui sont utilisable dans plusieurs mode , le timer1 est un timer de 16 bits et le 0 et le 2 sont des timer de 8 bits. Une interruption est possible lors de l'overflow d'un timer.

Configuration avec le Wizard de CCS


Le wizard (magicien) du compilateur est fort utile il permet sans faire de calcul de configurer directement le pic. Le seul petit moins s'est qu'on ne peux pas récupérer les fonctions associées pour comprendre pourquoi notre programme ne fonctionne pas. ( hormis de passer en assembleur ... )



Clignotement d'une led


Les schéma de câblage


On réutilise le même schéma que pour Faire clignoter une led

Le programme

  1. #include <16f876A.h>
  2. #use delay(clock=20000000)
  3. #fuses HS, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
  4. #define LED pin_b1
  5.  
  6. #int_TIMER1
  7. TIMER1_isr()
  8. {//overflow tous les 104 ms
  9.    output_toggle(LED);
  10. }
  11.  
  12.  
  13.  
  14. void main()
  15. {
  16.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  17.    enable_interrupts(INT_TIMER1);
  18.    enable_interrupts(GLOBAL);
  19.    while(1)
  20.        {
  21.        //Vous pouvez réaliser quelque chose d'autre ...
  22.        }
  23. }
  24.  


Utilisation de plusieurs interruptions


Lors d'une interruption le pic se déroute dans la routine d'interruption , ou le compilateur CCS détecte si oui ou non l'interruption a été déclenché. Donc il faut être rapide dans la phase d'interruption , car si toute les milliseconde on génère une interruption et une interruption dure 2 milliseconde on perdra une interruption.

La solution est simple, il faut éviter a tout prix de faire des traitements dans les interruptions. Pour ceci les flags sont très utile , exemple lors de la détection d'une touche sur un clavier, passer le flag : new_touche a 1.

Dans la boucle while(1) faire un test if(new_touche==1) si oui lancer le programme de gestion de touche, et passer new_touche a 0.

Matthieu

© robot-amateur.com - Tous droits réservés. Reproduction interdite sans autorisation.