Цитата(KRS @ Jun 10 2010, 01:21)

Надо будет завтра проверить.
Если в процессе работы программы будут исполняться такие куски кода
Код
PWMMRx = val;
PWMLER = (1<<x);
то в случайном порядке некоторые каналы не будут прописываться.
Далее. Если есть допустим такая инициализация
Код
PWMTCR = 0x02;
PWMPR = 0;
PWMMR0 = PCLK / 1000;
PWMMCR = 0x03;
PWMPCR = 0x2400;
PWMTCR = 0x09;
PWMMR2 = 0;
PWMMR5 = 0;
PWMLER = 0xff;
PWMIR = 0xff;
PINSEL0_bit.P0_7 = 2;
PINSEL1_bit.P0_21 = 1;
а потом ещё до окончания первого периода PWM будет исполнено
Код
PWMMRx = val;
PWMLER = (1<<x);
то начальная инициализация PWMMR2 и PWMMR5 рискует не состояться.
И наконец реальный баг (?). Если выполнить данную инициализацию, а потом (через любое время) два раза подряд
Код
PWMMRx = val;
PWMLER = (1<<x);
с небольшим промежутком между ними (внутри периода ШИМа) то исполнявшийся первым канал всё таки обновится, но не реальным значением из PWMMRx, а возможно значением из теневого регистра и у меня почему-то это значение равно какому-то максимуму, то есть на выходе пина PWMx устанавливается значение 3.3V (Vcc). А уже второй или третий такой "глюк" выводит на пин PWMx значение, похожее на записанное в PWMMRx.
Из всего этого следует что наименьшим злом будет использование
Код
PWMLER |= (1<<x);
Ещё как вариант можно в PWMLER всегда записывать маску всех каналов, которые меняются в процессе работы проги.
Но может быть возможны ситуации, в которых это будет вызывать глюки.