Я пытаюсь сделать часы на Atmega8. У меня есть 8Mhz кварц.Часы на Atmega8
Я использую timer0 прерывания тактовых TimeTicks:
/* Settings */
#define TMR_RELOAD 80 - 5 /* 8 kHz/80 = 100 Hz */
#define TMR_CNT_MAX 100 /* 1Hz internal counter */
/* internal variables */
static uint8_t tmr_cnt;
inline void TMR0_Init()
{
/* set clock source f_t0 = 8МHz/1024 = 8 kHz */
TCCR0 = _BV(CS00) | _BV(CS02);
TIMSK |= _BV(TOIE0); /* Enable TMR0 interrupt on overflow*/
}
ISR (TIMER0_OVF_vect)
{
if (tmr_cnt == 0)
Clock_Tick1s();
tmr_cnt++;
if (tmr_cnt >= TMR_CNT_MAX)
tmr_cnt = 0;
TCNT0 -= TMR_RELOAD;
}
Проблема заключается в том, что мои часы бегущий слишком быстро или слишком медленно.
Рассчитанное значение, которое я положил в регистр TCNT0, равно 80, но в этом случае часы работают слишком медленно. Когда я использую 80-4, часы также работают слишком медленно. Когда я использую 80-5, это слишком быстро.
Я не знаю, как это могло быть ???
UPDATE: Теперь настройки следующие, но проблема все еще существует.
/* Settings */
#define TMR_RELOAD 125 /* 31.25 kHz/125 = 250 Hz */
#define TMR_CNT_MAX 250 /* 1Hz internal counter */
inline void TMR0_Init()
{
/* set clock source f_t0 = 8МHz/256 = 31.25 kHz */
TCCR0 = _BV(CS02);
TIMSK |= _BV(TOIE0); /* Enable TMR0 interrupt on overflow*/
}
ISR (TIMER0_OVF_vect)
{
TCNT0 -= TMR_RELOAD;
if (tmr_cnt == 0)
Clock_Tick1s();
tmr_cnt++;
if (tmr_cnt >= TMR_CNT_MAX)
tmr_cnt = 0;
}
Сколько стоит «слишком быстро»? Сколько секунд в час, например? У вас есть осциллограф? –
Около 5 минут в 3 часа. Нет, у меня нет осциллографа. – vitperov