Цитата(Палыч @ Jun 25 2010, 09:57)

Вот и давайте посчитаем: сколько отводиться на смену выходного сигнала? Сто делим на 16 = 6 (четыре такта отдадим на смену Ton/Toff

). Не все команды выполняются за один такт. Следовательно, нужно определить прошедшее время удержания сигнала, сравнить с некой константой, при необходимости изменить выходной сигнал и проделать некие действия по новому отсчету времени, и всё это улолжить максимум в шесть команд (точнее в несколько команд, которые выполняются за шесть тактов). Сможите? Пусть даже на ассемблере.
Вы чего-то совсем не то насчитали, 16смен значения порта будет в самом худшем случае за
100*5мкс=500мкс (если на всех выходах нужно 2КГц и никакие фронты не совпадают)
Цитата(=GM= @ Jun 25 2010, 02:35)

Тогда уж лучше весь if(Flag_5us) {...} вставить в прерывание, по крайней мере, флаг не придётся проверять.
Почти так, только не совсем
Цитата
Но прерывание для данной задачи - зло, поэтому лучше делать без прерываний вообще, не будет потерь времени на сохранение контекста в прерывании.
Прерывания позволят освободить основной цикл проги для приема обновленных значений Ton/Toff
извне, например по уарту или с кнопочек.
Большую часть сохранения контекста можно делать после вывода значения в порт перед вычислениями(это конечно только на АСМ).
Видимо Вы не до конца поняли суть предлагаемого алгоритма.
За 500мкс сменить значение порта нужно не более 16 раз.
Если эти 16смен забуферировать и приделать к ним счетчики сколько времени не менять значение на порту,
то у нас будет куча времени на рассчеты следующих значений.
Вопрос только в правильной организации рассчетов в прерывании и одновременный вывод из буфера уже сохраненных.
Так вот здесь очень красиво можно вписать вложенные прерывания, причем прерывание то будет одно,
только оно может вызываться из уже работающего того же самого обработчика.