Прошу помощи и совета.
AtTiny24, 8MHz, тактирование от внутреннего генератора.
Делаю таймер TIM0 с обработкой переполнения. Цель - отсчёт интервалов 1 мсек.
Размышляю так: 8000000 тиков в секунду, 8000 тиков в мсек. Значит, если поставить делитель на 64, получим 125 тиков таймера. Смещаем стартовое значение таймера на 131, чтобы таймер сделал до переполнения именно 125 тиков.
Ставлю делитель на 64. При этом получаю контрольный интервал примерно в 8 раз позже ожидаемого значения.
Ставлю делитель на 8 - и (грубо считая секундомером) получаю правильное срабатывание (оцениваю интервал 20 тыс мсек).
Что-то делаю не так? Влияет ли фьюз CKDIV8 на первоначальную частоту таймера?
Спасибо за ваши советы и ответы.
Прилагаю тестовый пример (AVR Studio 4.19)
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/interrupt.h>
#include <util/delay.h>
volatile uint32_t CNT32 = 0;
uint32_t millis(void){
unsigned long m;
uint8_t oldSREG = SREG;
cli();
m = CNT32;
SREG = oldSREG;
return m;
}
void StartTimer0()
{
cli();
TIMSK0 &= ~(1<<TOIE0); // выключить обработку по переполнению
TCNT0 = 131;
//TCCR0B = (1 << CS01) | (1 << CS00); //Делитель = 64; 8000000 Hz / 64 = 125 000 Hz; 125 000 Hz / 1000 = 125 ticks
TCCR0B = (1 << CS01); //Делитель = 8;
TIMSK0|= (1 << TOIE0); // включить обработку по переполнению
sei();
}
ISR(TIM0_OVF_vect)
{
CNT32++;
TCNT0 = 131; // смещаем значение счётчика так, чтобы счётчику осталось сделать 125 тиков (256 - 125) до нового переполнения
TIMSK0|= (1<<TOIE0); //Продолжить отсчет, (разрешить прерывания по таймеру1)
};
void setup()
{
DDRA|= 0B00000010;
PORTA&= 0B11111101;
StartTimer0();
}
void main() {
setup();
while (1) {
if (millis() > 20000) PORTA |= 0B00000010;
};
return;
};



