1Мерцание максимально заметно на малых яркостях. 2Использовать нормальные драйвера с аппаратным ШИМ. Хитрый финт для промежуточного числа светляков:
Хранится список приращений времени до следующего переключения
В прерывании выбрасывается только значения портов и устанавливается новое значение счетчика. Не нужно даже регистр флагов сохранять.
Примерно так:
engine: st -Y,ZL
st -Y,ZH
st -Y,r16
lds ZL,PWMCurrPtr
lds ZH,PWMCurrPtr+1
ld r16,Z+
OutSFR OCR1AH,r16
ld r16,Z+
OutSFR OCR1AL,r16
ld r16,Z+
OutSFR OutPort(PWM_MASK1),r16
#ifdef PWM_MASK2
ld r16,Z+
OutSFR OutPort(PWM_MASK2),r16
#endif
#ifdef PWM_MASK3
ld r16,Z+
OutSFR OutPort(PWM_MASK3),r16
#endif
ld r16,Z+
sts PWMCurrPtr,r16
ld r16,Z+
sts PWMCurrPtr+1,r16
ld r16,Y+
ld ZH, Y+
ld ZL, Y+
reti
На меге вывожу на 24 ноги 120Гц при 11битном разрешении.
По алгоритму видел 2 варианта: один описывал, другой - просто на SD карточке хранятся кадры(считал - выкинул).
В обоих случаях нужна программа на писюке для подготовки.
Насчет потребления ниасилил: все равно будет режим "все вкл", значит источник должен его выдерживать.