Ich hab mich mit pwm noch nicht auseinandergesetzt,das kommt erst.
aber ich denke die pwm läßt sich zur laufzeit verändern,also kommst du vielleicht auch mit nur einem kanal aus,welchen du jeweils anpassen kannst.

aber das kommt drauf an wie das aussehen soll.
vielleicht kannst du ne tabelle oder so erstellen in welcher du die werte fix festlegst,welche led wann und wie hell leuchten soll.
und diese werte rufst du in einer schleife der reihe nach ab.

wie das mit dem interrupt und verzögerungen is müßtest du in der hilfe nachsehen können.
aber ich glaube die verzögerung wird nicht unterbrochen.
es wird bei einem interrupt lediglich ein pointer gesetzt in welcher zeile des programms unterbrochen wurde,dann springt er zu dem label welches du angibst,und anschliessend wieder zurück,dahin wo der pointer gesetzt wurde.
ein timer läuft im hintergrund ab,also intern durch hardware,dadurch wird das programm nicht verzögert,also müßte der interrupt sofort abgearbeitet werden.
alternativ könntest du auch mit assembler verzögern,mit einer ganzen menge "nop" hintereinander.
dadurch veranlaßt du den den rechner einen takt lang nichts zu tun.
ein takt wird aber sehr kurz sein bei 1 million takten pro sekunden.
erhöhst du den takt,mußt du auch den code wieder anpassen.
aber das würd ich mir nicht antun.

also dann doch lieber timer

sollte ich falsch liegen,bitte ich um korrektur.

MfG,
--> Mr.G.