Dans le premier tutoriel, nous avons expliqué comment faire clignoter une LED à intervalles réguliers. Mais le gros inconvénient de ce programme était que le processeur fonctionnait à plein temps juste pour attendre. Dans ce chapitre, nous expliquons comment utiliser les timers pour pallier cet inconvénient.

 À propos des timers

Tous les processeurs ont des times. Qu'est-ce qu'un timer? C'est simplement un compteur avec des fonctions supplémentaires, par exemple la possibilité de configurer en sorte qu'il avertisse le processeur après avoir compté jusqu'à une valeur prédéterminée. Voici comment faire.

Les timers du MSP430

Le MSP430 de notre carte a 4 timers. TA0, TA1, TA2 et TB. Pour ce qui est de cette fonctionnalité, ils sont tous équivalents. Il peuvent être configurés pour appeler une certaine fonction quand un certain événement arrive. Par exemple fin de comptage. Cette fonction est appelée routine d'interruption (ISR en anglais, pour Interrupt Service Routine).

Ce que nous devons faire:

  • Configurer le timer à une certaine valeur, avec interruption.
  • Écrire une routine d'interruption qui sera appelée à chaque fois que cette valeur est atteinte.

Comme nous l'avons vu, le MSP430 a une fréquence par défaut de 1MHz. La fréquence du clignotant va donc dépendre de la valeur du timer. Cette valeur étant sur 16 bits, nous ne pouvons pas dépasser 65535. Si nous mettons par exemple 50 000, alors la LED changera d'état touts les 50 000 coups d'horloge. Donc une période durera 100 000 coups d'horloge, par conséquent 10 Hz pour une fréquence d'horloge de 1 MHz. Le clignotement en 10 Hz est parfaitement visible.

Le programme est comme suit:

--------------------

#include <msp430F5659.h>

int main(void) {
    WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
    P2DIR |= 0x03;                          // P2.0 output + P2.1 output (oscillo)
    TA0CCTL0 = CCIE;                        // CCR0 interrupt enabled
    TA0CCR0 = 50000;
    TA0CTL = TASSEL_2 + MC_1 + TACLR;       // SMCLK, upmode, clear TAR
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0, enable interrupts
}

// Timer0 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void) {
    P2OUT |= 0x02;
    P2OUT ^= 0x01;                          // Toggle P1.0
    P2OUT &= ~0x02;
}

--------------------

Comme nous pouvons le voir, après quelques configurations, le programme entre en mode veille et ne reprend du service que pour traiter l'interruption. Et l'interruption ne fait qu'inverser l'état de la LED, ce qui est très rapide.

Afin de visualiser le temps "actif", le temps où le processeur fait réellement quelque chose, nous avons aussi utilisé le bit 1 en plus du bit 0. En mettant ce bit à 1 en début d'interruption (P2OUT |= 0x02) puis à 0 à la fin (P2OUT &= ~0x02), nous pouvons voir que le processeur ne fait  presque rien.

Hima

Il faut augmenter la luminosité pour voir le pic pendant lequel le processeur est actif, sinon ce pic est presque invisible.

En agrandissant ce pic, on peut voir qu'il dure 7µs et qu'il apparaît toutes les 48 ms. Le taux d'occupation du processeur est donc de l'orde de 0,015%.

 

 

 

 

 Pour résumer les avantages de cette technique:

  • Élimination d'une fonction delay qui ne fait que consommer des cycles d'horloge
  • La charge du processeur est très basse
  • Le timing ne dépend pas de ce qui est exécuté. Si nous ajoutons des actions pendant l'interruption, la fréquence des débuts d'interruptions sera rigoureusement identique.

Et maintenant?

Ce programme nous a montré une façon économique d'utiliser le processeur pour des tâches récurrentes. Mals il reste un problème: l'horloge par défaut est de 1 MHz, mais pas très précise. Avec une valeur de 50000, nous devrions avoir une période de 50 ms, mais nous avons 48 seulement. Une erreur beaucoup trop importante pour faire des programmes temporellement précis.

Dans le programme suivant, nous allons montrer comment utiliser les quartz, et notamment celui de l'horloge temps réel.

 

Téllécharger le programme

Un sommaire de ces prmiers programmes est téléchargeable en fichier zip ici.