Serbike te pongo la rutina del PWM por soft que he realizado, aunque de todas formas deberías haber iniciado otro post:
#INT_TIMER0
void Interrupcion_Timer0()
{
set_timer0(156); //interrupcion cada 0,1ms
nClocks++;
if(nCLocks<Duty_R) //PWM LED ROJO
{
output_high(LED_R);
}
else
{
output_low(LED_R);
}
if(nClocks==100)
{
nClocks=0;
}
Como puedes ver, se configura el timer para que salte cada 0,1ms (en 100 pasos da 10ms que es el periodo del PWM) y en cada interrupción de incrementa la variable nClocks que se compara con Duty_R que es el valor del ciclo de trabajo del PWM (0 a 100). Una vez nClocks llega a 100 se reinicia de nuevo el ciclo.
Espero que haya quedado claro.
Un saludo!!