Dla programowego PWM funkcja będzie skomplikowana, ponieważ musisz sterować wszystkimi potrzebnymi wyjściami jednocześnie, rozbicie na poszczególne funkcje dla pinów i przetwarzanie cykliczne raczej nie wchodzi w grę, ponieważ nieobsługiwane w danym momencie wyjścia zepsują swój współczynnik wypełnienia. Więc chyba o jakimkolwiek wolnym czasie procesora można rzeczywiście zapomnieć. Może włączyć timer a w przerwaniu rozbudowana funkcja warunkowa, zmieniająca stany na potrzebnych pinach. Wtedy 9 przepełnień licznika będzie okresem przebiegu na pinach. Współczynnik wypełnienia możesz regulować wtedy od 0 do 1 skokowo co 1/9 (0,1/9,2/9,...,8/9,1). A jak weźmiesz sobie więcej przepełnień za okres to możesz współczynnik regulować w większym zakresie.
edit:
W pierwszym przerwaniu wszystkie piny pwm, które flagami globalnymi mają współczynnik wypełnienia >0 ustawiane na 1.
W przerwaniach 2-9 zerowane będą odpowiednie piny zgodnie z zadeklarowanym licznikiem przepełnień i twoimi warunkami wpisanymi do flag.
I tak w koło. Współczynnik wypełnienia sterowany byłby danymi wpisywanymi do flag. Jedna flaga mogła by objąć dwa piny bo 9 mieści się w 4-ech bitach.
PS. Nie znam bascoma
Tak wyglądają przebiegi z takiego PWM-a. Od góry 0,8 0,5 0,3 0,2 0 Jak jesteś zainteresowany to mogę wrzucić jutro kod, ale w C. Całkiem to niezłe, nawet symulator mi nie krzyczał że "expensive CPU load"

Okres jednego cyklu jest stały i w tym przypadku wynosi ok 20ms czyli częstotliwość to 50Hz. Zaprzęgnięty timer0 po prescalerze /64, procesor jedzie na 8MHz czyli timer taktowany 125kHz, przerwania generowane są z częstotliwością 488Hz, co przy podziale na 9 przerwań na cykl daje ok 55Hz.
Oczywiście można rozkręcić procka na 16MHz, lub zmniejszyć preskaler, jeśli widoczne byłoby migotanie(to drugie kosztem mocy obliczeniowej oczwiście).
Nie wiem dokładnie jak działa takie sprzętowe pwm i czy można w nim płynnie zmieniać współczynnik wypełnienia, tak tutaj nie masz takiej możliwości. Ale myślę że taki prymitywny pwm wystarczy do sterowania diodami RGB.