Différences entre versions de « Atmega328 timers »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
(Page créée avec « = Introduction = Lorsque l'on veut qu'un événement se produise à un intervalle régulier, il est tentant d'utiliser la fonction ''delay()'' mais cette dernière va just... »)
 
Ligne 57 : Ligne 57 :
 
* le timer 1 ne pourra compter qu'un temps de 4,096ms (62,5ns * 65536);
 
* le timer 1 ne pourra compter qu'un temps de 4,096ms (62,5ns * 65536);
  
Cela n'est pas très pratique surtout si l'on veut compter des valeurs plus grande que 4ms ! Pour pouvoir attendre un temps plus long il suffit de diviser la base de temps, c'est à dire, de ne pas incrémenter le timer à tous les ticks d'horloge mais tous les 8 ou 16 ticks par exemple. La modification de la base de temps de l'incrément est rendu possible grâce au prescaler.
+
Cela n'est pas très pratique surtout si l'on veut compter des valeurs plus grande que 4ms ! Pour pouvoir attendre plus longtemps il suffit de diviser la base de temps, c'est à dire, de ne pas incrémenter la valeur du timer à tous les ticks d'horloge. La modification de la base de temps de l'incrément est rendu possible grâce au prescaler qui permet un incrément tous les 8, 64, 128, 256 ou 1024 ticks.
 +
 
 +
La modification du prescaler sur le ''Timer0'' se fait grâce aux registres suivants:
 +
{|align="center" border="1"
 +
|-
 +
|valign="top" width="10%" align="center"|
 +
'''CS02'''
 +
|valign="top" width="10%" align="center"|
 +
'''CS01'''
 +
|valign="top" width="10%" align="center"|
 +
'''CS00'''
 +
|valign="top" width="60%" align="center"|
 +
'''Description'''
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top"|
 +
Pas de signal d'horloge (Timer et compteur stoppés)
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top"|
 +
Signal d'horloge brute (pas de pré-échelonnage)
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
0
 +
|valign="top""|
 +
Signal / 8
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
1
 +
|valign="top"|
 +
Signal / 64
 +
|-
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top"|
 +
Signal / 256
 +
|-
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top"|
 +
Signal / 1024
 +
|-
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
0
 +
|valign="top"|
 +
Horloge externe sur la broche T0 avec signal descendant (''falling edge'')
 +
|-
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" |
 +
Horloge externe sur la broche T0 avec signal montant (''rising edge'')
 +
|}
 +
La modification du prescaler sur le ''Timer1'' se fait grâce aux registres suivants:
 +
{|align="center" border="1"
 +
|-
 +
|valign="top" width="10%" align="center"|
 +
'''CS12'''
 +
|valign="top" width="10%" align="center"|
 +
'''CS11'''
 +
|valign="top" width="10%" align="center"|
 +
'''CS10'''
 +
|valign="top" width="60%" align="center"|
 +
'''Description'''
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top"|
 +
Pas de signal d'horloge (Timer et compteur stoppés)
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top"|
 +
Signal d'horloge brute (pas de pré-échelonnage)
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
0
 +
|valign="top""|
 +
Signal / 8
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
1
 +
|valign="top"|
 +
Signal / 64
 +
|-
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top"|
 +
Signal / 256
 +
|-
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top"|
 +
Signal / 1024
 +
|-
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
0
 +
|valign="top"|
 +
Horloge externe sur la broche T1 avec signal descendant (''falling edge'')
 +
|-
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" |
 +
Horloge externe sur la broche T1 avec signal montant (''rising edge'')
 +
|}
 +
La modification du prescaler sur le ''Timer2'' se fait grâce aux registres suivants:
 +
{|align="center" border="1"
 +
|-
 +
|valign="top" width="10%" align="center"|
 +
'''CS22'''
 +
|valign="top" width="10%" align="center"|
 +
'''CS21'''
 +
|valign="top" width="10%" align="center"|
 +
'''CS20'''
 +
|valign="top" width="60%" align="center"|
 +
'''Description'''
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top"|
 +
Pas de signal d'horloge (Timer et compteur stoppés)
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top"|
 +
Signal d'horloge brute (pas de pré-échelonnage)
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
0
 +
|valign="top""|
 +
Signal / 8
 +
|-
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
1
 +
|valign="top"|
 +
Signal / 32
 +
|-
 +
|valign="top" align="center"|
 +
1
 +
|valign="top" align="center"|
 +
0
 +
|valign="top" align="center"|
 +
0
 +
|valign="top"|
 +
Signal / 64
 +
|}
  
 
== Les interruptions ==
 
== Les interruptions ==

Version du 2 novembre 2018 à 01:20

Introduction

Lorsque l'on veut qu'un événement se produise à un intervalle régulier, il est tentant d'utiliser la fonction delay() mais cette dernière va juste mettre en pause le programme. Cela revient à gâcher la puissance de calcul de l'ATmega328 qui passe la plupart de son temps à ne rien faire !

Fonctionnement

Les différents timers

Il existe 3 timers dans l'ATmega328:

Nom

Taille

Utilisation

Interruptions

Timer0

8 bits

  • delay(), millis(), micros()
  • analogWrite() sur les broches 5 et 6 (PWM)
  • Compare Match
  • Overflow

Timer1

16 bits

  • Servo
  • analogWrite() sur les broches 9 et 10 (PWM)
  • Compare Match
  • Overflow
  • Input Capture

Timer2

8 bits

  • Tone()
  • analogWrite() sur les broches 3 et 11 (PWM)
  • Compare Match
  • Overflow

Chaque timer s'incrémente à chaque fois que l'on à une impulsion du quartz. Sur un ATmega328, le quartz est cadencé à 16mHz, ce qui nous fait un incrément toutes les 62,5ns (1/16.000.000).

Faites attention, en modifiant un timer, à ne pas utiliser des librairies ou sortie PWM dépendantes du même timer.

Le prescaler

Si on fait le calcul en l'état:

  • les timers 0 et 2 ne pourrons compter qu'un temps de 16µs (62,5ns * 256);
  • le timer 1 ne pourra compter qu'un temps de 4,096ms (62,5ns * 65536);

Cela n'est pas très pratique surtout si l'on veut compter des valeurs plus grande que 4ms ! Pour pouvoir attendre plus longtemps il suffit de diviser la base de temps, c'est à dire, de ne pas incrémenter la valeur du timer à tous les ticks d'horloge. La modification de la base de temps de l'incrément est rendu possible grâce au prescaler qui permet un incrément tous les 8, 64, 128, 256 ou 1024 ticks.

La modification du prescaler sur le Timer0 se fait grâce aux registres suivants:

CS02

CS01

CS00

Description

0

0

0

Pas de signal d'horloge (Timer et compteur stoppés)

0

0

1

Signal d'horloge brute (pas de pré-échelonnage)

0

1

0

Signal / 8

0

1

1

Signal / 64

1

0

0

Signal / 256

1

0

1

Signal / 1024

1

1

0

Horloge externe sur la broche T0 avec signal descendant (falling edge)

1

1

1

Horloge externe sur la broche T0 avec signal montant (rising edge)

La modification du prescaler sur le Timer1 se fait grâce aux registres suivants:

CS12

CS11

CS10

Description

0

0

0

Pas de signal d'horloge (Timer et compteur stoppés)

0

0

1

Signal d'horloge brute (pas de pré-échelonnage)

0

1

0

Signal / 8

0

1

1

Signal / 64

1

0

0

Signal / 256

1

0

1

Signal / 1024

1

1

0

Horloge externe sur la broche T1 avec signal descendant (falling edge)

1

1

1

Horloge externe sur la broche T1 avec signal montant (rising edge)

La modification du prescaler sur le Timer2 se fait grâce aux registres suivants:

CS22

CS21

CS20

Description

0

0

0

Pas de signal d'horloge (Timer et compteur stoppés)

0

0

1

Signal d'horloge brute (pas de pré-échelonnage)

0

1

0

Signal / 8

0

1

1

Signal / 32

1

0

0

Signal / 64

Les interruptions