Programmation AVR seconde partie (2/3)

vendredi, janvier 13, 2023

Bon, j’espère que mon précédent billet vous aura permis de comprendre un peu comment fonctionnait la programmation avr.Il reste néanmoins encore de nombreux points qui pourraient êtres abordés, je voulais vous en présenter encore au moins 2 : les timers et les interruptions. Une fois ces deux points maîtrisés, vous serez capable déjà pas mal de petites choses avec vos microcontrolleurs.

Aujourd’hui : Les timers

Comme son nom peut vous laisser le deviner, un timer sert à comptabiliser le temps écoulé. Son principal intéret réside dans le fait que son exécution se déroule en parallèle du programme principal. Votre timer ne sera donc pas affecté par le nombre de d’instructions de votre programme.
Il est bien sur possible pour le programme principal d’interroger le timer, mais il est également possible de configurer le timer pour renvoyer une valeur directement sur une pin matérielle.
Avant d’aller plus loin sur la mise en place d’un timer, il nous faut aborder la notion de pré-scaller. En effet, si notre timer fonctionnait uniquement à la vitesse de l’horloge, nous serions assez rapidement embêté : à 1MHz, par exemple, un signal de 1mS correspondrait à 1000 cycles d’horloge, et pour un timer 8 bit tel que celui de notre ATTiny85, correspondrait à plus de 3 débordements de valeur. Autant dire que ce n’est pas très pratique.
C’est là qu’intervient le prescaler : il permet de faire fonctionner le timer à un sous-multiple de la fréquence d’origine, en divisant la fréquence par 8, 64, 256, 1024. Bien sur, en utilisant le préscaler, on diminue la résolution, il faut donc l’utiliser à bon escient.

Voyons maintenant ça en pratique : faire clignoter une led, mais sans utiliser les fonctions _delay_ms. La led est connectée sur le port PB1 (pin 6 de l’Attiny85). On veut faire changer l’état de notre Led dix fois par seconde. A 1MHz, il faudrait compter jusqu’à…. 100000, ce qui n’est pas directement possible avec notre registre 8 bits. Nous allons donc utiliser le prescaler, en divisant l’horloge par 1024 : 100000/1024 = 97.65, donc ça rentre.

# include <avr/io.h>
int main ( void )
{
DDRB |= (1 << PORTB1) ; //On configure PB1 en tant que sortie
//Todo : Configuration du timer avec prescaler de 1024
    for(;;)
    [
      if()//On vérifie si le timer a atteint un dixieme de seconde
      {
       PORTB ^= (1 << 0) ;//On inverse l'état de la led
       //on réinitialise le timer
       }
    }
}
TCCR0B
Clksrc

La datasheet nous indique que les bits permettant de régler le timer sont les bits CS00 à CS02, le tableau suivant nous expliquant les valeurs à donner en fonction de la configuration voulue.

Dans notre cas, nous voulons un prescaler de 1/64, il faut donc passer les bits CS00 et CS01 à 1, ce qui nous donne :

#include <avr/io.h>
int main ( void )
{
DDRB |= (1 << PORTB1) ; //On configure PB1 en tant que sortie
TCCR0B |= (1 << CS00) | (1<<CS02); //Set up timer1 with prescaler 1/1024
    for(;;)
    [
      if()//On vérifie si le timer a atteint un dixieme de seconde
      {
       PORTB ^= (1 << 0) ;//On inverse l'état de la led
       //on réinitialise le timer
       }
    }
}

Il ne nous reste plus qu’à lire notre timer, pour savoir s’il dépasse 97, et, si c’est le cas, inverser l’état de notre led, et réinitialiser le timer. Ces opérations se font via le Time Counter Register, à savoit TCNT0 sur notre ATTiny85 (il peut y en avoir plus d’un selon votre microcontrolleur). Selon la datasheet toujours, ce registre est accessible en lecture/écriture, ce qui nous permettra la lecture, mais aussi sa remise à Zero. Voici ce que nous donne le code :

#include <avr/io.h>

int main ( void )
{
DDRB |= (1 << PORTB1) ; //On configure PB1 en tant que sortie
TCCR0B |= (1 << CS00) | (1<<CS01); //Set up timer1 with prescaler 1/1024
    for(;;)
    [
      if(TCNT0>=97)//On vérifie si le timer a atteint un dixieme de seconde
      {
       PORTB ^= (1 << 0) ;//On inverse l'état de la led
       TCNT0 = 0;//on réinitialise le timer
       }
    }
}




A bientôt pour la dernière session : les interruptions.

–edit–
L’article a été mis à jour suite à des erreurs qui m’avaient été signalé. N’hésitez pas si vous en trouvez d’autres 😉

Laisser un commentaire