← Índice del curso

Microcontroladores · Tema 12

El reloj del sistema

Todo lo que hace un microcontrolador ocurre al ritmo de una señal cuadrada. De ella dependen la velocidad del programa, la exactitud de cada temporizador, la velocidad de la comunicación serie y, en buena medida, el consumo de energía. Elegirla bien es una decisión de diseño, no un detalle.

01 · Punto de partida

El pulso de todo el sistema

En el curso de circuitos secuenciales viste que un reloj coordina cuándo cambian los flip-flops. En un microcontrolador ese mismo reloj marca el ritmo de la CPU: una instrucción por ciclo, más o menos. Y los periféricos lo usan de dos maneras: algunos cuentan sus ciclos directamente (el temporizador del tema 11), otros lo dividen para obtener su propia velocidad (el ADC, la UART).

Por eso el reloj no es un parámetro más: si cambia, cambian a la vez la velocidad del programa, los retardos, los períodos de los temporizadores y las velocidades de comunicación. Y si es impreciso, todo lo que dependa del tiempo hereda su error.

Retomamos lo visto en el tema 4 (el resonador de la placa Uno y los pines XTAL1 y XTAL2), el tema 5 (F_CPU) y el tema 11 (cálculo de períodos).

02 · El panorama

Las fuentes de reloj

El ATmega328P puede tomar su reloj de varios orígenes, que se eligen con los fuses (se estudian en la sección 5):

Fuentes de reloj del ATmega328P y sus características típicas.
FuentePrecisión típicaComponentes externosCuándo se usa
Oscilador RC interno de 8 MHz±10 % de fábrica; ±1 % calibradoNingunoPrototipos, aplicaciones sin exigencia de tiempo, ahorro de espacio
Oscilador RC interno de 128 kHzBaja y variableNingunoConsumo mínimo; es el que usa el vigilante (watchdog)
Resonador cerámicoAlrededor de ±0,5 %Resonador (a veces con capacitores integrados)Placas económicas como la Uno
Cristal de cuarzo±20 a ±50 ppmCristal y dos capacitoresComunicación serie, temporización, relojes
Cristal de 32,768 kHz±20 ppm típicoCristal «de reloj de pulsera»Contar segundos con bajo consumo
Reloj externoLa del generadorUn oscilador completoCompartir un reloj entre chips o usar un TCXO

La precisión se expresa en partes por millón (ppm). 1 ppm es una diferencia de una millonésima, es decir, 0,0001 %. 10 000 ppm equivalen a 1 %. Cuanto menor sea el valor, más exacto el reloj. Es el parámetro que decide cuánto se desvía un reloj de tiempo real: 20 ppm son 20 µs de error por cada segundo.

03 · Sin componentes externos

El oscilador RC interno

Un oscilador RC genera su frecuencia con un circuito de carga y descarga de un capacitor a través de una resistencia, integrado en el chip. Es la fuente por defecto de un ATmega328P nuevo: 8 MHz internos, divididos por 8 al arrancar, es decir, 1 MHz. Es la razón de que un chip virgen corra a una octava parte de lo que esperás.

Sus ventajas son prácticas: no ocupa pines ni espacio en la placa, arranca casi al instante y cuesta cero. Su desventaja es la precisión: la frecuencia depende de la temperatura y de la tensión de alimentación, y varía de un chip a otro. De fábrica se garantiza una tolerancia de alrededor de ±10 %, y mediante el registro OSCCAL se puede calibrar hasta aproximadamente ±1 % a una temperatura y tensión dadas.

Con ±10 %, un retardo de 1 s puede durar entre 0,9 y 1,1 s, y una UART a 9600 baudios no funciona de forma confiable. Con ±1 % sirve para muchas aplicaciones, pero no para un reloj de pared. Si el requisito de tiempo es relajado, el RC interno es perfectamente válido.

04 · Precisión de relojería

Cristal y resonador cerámico

Un cristal de cuarzo vibra con una frecuencia muy estable gracias a sus propiedades piezoeléctricas. Se conecta entre los pines XTAL1 y XTAL2, que son la entrada y la salida de un inversor interno. El inversor amplifica la vibración y la realimenta: es un oscilador de Pierce. Para que oscile correctamente necesita dos capacitores de carga, uno de cada pata a masa.

C1 = C2 = 2 · (CL − Cparásita)

donde CL es la capacitancia de carga que indica el fabricante del cristal (típicamente entre 12 y 20 pF) y Cparásita es la capacitancia de las pistas y de los pines del chip (2 a 5 pF aproximadamente). El cristal «ve» ambos capacitores en serie, más la parásita. Un cristal de CL = 18 pF con 4 pF parásitos pide 28 pF: se usa el valor estándar más cercano, 27 pF. Una carga incorrecta desplaza la frecuencia unas decenas de ppm o impide el arranque.

Un resonador cerámico funciona igual, pero con un material cerámico en lugar de cuarzo: es más barato y a veces trae los capacitores integrados (tres patas), pero su precisión es de decenas de veces peor, alrededor de ±0,5 %. Alcanza para comunicación serie y para casi todo lo que no mida el tiempo con exactitud.

Los cristales tardan un tiempo en arrancar (de microsegundos a milisegundos) hasta que la oscilación se estabiliza. El chip espera un tiempo configurable con los fuses antes de empezar a ejecutar, y la espera es mayor al despertar de un sueño profundo. Tenerlo presente evita fallos de arranque.

05 · Elegir la fuente

Fuses y reloj externo

La fuente de reloj no se elige desde el programa, sino mediante los fuses: bits de configuración que se graban con el programador, fuera del programa. Los de reloj están en el byte bajo de fuses:

Byte bajo de fuses del ATmega328P (en los fuses, 0 significa «programado»).
Bit76543 a 0
NombreCKDIV8CKOUTSUT1SUT0CKSEL3:0
FunciónDividir el reloj por 8 al arrancarSacar el reloj por el pin CLKO (PB0)Tiempo de arranqueFuente de reloj
Selección de la fuente de reloj con CKSEL3:0, resumida de la hoja de datos.
CKSEL3:0Fuente
1111 a 1000Cristal u oscilador de bajo consumo (la combinación depende del rango de frecuencia; para 8 a 16 MHz se usan 111x)
0111, 0110Cristal de oscilación completa
0101, 0100Cristal de baja frecuencia (32,768 kHz)
0011RC interno de 128 kHz
0010RC interno calibrado de 8 MHz (valor de fábrica)
0000Reloj externo en XTAL1

Dos valores del byte bajo conviene reconocer: 0x62 en un chip nuevo (RC interno, con CKDIV8 programado, es decir, 1 MHz) y 0xFF en una placa Uno (cristal o resonador de 8 a 16 MHz y sin división por 8). El pin CLKO (activando CKOUT) permite medir el reloj del sistema con un osciloscopio o un frecuencímetro, la manera más directa de comprobar la frecuencia real.

El riesgo de equivocarse

Si grabás fuses que seleccionan un cristal externo en un chip que no lo tiene, el microcontrolador queda sin reloj y deja de responder, incluso al programador ISP, que necesita reloj para funcionar. Es el caso de un chip aparentemente «bloqueado». La salida es inyectar una señal de reloj externa en XTAL1 (por ejemplo, desde otra placa) para poder reprogramar los fuses. Por eso se anotan los valores antes de tocarlos.

El reloj externo (CKSEL = 0000) sirve para compartir una misma señal entre varios chips o para usar un oscilador de alta precisión, como un TCXO (oscilador de cristal compensado en temperatura), con 1 a 2 ppm de error.

06 · Cambiar la velocidad en marcha

El prescaler del sistema

Además de la fuente, el chip tiene un divisor del reloj del sistema, el prescaler controlado por el registro CLKPR (no confundir con los prescalers de los temporizadores). Divide el reloj por 1, 2, 4, 8, 16, 32, 64, 128 o 256. Sirve para ahorrar energía: una CPU más lenta consume menos. El valor inicial lo define el fuse CKDIV8.

Como un cambio accidental del reloj sería peligroso, CLKPR exige un protocolo de dos escrituras:

  1. Escribir un 1 en el bit CLKPCE (bit 7) y 0 en el resto de los bits del registro.
  2. Dentro de los cuatro ciclos siguientes, escribir el nuevo valor de CLKPS3:0 con CLKPCE en 0.

Durante la secuencia hay que deshabilitar las interrupciones. La biblioteca avr-libc lo resuelve con clock_prescale_set(clock_div_8), de avr/power.h.

El microcontrolador tiene en realidad varios relojes derivados de la misma fuente: clkCPU (la CPU), clkI/O (periféricos), clkFLASH, clkADC (con su propio divisor) y clkASY (el temporizador asíncrono). Los modos de bajo consumo apagan algunos de ellos selectivamente, como veremos en el bloque de energía.

07 · Los límites

Tensión, velocidad y consumo

Un chip no puede correr a cualquier velocidad con cualquier tensión: los transistores conmutan más despacio cuando la alimentación baja. La hoja de datos define tres grados de velocidad:

Frecuencia máxima según la tensión de alimentación (ATmega328P).
AlimentaciónFrecuencia máxima
1,8 V a 5,5 V4 MHz
2,7 V a 5,5 V10 MHz
4,5 V a 5,5 V20 MHz

La consecuencia es directa: un ATmega328P a 16 MHz necesita 5 V. Alimentado con 3,3 V solo está especificado hasta 10 MHz; por eso las placas de 3,3 V usan cristales de 8 MHz. Pasarse del límite no siempre falla de inmediato, pero el comportamiento es errático y depende de la temperatura.

El consumo dinámico de la lógica CMOS es proporcional a la frecuencia y al cuadrado de la tensión: P ≈ C · V² · f. Bajar a la mitad el reloj reduce aproximadamente a la mitad la corriente de la CPU activa. La regla de diseño es correr a la menor velocidad que cumpla los requisitos de tiempo. Una aplicación que lee un sensor cada segundo no necesita 16 MHz.

08 · Más allá del ATmega328P

PLL: multiplicar el reloj

Los cristales de alta frecuencia son caros, grandes y generan interferencias. Los microcontroladores modernos parten de un cristal chico (8, 12, 16 o 40 MHz) y lo multiplican internamente con un PLL (phase-locked loop, lazo de enganche de fase). El ATmega328P no tiene PLL; otros chips sí.

Un PLL tiene un comparador de fase, un oscilador controlado por tensión (VCO) y un divisor en la realimentación. El comparador ajusta el VCO hasta que la señal dividida coincide en fase con el cristal. Si el divisor es N, el VCO termina oscilando a N veces la frecuencia de referencia:

f_salida = f_cristal · N / M
Algunos ejemplos de uso de PLL (valores típicos de las configuraciones habituales).
ChipCristalReloj de la CPU
STM32F103 («Blue Pill»)8 MHz72 MHz (× 9)
RP2040 (Raspberry Pi Pico)12 MHz125 MHz por defecto
ESP3240 MHz80, 160 o 240 MHz
ATmega32U416 MHzEl PLL genera 48 MHz para el USB

Programar un chip con PLL agrega un paso: hay que configurar las fuentes, esperar a que el PLL se enganche y recién entonces cambiar la CPU al reloj multiplicado, y los periféricos pasan a depender de varios dominios de reloj. Es parte de la complejidad adicional de los 32 bits que mencionamos en el tema 2. El concepto es el mismo en todos: una referencia estable multiplicada y repartida.

09 · Analogía con programación

Cuánto se equivoca un reloj

Este programa calcula la deriva diaria de cada fuente de reloj y comprueba si la comunicación serie sobrevive a ese error. Reproduce el cálculo de la hoja de datos de la UART: el divisor UBRR0 es un entero, así que la velocidad real nunca coincide exactamente con la pedida, y a ese error se suma la tolerancia del reloj.

Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.

F_CPU = 16_000_000
SEGUNDOS_POR_DIA = 86_400

# Precisión típica de cada fuente de reloj, en partes por millón (ppm).
FUENTES = {
    "RC interno de fábrica (±10 %)": 100_000,
    "RC interno calibrado (±1 %)": 10_000,
    "Resonador cerámico (±0,5 %)": 5_000,
    "Cristal de cuarzo (±50 ppm)": 50,
    "Cristal de cuarzo (±20 ppm)": 20,
}


def uart(f_cpu, baudios, u2x=False):
    """Divisor UBRR0 y error de la velocidad real, como en la hoja de datos."""
    k = 8 if u2x else 16
    ubrr = int(f_cpu / (k * baudios) + 0.5) - 1
    real = f_cpu / (k * (ubrr + 1))
    return ubrr, (real - baudios) / baudios * 100


ubrr, error_divisor = uart(F_CPU, 9600)
print(f"9600 baudios a 16 MHz: UBRR0 = {ubrr}, error del divisor = {error_divisor:+.2f} %")
print()

for nombre, ppm in FUENTES.items():
    deriva_dia = ppm * SEGUNDOS_POR_DIA / 1e6          # segundos que se adelanta o atrasa por día
    error_total = abs(error_divisor) + ppm / 1e4        # divisor + tolerancia del reloj, en %
    estado = "confiable" if error_total <= 2 else "FALLA"
    print(f"{nombre:<32} deriva ±{deriva_dia:>8.1f} s/día   UART: {error_total:5.2f} % -> {estado}")

print()
for u2x in (False, True):
    ubrr, error = uart(F_CPU, 115200, u2x)
    print(f"115200 baudios, U2X={int(u2x)}: UBRR0 = {ubrr:<2}  error = {error:+.2f} %")

Resultado: a 9600 baudios el divisor casi no aporta error (+0,16 %), y solo el RC de fábrica (±10 %) hace fallar la UART. A 115 200 baudios el divisor ya aporta −3,55 % (o +2,12 % con la velocidad doble), antes de sumar la tolerancia del reloj. Probá agregar un cristal de ±2 ppm o cambiar F_CPU a 8 000 000.

El criterio del 2 % es una regla práctica: en un enlace asíncrono 8N1 el receptor muestrea cada bit hacia su mitad, y el error acumulado a lo largo de diez bits tiene que quedar por debajo de medio bit para decodificar bien. Entre dos extremos que también tienen error, el margen se reparte. El modelo ignora el ruido y la forma de los flancos.

10 · Exploración interactiva

Precisión, prescaler y cristal

Tres herramientas cubren las decisiones del tema: cuánto se desvía una fuente de reloj y si sirve para la UART, qué frecuencia resulta de aplicar el prescaler (y si es segura con tu tensión), y qué capacitores necesita un cristal.

Banco de relojes

1. Deriva del reloj y comunicación serie

Deriva en un día—
Deriva en 30 días—
Divisor de la UART—

2. Prescaler del sistema y límite de tensión

Reloj de la CPU—
Velocidad—

3. Capacitores de carga de un cristal

C1 = C2 calculado—
Valor comercial—

Las precisiones son valores típicos orientativos: la hoja de datos de cada componente es la referencia. El límite de velocidad de la segunda herramienta aplica los tres grados de la sección 7 por tramos, sin interpolar entre ellos, de modo que es conservador.

Recorrido guiado

  1. Con «Cristal de ±50 ppm», 16 MHz y 9600 baudios, la deriva es de unos 4,3 s por día y la UART es confiable. Pasá a «RC interno de fábrica»: la deriva es de 2,4 h por día y la UART falla.
  2. Con el cristal de ±20 ppm elegí 115 200 baudios. Sin la velocidad doble el error del divisor es de −3,55 %: falla aun con un reloj perfecto. Con ella baja a +2,12 %: queda en el límite.
  3. En el prescaler, dejá 16 MHz y ÷1 con 5 V (seguro). Bajá la alimentación a 3,3 V: aparece la advertencia del límite de 10 MHz.
  4. Elegí 8 MHz y ÷8 (la configuración de un chip virgen): el reloj es de 1 MHz y 1000 ns por ciclo. Es el escenario del tema 5, donde el parpadeo salía 16 veces más lento.
  5. En la tercera herramienta, probá CL = 12 pF con 3 pF parásitos (18 pF por capacitor) y CL = 20 pF con 5 pF (30 pF, que se aproxima con 27 pF).
Desafío: un reloj de pared con un cristal común

Un reloj construido con un cristal de ±20 ppm se adelanta o atrasa hasta 1,7 s por día, es decir, unos 10,5 minutos por año. Para un reloj doméstico alcanza; para uno que deba sincronizar eventos entre varios aparatos, no. Los relojes de tiempo real usan cristales de 32,768 kHz, calibración en fábrica y a veces compensación por temperatura (como los TCXO, de 2 ppm o menos).

11 · Método de trabajo

Cómo elegir el reloj

  1. Anotá los requisitos de tiempo: precisión de la temporización, velocidad de comunicación, tiempo de respuesta máximo.
  2. Calculá la tolerancia necesaria en ppm o en porcentaje. Si es mayor que el 2 % y no hay UART, el RC interno calibrado puede bastar.
  3. Elegí la velocidad mínima que cumple el rendimiento y que corresponde a un valor cómodo para los temporizadores y los baudios (16 MHz y 8 MHz son múltiplos prácticos).
  4. Comprobá la tensión: la frecuencia debe estar dentro de la zona segura para tu alimentación.
  5. Seleccioná la fuente y, si es un cristal, calculá los capacitores y respetá el trazado corto de las pistas hacia XTAL1 y XTAL2.
  6. Verificá midiendo: sacá el reloj por CLKO o generá una señal de frecuencia conocida en un pin y medila con un frecuencímetro u osciloscopio.

Una prueba simple de cordura: hacé parpadear un LED con un retardo conocido y cronometrá 100 ciclos. Si esperabas 100 s y marca 1600 s, tenés un error de reloj o de F_CPU, no del programa.

12 · Comprensión

Confusiones frecuentes

«Un reloj de 16 MHz es siempre más rápido que uno de 8 MHz»

Ejecuta el doble de instrucciones por segundo, pero consume más y exige más tensión. Muchas tareas pasan la mayor parte del tiempo esperando; para ellas la frecuencia de reloj no cambia el resultado.

«El oscilador interno es igual de bueno que un cristal, y no ocupa espacio»

Es mucho menos preciso (±10 % frente a ±50 ppm, 2000 veces peor) y varía con la temperatura y la tensión. Es una gran opción cuando el tiempo no importa.

«Cambiar F_CPU en el código cambia la frecuencia del chip»

No: solo cambia el cálculo de los retardos y las constantes. La frecuencia real la determinan los fuses, el cristal y el prescaler. Las dos tienen que coincidir.

«Los fuses se pueden cambiar desde el programa»

No: se graban con el programador. Lo que el programa puede cambiar en marcha es el prescaler (CLKPR), no la fuente.

«Un cristal de 16 MHz funciona con cualquier capacitor»

Los capacitores de carga determinan si el cristal oscila y a qué frecuencia exacta. Un valor muy distinto del indicado puede impedir el arranque o desplazar la frecuencia varias decenas de ppm.

13 · Práctica guiada

Predecí antes de comprobar

1. Deriva de un cristal

Un cristal tiene una tolerancia de ±20 ppm. ¿Cuánto se desvía en un día y en un año?

Ver solución

20 × 10⁻⁶ × 86 400 s = 1,73 s por día. En un año (365 días): 631 s, unos 10,5 minutos.

2. Capacitores de carga

Un cristal pide CL = 12 pF y la placa tiene unos 3 pF parásitos. ¿Qué capacitores necesita?

Ver solución

C = 2 × (12 − 3) = 18 pF en cada pata. Es un valor estándar.

3. Tensión y velocidad

Una placa con ATmega328P a 16 MHz se alimenta con una batería que da 3,3 V. ¿Qué problema aparece y cómo se resuelve?

Ver solución razonada

A 3,3 V el chip está especificado hasta 10 MHz: 16 MHz excede el límite y puede funcionar de forma errática. Se resuelve alimentando a 5 V, o bajando el reloj a 8 MHz (cristal de 8 MHz o RC interno de 8 MHz).

4. Un retardo de 16 segundos

Compilás con F_CPU 16000000UL, usás _delay_ms(1000) y cargás el programa en un chip nuevo, con los fuses de fábrica. ¿Cuánto dura realmente el retardo?

Ver solución

El chip nuevo corre a 1 MHz (8 MHz ÷ 8). El retardo se calculó para 16 000 000 de ciclos, que a 1 MHz tardan 16 s.

5. UART con el oscilador de fábrica

Un proyecto con RC interno sin calibrar quiere hablar a 9600 baudios con una computadora. ¿Qué esperás que ocurra y qué opciones hay?

Ver solución razonada

El error del RC (hasta ±10 %) supera la tolerancia de la UART (alrededor del 2 %): se reciben caracteres corruptos o ninguno. Opciones: calibrar el oscilador con OSCCAL a la temperatura de trabajo, usar un resonador o un cristal externo, o ajustar el divisor midiendo la frecuencia real.

14 · Síntesis

Ideas para recordar

  • El reloj marca el ritmo de la CPU y de los periféricos: su frecuencia y su precisión afectan a todo lo que dependa del tiempo.
  • La precisión se mide en ppm: 10 000 ppm son 1 %; 20 ppm son 1,7 s por día.
  • El RC interno (8 MHz, ±10 % de fábrica) es práctico pero impreciso; el cristal (±20 a ±50 ppm) es el estándar para temporización y UART.
  • El cristal necesita dos capacitores: C = 2 · (CL − Cparásita).
  • La fuente se elige con los fuses (CKSEL, SUT, CKDIV8, CKOUT); un chip nuevo corre a 1 MHz.
  • El prescaler CLKPR divide el reloj en marcha y exige una secuencia de dos escrituras; F_CPU debe reflejar la frecuencia real.
  • La frecuencia máxima depende de la tensión: 16 MHz exige 5 V. Un PLL multiplica un cristal pequeño, como hacen los chips de 32 bits.

¿Listo para el tema 13?

Antes de avanzar, calculá la deriva diaria de un cristal de ±50 ppm, los capacitores de uno de CL = 15 pF y explicá por qué un chip nuevo corre a 1 MHz. Si podés justificar las tres respuestas, ya entendés de dónde sale el tiempo en un microcontrolador.

En el próximo tema vamos a ver el reset, el arranque y la protección: qué ocurre cuando se enciende el chip, el detector de caída de tensión y el vigilante (watchdog).