# Arduino UNO R3 Frequence d'horloge et préscalaire

**URL:** <https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392>\
**Category:** Français\
**Created:** [February 6, 2026, 10:05am UTC](https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392 "2026-02-06T10:05:04Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![kazhdu](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/kazhdu/32/1246850_2.png) [@kazhdu](https://forum.arduino.cc/u/kazhdu)\
**Post date:** [February 6, 2026, 10:05am UTC](https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392/1 "2026-02-06T10:05:05Z")

</div>

Miaou,

Sur une carte Arduino UNO R3, il y a un quartz 16MHz.  
Ai-je raison de penser qu'il est utilisé pour cadencer le microcontrôleur à cette fréquence ?

Le datasheet du microcontrôleur mentionne de nombreuses abrv. pour l'horloge, j'ai du mal à m'y retrouver...

- CPU Clock – clkCPU correspond-il à ces 16MHz ?

Vient ensuite le préscaler qu'on peut configurer pour les timer via les registres :  
Si je code :

```arduino
TCCR0B |= 0b00000101;

```

Je m'attends à avoir un diviseur de 1024 donc 15625kHz (soit 64µs entre 2 "tick" du timer0).  
Est-ce correct ?  
A vous lire,

Le chat.

---

<div class="post-metadata">

**Author:** ![J-M-L](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/j-m-l/32/766245_2.png) [@J-M-L](https://forum.arduino.cc/u/J-M-L)\
**Post date:** [February 6, 2026, 10:14am UTC](https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392/2 "2026-02-06T10:14:31Z")

</div>

oui c'est cette horloge à 16Mhz est celui qui pilote le MCU.

> [@kazhdu](#):
>
> Si je code :
> 
> ```arduino
> TCCR0B |= 0b00000101;
> 
> ```

votre ligne de code `TCCR0B |= 0b00000101;` ne force pas à zéro le bit 1 donc s'il était à 1 avant vous pourriez créer un prescaler inattendu.

mais si vous avez bien 101 sur les 3 bits alors oui, cela vous donne 1024/16000000 = 64µs

Notez aussi que sur l’Arduino Uno, l’horloge principale de l’ATmega328P est assurée par un résonateur céramique de 16 MHz, choisi pour son coût réduit tout en offrant une précision suffisante pour la plupart des applications. Sa fréquence nominale de 16 MHz est donc théorique et peut varier légèrement en fonction de la température, de la tension d’alimentation et des tolérances de fabrication du résonateur, contrairement à un quartz qui offre une stabilité beaucoup plus élevée.

---

<div class="post-metadata">

**Author:** ![kazhdu](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/kazhdu/32/1246850_2.png) [@kazhdu](https://forum.arduino.cc/u/kazhdu)\
**Post date:** [February 6, 2026, 10:30am UTC](https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392/3 "2026-02-06T10:30:04Z")

</div>

Merci pour ce retour rapide.  
Bien noté pour la nuance quartz / oscillateur.

Concernant TCCR0B, il est mentionné dans le datasheet que sa valeur initiale est 0.  
C'est dans le `setup()` que je configure ce registre, donc le bit 1 devrait être à 0.  
Mais il est je suppose plus sûr de coder :

```arduino
TCCR0B |= (1<<CS02 & ~(1<<CS01) | 1<<CS00);

```

---

<div class="post-metadata">

**Author:** ![J-M-L](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/j-m-l/32/766245_2.png) [@J-M-L](https://forum.arduino.cc/u/J-M-L)\
**Post date:** [February 6, 2026, 11:11am UTC](https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392/4 "2026-02-06T11:11:37Z")

</div>

> [@kazhdu](#):
>
> C'est dans le `setup()` que je configure ce registre, donc le bit 1 devrait être à 0.

oui en théorie mais le setup est appelé après que le fichier main() ait appelé init() qui fait tout un tas de configurations qui ne sont pas super documentées. En pratique je pense que vous avez raison et que ce sera OK, mais vaut mieux être prudent.

> [@kazhdu](#):
>
> ```arduino
> TCCR0B |= (1<<CS02 & ~(1<<CS01) | 1<<CS00);
> 
> ```

Non tant que vous faites un `|=` vous ne forcerez pas un 0. un OU ne peut mettre que des 1, jamais un 0.

soit vous écrivez directement le registre complet

```arduino
TCCR0B = (TCCR0B & 0b11111000) | 0b101;

```

soit vous faites en deux fois avec un &= et un |=

```arduino
TCCR0B &= 0b11111000; // on ne garde que ce qu'il y a dans les bits de poids forts
TCCR0B |= 0b101; // on met à 1 dans les 3 bits de poids faible ceux que l'on veut.

```

---

<div class="post-metadata">

**Author:** ![kazhdu](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/kazhdu/32/1246850_2.png) [@kazhdu](https://forum.arduino.cc/u/kazhdu)\
**Post date:** [February 6, 2026, 1:03pm UTC](https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392/5 "2026-02-06T13:03:14Z")

</div>

Ah oui, effectivement ; merci pour le correctif. 🙂

---

<div class="post-metadata">

**Author:** ![kazhdu](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/kazhdu/32/1246850_2.png) [@kazhdu](https://forum.arduino.cc/u/kazhdu)\
**Post date:** [February 6, 2026, 1:37pm UTC](https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392/6 "2026-02-06T13:37:06Z")

</div>

Je cherche à effectuer une routine d'interruption sur un overflow du timer0 :

```arduino
ISR(TIMER0_OVF_vect)
{
  // fait des trucs...
}

```

A la compilation j'ai ça comme erreur :

_wiring.c.o (symbol from plugin): In function `__vector_16':* *(.text+0x0): multiple definition of `\_\_vector\_16'_  
_C:\Users\Utilisateur\AppData\Local\arduino\sketches\AA0468DE9D89FDE7BA4C907B7893278D\sketch\essai.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here_  
_collect2.exe: error: ld returned 1 exit status_  
_exit status 1_

_Compilation error: exit status 1_

Il semble avoir une double def du vecteur... Comprends pas 🤔, une idée ?

---

<div class="post-metadata">

**Author:** ![J-M-L](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/j-m-l/32/766245_2.png) [@J-M-L](https://forum.arduino.cc/u/J-M-L)\
**Post date:** [February 6, 2026, 2:35pm UTC](https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392/7 "2026-02-06T14:35:59Z")

</div>

Le vecteur TIMER0\_OVF\_vect est déjà défini dans le core Arduino ➜ Il est utilisé pour maintenir millis() via une ISR interne sur l’overflow du timer0.

Vous ne pouvez pas l'utiliser si vous prenez le main() arduino.

Vous avez 3 timers pour jouer ➜ Le timer0 est un timer 8 bits, le timer1 est un timer 16 bits et le timer2 est un timer 8 bits.

par exemple pour avoir un tick environ toutes les secondes avec timer2 dans la loop

```arduino
constexpr uint32_t timer2Prescaler = 64;
constexpr uint32_t deltaT_ms = 1;
constexpr uint8_t seuilOCR = (F_CPU / timer2Prescaler) * deltaT_ms / 1000UL - 1;

volatile unsigned long compteur = 0;
ISR(TIMER2_COMPA_vect) {
  compteur++;
}

void setup() {
  noInterrupts(); // désactive les interruptions globales
  TCCR2A = 1 << WGM21; // timer2 en mode CTC
  TCCR2B = 1 << CS22; // préscaler = 64
  OCR2A = seuilOCR; // valeur calculée pour un pas de temps en millisecondes
  TIMSK2 = 1 << OCIE2A; // autorise l'interruption sur comparaison A du timer2
  interrupts(); // réactive les interruptions globales
  Serial.begin(115200);
  Serial.println("\n-------------------------");
  Serial.print("F_CPU = "); Serial.print(F_CPU); Serial.println(" Hz");
  Serial.print("∆t = "); Serial.print(deltaT_ms); Serial.println(" ms");
  Serial.print("Seuil = "); Serial.println(seuilOCR);
  Serial.println("-------------------------");
}

void loop() {
  bool tick = false;
  // section critique
  noInterrupts(); // désactive les interruptions globales
  if (tick = (compteur >= 1000)) compteur = 0;
  interrupts(); // réactive les interruptions globales
  if (tick) {
    Serial.println("tick");
  }
}

```

à tester ici

> **[TIMER2 ISR - Wokwi ESP32, STM32, Arduino Simulator](https://wokwi.com/projects/455218158471033857)**
>
> Run IoT and embedded projects in your browser: ESP32, STM32, Arduino, Pi Pico, and more. No installation required!

---

<div class="post-metadata">

**Author:** ![kazhdu](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/kazhdu/32/1246850_2.png) [@kazhdu](https://forum.arduino.cc/u/kazhdu)\
**Post date:** [February 6, 2026, 2:53pm UTC](https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392/8 "2026-02-06T14:53:13Z")

</div>

Ha ha, c'était donc ça, je m'en suis douté après coup... 😄

Effectivement, en passant sur le Timer2, tout rentre dans l'ordre (faut juste redéfinir et configurer les registres du Timer2).  
Ok, je laisse le Timer0 à millis() et ses comparses delay() et micros()... 🫡

Merci pour ces infos utiles. 🙂  
Le chat.

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [August 5, 2026, 2:54pm UTC](https://forum.arduino.cc/t/arduino-uno-r3-frequence-dhorloge-et-prescalaire/1429392/9 "2026-08-05T14:54:02Z")

</div>

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
