Попробуй сделать программный ШИМ с одним прерыванием, скажем, каждые 100 мкс. При периоде ШИМ 10мс (100Гц) получишь дискретность регулировки яркости 1/100.
На ассемблере это сделать даже проще, чем на С. Можно сохранять минимум контекста. Между прерываниями при 20МГц кварце укладывается от 1000 до 2000 инструкций. Производительности более чем достаточно и для более высокой частоты ШИМа..