программного PWM, 8 каналов, 256 точек.
Частота PWM будет в 256 раз ниже частоты прерываний таймера.
Даже если писать на асме, прерывание вместе с накладными расходами занимает примерно 30 тактов, поэтому даже при 100%-загрузке процессора не позволит получить на тактовой 20 МГц частоту PWM более 2.6 кГц.
char a,b,c,d,e,f,g,h; //значения PWM
char pwm;
В прерывании таймера:
(a > pwm)? PortPWM_A_1 : PortPWM_A_0;
(b > pwm)? PortPWM_B_1 : PortPWM_B_0;
(c > pwm)? PortPWM_C_1 : PortPWM_C_0;
(d > pwm)? PortPWM_D_1 : PortPWM_D_0;
(e > pwm)? PortPWM_E_1 : PortPWM_E_0;
(f > pwm)? PortPWM_F_1 : PortPWM_F_0;
(g > pwm)? PortPWM_G_1 : PortPWM_G_0;
(h > pwm)? PortPWM_H_1 : PortPWM_H_0;
pwm++;