Le PRESCALER




GÉNÉRALITÉS
La mise en œuvre des microcontrôleurs nécessite de connaître leurs différents registres et leurs contenus.

L'Atmega 328 qui équipe l'arduino uno possède 3 timers/compteurs :
• Le TC0 est un timer/compteur de 8 bits qui compte jusqu'à 256 (0 à 255),
• Le TC1 est un timer/compteur de 16 bits qui compte jusqu'à 65536 (0 à 65535),
• Le TC2 est un timer/compteur de 8 bits qui compte jusqu'à 256 (0 à 255).

Les timers/compteurs (TC) ont un rôle crucial dans le fonctionnement d'un microcontrôleur puisqu'ils permettent de compter le temps qui s'écoule.
Ces timers/compteurs fonctionnent à la vitesse de l'horloge de l'arduino uno.
Mais il peut être utile de ralentir la vitesse de comptage de ces timers/compteurs en fonction de l'application à réaliser.
Pour cela l'Atméga 328 est équipée d'un PRESCALER général et chacun des 3 timers/compteurs est également muni d'un prescaler individuel.

• Le prédiviseur de fréquence (PRESCALER) est commun aux trois TC et en série avec le prédiviseur de chaque TC.

Le PRESCALER
Le prescaler est situé après le signal d'horloge et permet de diviser ou pas la fréquence du signal d'horloge. 

Sur l'arduino uno le prescaler est commun aux trois timers/compteurs présent dans le microcontrôleur.

Le rapport de division du prescaler peut être de : 1, 2, 4, 8, 16, 32, 64, 128, 256.

Le prescaler est contrôlé par le registre : CLKPR.

C'est un registre 8 bits et pour commander le prescaler on utilise que 5 bits de ce registre.

registre clkpr
Registre CLKPR

Mise en œuvre du prescaler
Avant tout il faut activer le prescaler qui ne l'ai pas par défaut (non utilisé).

Pour cela il faut mettre le bit 7 à 1 et tous les autres à 0.

activation clkpr
Valeur du registre CLKPR pour activation du PRESCALER

Cela se fait par les instructions :
• CLKPR = 128; en décimal ou
• CLKPR = 0b10000000; en binaire ou
• CLKPR |= (1<<7); ou
• CLKPR = 0x80; en hexadécimal.
Rapport de division du prescaler
Une fois le prescaler activé il faut déterminer le rapport de division souhaité et configurer les bits 3, 2, 1, 0, correctement.

rapport de division du prescaler
Rapport de division du prescaler et configuration

bytes utilisés du registre prescaler
Bytes utilisés du registre CLKPR

Nota : L'utilisation du prescaler a une influence sur la vitesse de la liaison série avec le moniteur série du logiciel de l'arduino. La vitesse de transmission indiquée dans votre programme ne sera pas celle de réglage du moniteur série, déterminée par le rapport de division du prescaler.

MISE en ŒUVRE du PRESCALER
Pour illustrer ce que l'on vient de voir je vous propose un petit programme utilisant le prescaler.
Dans ce programme on utilisera des :
• Instructions de haut niveau pour l'allumage et l'extinction de la Led,
• Instructions de bas niveau pour la commande du prescaler.

Description du programme :



const byte led = 13; //Déclaration de la broche de la Led
  
void setup()  

pinMode (led, OUTPUT);//Broche 13 en Sortie 
 
CLKPR = 0b10000000; //Activation du prescaler 

//CLKPR = 0b00000000; //Division par 1 
CLKPR = 0b00000001; //Division par 2 
//CLKPR = 0b00000010; //Division par 4 
//CLKPR = 0b00000011; //Division par 8 
//CLKPR = 0b00000100; //Division par 16 
//CLKPR = 0b00000101; //Division par 32 
//CLKPR = 0b00000110; //Division par 64 
//CLKPR = 0b00000111; //Division par 128 
//CLKPR = 0b00001000; //Division par 256 
 

 
void loop()  

//Fréquence de Base du Clignotement de la Led : 50Hz  
digitalWrite (led, HIGH);//Broche 13 Etat Haut, allumage de la Led 
delay(10);//Temporisation de 10 ms 
 
digitalWrite (led, LOW);//Broche 13 Etat Bas, extinction de la Led 
delay(10);//Temporisation de 10 ms 
}

Programme de mise en œuvre du PRESCALER

1er partie du programme :
• Déclaration de la broche de connexion de la LED : Broche 13 (Utilisation de la Led présente sur l'arduino uno).
    • const byte led = 13;

2ième partie du programme :
void setup()
Déclaration de la broche 13 en Sortie :
    • pinMode (led, OUTPUT);

Activation du Prescaler :
CLKPR = 0b10000000;

Détermination du rapport de division du Prescaler :
• J'ai mis toutes les lignes de code pour utiliser le prescaler dans tous les rapports de division possibles,
• Il suffit de retirer les deux signes // devant la ligne à rendre active, et rajouter les signes // devant la ligne à rendre inactive,
• Dans l'exemple la ligne active impose un rapport de division par 2.

Nota : La ligne CLKPR = 0b10000000; ne doit pas être rendue inactive sans quoi le prescaler ne fonctionnerait pas.

3ième partie du programme
Clignotement de la led :
void loop ()
• Dans cette partie on utilise des lignes de code classiques :
DigitalWrite (led, HIGH) pour la mise à l'état haut de la broche 13,
• Une temporisation de 10 ms,
DigitalWrite (led, LOW) pour la mise à l'état bas de la broche 13,
• Une temporisation de 10 ms.

Cela permet d'obtenir une fréquence de 50 Hz. A ce stade le clignotement de la led n'est pas perceptible.
Au fur et à mesure de l'utilisation d'un rapport de division plus important du prescaler on voit la fréquence de clignotement de la led diminuer.

Nota : Dans l'exemple la division par 2 est active, ce qui ramène la fréquence à 25 Hz. Le clignotement de la led commence à devenir perceptible.