Да есть у меня и такой вариант.. Но, что-то не так пошло. Скорее всего причина в следующем - на время, когда программа считает и прописывает новую частоту в Si, я запрещал прерывания. Возможно это лишнее. При этом что получается? Время расчета частоты и записи ее в Si превышает время, в течение которого валкодер поворачивается на один шаг. То есть, считанное состояние валкодера контроллер может распознать как вращение в другую сторону. В результате получал следующее - вращаю вперед, частота нормально перестраивается, если крутить побыстрее - начинает перестраиваться совсем не туда куда надо. Чтобы этого не было, нужно, чтобы периодичность обращения к валкодеру не превышала определенное время, а именно - время самой длительной операции, выполняемой программой. Для этого у меня все это крутится в основном цикле, коротком цикле. Там всего несколько операций и постоянно считывается что выдает валкодер и пишется в буфер. При возникновении прерывания по таймеру, выполняются все операции - счет новой частоты, вывод на экран и пр. В это время, конечно, все импульсы от валкодера будут пропущены. Но не думаю, что это важно.
Если использовать внешнее прерывание от валкодера, тогда запрещать прерывания нельзя. Но тогда, что-то было не так. Где-то контроллер вел себя не корректно.. Особенно я не вникал. Тот алгоритм, что использую сейчас работает нормально. Валкодер у меня оптический, на подшипниках, если крутнуть пальцем, то можно за один раз перестроиться на 10-15 кгц, а то и больше. При медленном вращении - перестройка как и положено - на один шаг. Крутим в два раза быстрее - перестраивается в 4 раза. Фактически частота перестройки равна содержанию буфера энкодера в квадрате, умноженная на шаг.
Кроме того, это все только начало. А дальше начинается более интересное - воплотить это все в аппарате и чтобы помех не было и шума и прочего. Поэтому, если бесконечно ковыряться в программе, то синтезатор так и будет лежать на столе..