Escribí este programa de parpadeo para mi ATtiny13A y traté de medir la precisión con un Arduino Uno, pero el temporizador parece ser bastante inexacto.
En el ATtiny estoy ejecutando el reloj internal 128KHz
y estoy usando los temporizadores para hacer pin0
alto y bajo con una frecuencia de 1Hz
.
Aquí está el código ATtiny:
int main(void){
DDRB = 0;
TCCR0A = 0;
PORTB = 0;
DDRB |= (1 << DDB0); // pin0 output
TCCR0A |= (1 << WGM01); //CTC mode
TCCR0A |= (1 << COM0A0); //toggle OC0A on compare match
TCCR0B |= (1 << CS02) | (1 << CS00); //1024 prescalar
OCR0A = 124; //1Hz @ 128KHz internal clock
while(1){
}
return 0;
}
En el Arduino, estoy usando interrupciones para medir el tiempo entre cada señal alta / baja. Es un Uno estándar con un cristal externo de 16Mhz. Aquí está el código de Arduino:
unsigned long lastHigh = 0;
void setup() {
Serial.begin(9600);
const byte interruptPin = 2;
attachInterrupt(digitalPinToInterrupt(interruptPin), myISR, CHANGE);
}
void loop() {
}
void myISR(){
unsigned long temp = micros(); //store it ASAP to minimize delay
Serial.println(temp - lastHigh);
lastHigh = temp;
}
He tirado el pin 2
en el Arduino a tierra con una resistencia de 1K, y lo conecté al pin 0
de la ATtiny13A.
Esperaba leer un 1 perfecto entre cada parpadeo, pero aquí están mis lecturas (en microsegundos):
1063616 1062696 1063608 1062696 1063636 1062692 1063608 1062680 1063576 1062580 1063512 1062676 1063576 1062660 1063584 1062680 1063580 1062672 1063596 1062700 1063596 1062688 1063604 1062680 1063596 1062612 1063528 1062668 1063580 1062680 1063588 1062684
Como puede ver, el temporizador no solo está apagado durante ~ 60 milisegundos, sino que también tiembla mucho.
Leí en Internet que el reloj interno no es preciso pero no estoy seguro de que ~ 60 ms sea demasiado inexacto o no.
Además de estar fuera, los tiempos también son muy inquietos. Pasan de 106 2 580 a 106 3 680 microsegundos.
Soy bastante inexperto y estoy realmente curioso si este nivel de inexactitud se considera normal o no. Me pareció extraño porque 1000us inquietud hace que las funciones micros()
o _delay_us()
sean bastante inútiles.