4.9 МГц (кстати, по-английски будет MHz, а не MGz) - это, как я вижу, внутренний генератор 24.5 МГц, деленный на пять. Почему именно на пять? Задает эту частоту таймер 0?
Добавлено через 13 минут и 55 секунд:Судя по мануалу, требующаяся функция timer capture на типовых счетчиках не реализована. Вместо это используется "Programmable Counter Array" (PCA): еще один 16 битный счетчик и 5 модулей сравнения к нему.
The Programmable Counter Array (PCA0) provides enhanced timer functionality while requiring less CPU intervention than the standard 8051 counter/timers. The PCA consists of a dedicated 16-bit counter/timer and five 16-bit capture/compare modules. Each capture/compare module has its own associated I/O line (CEXn) which is routed through the Crossbar to Port I/O when enabled.
Я так понимаю, что счет PCA должен задавать период, а модуль захвата задает ширину.
В общем теперь понятно, зачем делить на пять - для использования режима PWM 8 bit. Режим с буферизацией значения ШИМ. Прерывание по переполнению PCA есть.
В чем, собственно, возникла сложность?
Добавлено через 15 минут и 51 секунду:В обработчике прерывания вычисляем новое значение и загружаем в регистр PCA0CPHn. Вычисление должно быть достаточно быстрое, т.к. период между прерываниями составляет 816-817 тактов (машинный цикл данного чипа - 1 такт). Т.е. тысяч тактов на использование плавающих значений, а уж тем более функций синусов нет. Самым оптимальным будет использование табличных преобразований. Не помешает подсчет погрешности преобразования, иначе будет низкочастотный дрейф.
Считаю, что для данного чипа риалтайм-процедуры нужно писать на ассемблере. На Си можно писать только некритичную ко времени исполнения логику.