Цитата(loghir @ May 27 2011, 06:20)

Буду разбираться. Проблема в том, что без предзагрузки таймер физически не может выдать желаемую частоту прерываний...
Пока что считаю для 8-разрядного таймера так:
Частота прерываний TMR0 (при Fosc/4, для 4 МГц, коэфф. - 256) = (1000000)/256/256 = 15,2587890625 Гц
Частота прерываний TMR0 (при Fosc/4, для 4 МГц, коэфф. - 64) = (1000000)/256/64 = 61,03515625 Гц
Частота прерываний TMR0 (при Fosc/4, для 4 МГц, коэфф. - 16) = (1000000)/256/16 = 244,184375 Гц
Ну объясните мне, с чем здесь разбираться? Всё на уровне арифметики, если держать в голове 2^n для n хотя бы до 16.
Пусть хочется получить 50 Гц.
1000000/50 = 20000 - столько периодов тактовой частоты таймера помещается в 1 период требуемой частоты.
Сначала ищете требуемый прескейлер: (1000000/50)/256 = 78.125
Округляете вверх до степени 2: = 128 (в предыдущем посте я сначала неправильно написал, что округлять нужно вниз)
Считаете предустановку таймера: (1000000/50)/128 = 156
Далее в симуляторе ставите точку останова в нужном месте и смотрите, насколько врёт таймер. (а врать он будет и из-за целочисленности арифметики, и из-за сброса прескейлера при записи в таймер)
Если считать ручками, можно ещё проще.
20000 округляете вверх до степени 2: = 32768 = 2^15
Из 15 на таймер приходится 8 разрядов, значит степень предделителя 7.