Что-то никто не отвечает, но я, кажется, уже и сам понял, почему так получается.
Во время работы таймер в каждый такт добавляет 1 к регистру TCNT. В тот момент, когда TCNT сравняется с OCR1, уровень на ножке OC1A поменяется на противоположный. Получается, если предделитель равен 1, а TOP = 1023, частота ШИМ получится не 8Мгц, а 8000/1023 = 7.82 Кгц. А если еще и предделитель поставить 8, в итоге получится частота 7.82/8 = 977 Гц.
Я всё правильно понимаю?
(пока мысль не потерялась, решил записать; сейчас на макетке попробую)
Добавлено спустя 2 часа 56 минут 11 секунд:Собрал вот такой простой код. ШИМ в режиме 1 "Phase correct, TOP = 0xFF". В этом режиме таймер считает от 0 до 255, потом обратно, значит, полный цикл - 510. Частоту задал кварцем на 8 МГц. Значит, должна получиться частота ШИМ: 8000/510=15.6 Кгц.
Код:
//кварц 8 МГЦ, компилятор CodeVisionAVR
#include <mega8.h>
void main(void) {
TCCR1A.7=1; //установил 1 в COM1A1, табл 36 ДШ
TCCR1A.0=1; //установил 1 в WGM10, режим 1, табл 39 ДШ
TCCR1B.0=1; //установил 1 в SC10, предделитель /1, табл 40 ДШ
DDRB.1=1; установил PB1 на выход
OCR1A = 50; //скважность получится 50/255=19.6%
while(1)
}
Частотомер показывает 12.8 КГц. Ну, уже что-то. Но частота неточная.
Попробовал сделать другой код, с использованием delay: ждем 50мкс, устанавливаем 1, еще 50 мкс, устанавливаем 0. Должна получиться частота 10 Кгц, но на частотомере - 8.6Кгц. Наверное, частотомер глючит. Разбираюсь дальше.