Generell kann man sagen, das je höher die Auflösung und Wiederholrate der PWM sein soll, desto mehr Gedanken muss man sich im Vorfeld machen und desto optimaler muss der Code aussehen.

Reicht für es 1 oder 2 Kanäle noch aus jeden einzelnen Kanal einzeln zu vergleichen und separat auszugeben, so muss man bei 8 Kanälen in 8 Bit Auflösung für eine annehmbare Wiederholrate (ab 250 Hz) schon etwas tiefer in die Codekiste greifen.
Hannes Lux schlug auf www.mikrocontroller.net z.B. das folgende Code Konstrukt vor:

Code:
 cp pwz,soll0          ;Sollwert0 erreicht?
 ror wl                ;Ergebnis (Carry) sichern
 cp pwz,soll1          ;Sollwert1 erreicht?
 ror wl                ;Ergebnis (Carry) sichern
 cp pwz,soll2          ;Sollwert2 erreicht?
 ror wl                ;Ergebnis (Carry) sichern
 cp pwz,soll3          ;Sollwert3 erreicht?
 ror wl                ;Ergebnis (Carry) sichern
 cp pwz,soll4          ;Sollwert4 erreicht?
 ror wl                ;Ergebnis (Carry) sichern
 cp pwz,soll5          ;Sollwert5 erreicht?
 ror wl                ;Ergebnis (Carry) sichern
 cp pwz,soll6          ;Sollwert6 erreicht?
 ror wl                ;Ergebnis (Carry) sichern
 cp pwz,soll7          ;Sollwert7 erreicht?
 ror wl                ;Ergebnis (Carry) sichern
 com wl                ;invertieren wegen L-aktiven Ausgängen
 out aus,wl            ;Ergebnisse ausgeben
Wie meine Vorredner schon erwähnten läuft dieser Code in einer Timer Interupt Routine.

Vielleicht reicht das ja als Denkanstoß aus.


Für eine 10 Bit Software PWM dürfte ein wesentlich höherer Aufwand von Nöten sein.
Aber dazu mehr, wenn ich meine Theorien in dieser Richtung in die Praxis umgesetzt habe.

Grüße,
Hanni