Estoy usando un attiny2313a, y estoy teniendo muchos problemas para averiguar qué está pasando con el temporizador. Es muy simple, pero simplemente se niega a trabajar.
Tengo un reloj de 16Mhz. Cuando instalo un preescalador de 1024, el reloj TCNT1 aumentará en la frecuencia 16Mhz / 1024 = 0.0156MHz, lo que significa que obtengo un incremento cada 64uS.
Por lo tanto, por un segundo, debo esperar 1000000/64 = 15625
Esto está bien, porque TCNT1 es un contador de 16 bits.
Sin embargo, cuando configuro un programa de prueba, lo que recibo es un pitido muy largo en algún lugar más cercano a 15-16 segundos.
Cuando configuro el prescaler en 64, entonces 15624 me da exactamente un segundo.
En mi mente, mi cristal se está comportando como si esperara un cristal de 1Mhz. ¿Mi proceso de pensamiento es incorrecto, o hay algo más que podría estar equivocado?
Aquí está mi código de prueba, las partes importantes:
#include <avr/io.h>
#include <avr/interrupt.h>
#define Echo PINB0
#define Trig PINB1
#define Buzz PINB4
#define Led PIND4
int main(void)
{
DDRD = (1<<Led);
PORTD = 1<<Led;
DDRB = 1<<Trig | 1<<Buzz;
DDRB &= ~(1<<Echo);
TCCR1B = (1<< CS10) | (1<<CS12); // prescaler = 1024
while(1) {
beep();
wait(1);
}
}
void wait(int t){
TCNT1 = 0;
while(TCNT1 <= 15624*t){
}
}
void beep(){
TCNT1 = 0;
PORTB = 1<<Buzz;
while(TCNT1 <= 15624){
}
PORTB &= ~(1<<Buzz);
}