Recientemente comencé a programar un microcontrolador ATtiny85, que según la hoja de datos se ejecuta a 10Mhz dado el suministro de 3v3. Entonces, para experimentar, he creado un pequeño programa, como se muestra a continuación.
#include <avr/io.h>
int main(void) {
DDRB |= 8;
while(1) {
for(int i = 0; i < 1000; i++)
for(int j = 0; j < 1000; j++)
asm volatile("nop");
PORTB ^= 8;
}
}
Según la documentación, cada nop
tomará exactamente un ciclo de reloj para completarse. Ahora, he compilado este programa usando Atmel-Studio-7, y programé el diminuto usando un clon usbasp y avrdude. Como nota al margen, el puente de la fuente de alimentación en usbasp se establece en 3v3.
La programación funcionó bien, y comencé a mirar el LED parpadeante en el pin-2 y me pareció bastante lento. Cuando medí el retardo entre las luces LED que usan un cronómetro, podría medirlo en exactamente 5 segundos. Según mi código, cada vez, 1000000 nops
se ejecutan antes de cada conmutación. Por un simple cálculo, parece que mi pequeño podría ejecutar solo 200000 nops
por segundo, lo que significa que se está ejecutando en 200Khz
, lo que no tiene ningún sentido.
¿Cuáles podrían ser los factores que contribuyen a este error? ¿Cómo estimar la velocidad del reloj de un microcontrolador por su salida?