Цитата(-=TRO=- @ Oct 25 2014, 23:12)

Жаль с ATxmega не знаком, по большому счету это не проблема. Однако я не совсем понял, зацепить таймеры можно будет аппаратно, или прийдется выныривать в программу по прерыванию в начале цикла ШИМ первого таймера чтобы сбросить и запустить второй таймер?
Зацепить можно (и нужно) аппаратно, в том-то и дело. У Х-Мег есть, так называемая, система событий, позволяющая произвести коммутацию заранее, чтобы не использовать прерывания.
С точки зрения програмиста это делается просто - записать правильные биты в два регистра. Что на ассеблере сделать ничуть не сложнее, чем на С/С++.
Например, выберем 1-ый канал системы событий (их всего где-то 7 или 8):
EVSYS.CH1MUX = EVSYS_CHMUX_TCC0_CCA_gc; // это я так бит выставила
где:
EVSYS.CH1MUX - регистр системы событий, указующий откуда событие входит в канал
EVSYS_CHMUX_TCC_CCD_gc - константа из одного бита, указующая, что входящим событием является совпадение в канале D (4-ый) таймера C (таймеры имеют имена портов на которые могут генерировать ШИМ, на порту С их 2 штуки).
Знак равенства, т.к. вход будет только один.
TCC1.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH1_gc; // это я так два бита выставила
где:
TCC1.CTRLD - регистр управления ДРУГИМ таймером (первый был TCC0, а этот TCC1).
TC_EVACT_RESTART_gc | TC_EVSEL_CH1_gc - константа из двух бит, указующая, что таймер надо перезапустить от 1-го канала системы событий.
Вот и всё. Теперь 4-ый (D) канал таймера TCC0 будет перезапускать таймер TCC1, на котором можно организовать свои ШИМы.
Тем не менее, тут есть определенная сложность с тем, что второй таймер станет считать до своего перезапуска. Поэтому я бы сделала чуть сложнее, но зато надежнее - задействовала 3 тамера:
3-ый таймер генерит тактовые импульсы в канал событий, а 1-ой и 2-ий таймеры от этого канала событий считают (инкрементируются).
После этого на 1-ом таймере организуете 4 ШИМа, а на 2-ем еще один. Хотя можно на 1-ом организовать 3 ШИМа, а на 2-ом остальные 2. Оно без разницы - лишь бы в сумме было 5.
При этом 3-ий таймер можно использовать как регулятор скорости, поскольку только от его темпа будет зависеть скорость работы ШИМ-генерирующих таймеров. При этом ковырять уровни сравнения не потребуется.
Получится что-то примерно такое:
EVSYS.CH1MUX = EVSYS_CHMUX_TCD0_CCA_gc; // таймер D0 подает импульсы в 1-ый канал системы событий
TCC0.CTRLA = TC_EVSEL_CH1_gc; // таймер C0 берет клоки из 1-ого канала системы событий
TCC1.CTRLA = TC_EVSEL_CH1_gc; // таймер C1 берет клоки оттуда же
Т.е. програмирование тут ерунда - главное сообразить, какие константы в регистры записать.