Ist Dir jetzt klar, daß PWM für Gleichstrom-Motoren und nicht für Schrittmotoren ist ?
Je nach Drehzahl des Schrittmotors mußt Du beim Anfahren und Anhalten eine Rampe erzeugen. Wenn Du z.B. 5000Hz auf die Endstufe gibst, piept der Motor mehr oder weniger laut und das wars. Die Trägheit des Rotors muß überwunden werden und das geht nur, wenn Du mit einer kleinen Frequenz (Start-/Stop-Frequenz) beginnst, die Frequenz in einer bestimmten Zeit erhöhst (Beschleunigung / Rampe) bis die maximale Frequenz (Hochgeschwindigkeitsphase) erreicht ist. Zum Anhalten der umgekehrte Verlauf, weil sonst der Schrittmotor einfach weiter dreht, mit Last sowieso.
Per Interrupt geht das ganz gut. Bei jedem Timer-Überlauf (254...255...0) wird ein Interrupt ausgelöst.
Jetzt könntest Du eine Timer-Schritt-Zeit wählen, die bei 256 Schritten (= 0 im Timer-Register) die Start-/Stop-Frequenz und bei 1 Schritt (= 255 im Timer-Register) die Maximal-Frequenz ergibt.
In jedem Interrupt kannst Du einen beliebigen Ausgang kurz auf Low setzen, gefolgt von 1...3 NOPs (oder andere benötigte Befehle) und dann wieder auf High.
Für eine Rampe kannst Du zusätzlich bei jedem Interrupt den Timer-Wert bis 255 erhöhen (steigende Rampe) oder bis 0 verringern (fallende Rampe) und dann keine Impulse mehr rausgeben (Halt).
Wie Timer beim PIC Interrupts auslösen, kannst Du als Assembler-Beispiele in diesem und diesem Link sehen.