Обычный таймер.
Самое интересное, что об этом уже тоже говорили. В той теме, где был выложен код изначально.
- Реклама
- Сообщения: 131
- Зарегистрирован: Вс май 08, 2016 22:45:48
Погрешность чего, таймера ? Она определяется погрешностью его тактовой частоты, а не предделителем.
- Сообщения: 131
- Зарегистрирован: Вс май 08, 2016 22:45:48
Попробовал сделать таймер по сравнению.
Но теперь вместо 10 сек - отсчитывает 21.5 сек, в чем ошибка?
Спойлер
Код: Выделить всё
ISR(TIM0_COMPA_vect)
{
i++;
if (i>=10) //period 1s
{
Sec++;
i=0;
}
}
int main(void) {
PRR = (1<<PRADC); // shut down ADC
TIMSK0 = (1<<OCIE0A); //
TCCR0B = (1<<CS02) | (1<<CS00); // prescaler 1/1024
OCR0A = 116;
i=0; Sec=0;
sei();- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Тактовая частота МК какая? Относительно ее нужно высчитывать предделитель и число сравнения.
- Реклама
- Сообщения: 131
- Зарегистрирован: Вс май 08, 2016 22:45:48
Считал так
Частота 9600000Гц. Установлен делитель на 8, получаем 1200000
1200000/1024 = 1171,875 ГЦ/сек или 1,17 Гц/мс
1,17Гц*100=117Гц/100мс
Значит, если ставлю OCR0 = 116, то прерывание будет происходить каждые 100мс. При этом приращая переменную i++
если i>=10. Значит прошло 1000мс или 1 сек.
Вот так я рассуждал.
Частота 9600000Гц. Установлен делитель на 8, получаем 1200000
1200000/1024 = 1171,875 ГЦ/сек или 1,17 Гц/мс
1,17Гц*100=117Гц/100мс
Значит, если ставлю OCR0 = 116, то прерывание будет происходить каждые 100мс. При этом приращая переменную i++
если i>=10. Значит прошло 1000мс или 1 сек.
Вот так я рассуждал.
1200000/1024=1'171,875Гц. Такое число должен отсчитать счетчик таймера за 1 секунду. 1'171,875/256=4,578, т.е. будет 4 переполнения + 147,875. Т.е. такой вариант не проходит, поэтому приходится вводить дополнительный счетчик на 10, чтобы отсчитать ~100мс. В итоге полученная секунда далека от идеала. Можно получить секундный интервал немного изменив условия. Например, задав число сравнения 250-1, предделитель таймера 256 и дополнительный счетчик. 9'600'000/256/250=150. Почему идет неправильный счет? Думаю, что не задан режим работы CTC. Для ATtiny13
Код: Выделить всё
TCCR0A = (1<<WGM01)



