jejej Vuelvo y repito gracias a AngelGris, BrunoF, Nocturno y todas las personas que ven y aportan ideas para solucionar algun problema me ha servido de mucha ayuda en todo este proceso de aprendizaje

lo de los dsPIC los dejare para el próximo año cuando me llegue el que pedí

Por ahora seguimos sacando jugo al timer0 y las interrupciones.. A continuación muestro unas imágenes y códigos que he hecho para hacer un PWM por software. Voy a tratar de explicar lo que hice antes de mostrar las imágenes.
Primero que todo la frecuencia de mi PWM es de 25Khz en teoría. trabajando con Timer0 - 48Mhz de crystal y prescaler de 2 y variar el ciclo de trabajo entre 50% 30% y 20% (por ahora) el máximo ciclo para esta aplicación va ser de 50% ya que es para controlar un puente H.
Que es lo que he hecho?
Rta: Aparte de leer y leer y mirar ejemplos jejeje he hecho una interrupción cada "40us" esto lo he tomado como mi periodo de la señal (1/40us)=25KHZ
Ahora para tener los 40us deberia de cargar mi TIMER0 con
65296 de tal forma que solo se cuenten
240tick teniendo en cuenta que un tick = (1/(48Mhz/4))*2 =0.166us (donde 2 es el prescaler) por lo tanto 240*0.1666uS = 40us.. que es lo deseado.. Ese resultado es en
TEORIA con la ayuda del osciloscopio calibre el valor de carga del TMR0 = FF1F que es lo mismo
65311 eso es en la realidad, que con respecto a lo calculado teoricamente tenemos 15 tick de mas.. Esto fue explicado en un comentario mas arriba por
AngelGris. Bueno después de esa explicación viene lo otro que hice. Ya teniendo esa interrupción cada 40us voy variando el tiempo en que permace en high la salida.. Espero no ser tan canson con este tema, pero apenas estamos en el proceso de aprendizaje jeje . Y se que mucha gente se preguntara del porq no he utilziado los modulos PWM, la razon es una sola quiero experimentar.
Voy a generar un Switch-Case para aumentar el ciclo de trabajo o disminuir apartir de un pulsador. Por ahora solo lo estoy haciendo desde Soft.
Anexo Imagen y código si me pueden ayudar para minimizar y optimizar codigo escucho ideas.. Gracias.
La señal roja es el tiempo de interrupción y la Amarilla es el PWM


#include <p18f4550.h>
#include <delays.h>
#define PWM1 LATBbits.LATB1
//Variables globales
//const int periodo = 240; //240 tick en donde un tick=0.166uS (240x0.166us)=39.84us aprox 25.10Khz
const int duty_50 = 120;
const int duty_30 = 72;
const int duty_20 = 48;
unsigned int flag_t =0; //Bandera que me indica cuando se genera una interrupcion
unsigned int flag_d =0; //Bandera para el ciclo de trabajo
unsigned int contador=0;
unsigned int valTimer0;
/*Prototipos de funciones*/
void Interrupt_ISR_TMR0(void);
///////////////////////////////////////////////
#pragma code High_vector_Interrupt = 0x08
void High_vector(void){
_asm goto Interrupt_ISR_TMR0 _endasm
}
#pragma code
////////////////////////////////////////////
#pragma interrupt Interrupt_ISR_TMR0
void Interrupt_ISR_TMR0 (void)
{
if(INTCONbits.TMR0IF==1){
INTCONbits.TMR0IF=0; //Borramos bandera
++contador; //Cada vez que se presente una interrupcion aumentamos la variable contador
LATBbits.LATB2=!LATBbits.LATB2;
if(contador==1){
flag_t=1;
contador=0;
}
TMR0H=0XFF; //El timer 0 arranca desde 65311. 65536-65311=235tick*0.166uS=39.01us
TMR0L=0X1F;
}
}
void main(){
OSCCONbits.SCS1=0; //Configurando como Oscilador primario
OSCCONbits.SCS0=0;
TRISBbits.RB1=0; //Configurando como salida el PinRB1 del puerto B
LATBbits.LATB1=0; //Estableciendo a un nivel bajo el PinRB1
TRISBbits.RB2=0;
LATBbits.LATB2=0;
ADCON1=0x0F; //Configurando todos los puerto como Digitales.
T0CONbits.TMR0ON=0; //Timer 0 off
T0CONbits.T08BIT=0; //Configurado a 16bits
T0CONbits.T0CS=0; //Internal
T0CONbits.T0SE=0;
T0CONbits.PSA=0; //Prescaler asignado
T0CONbits.T0PS2=0; //Prescaler de 2
T0CONbits.T0PS1=0;
T0CONbits.T0PS0=0;
RCONbits.IPEN=1; //Enable priority levels on Interrupts
INTCONbits.TMR0IF=0; //Clear TF0
INTCONbits.GIE_GIEH=1; //Enable Global interrupt
INTCONbits.TMR0IE=1; //Enable TMR0 overflow
INTCON2bits.TMR0IP=1; //High priority
T0CONbits.TMR0ON=1; //on Timer 0
while(1){
//Pulso del pwm
if(flag_t==1){ //Si se desbordo el timer activamos una bandera
flag_t=0; //Limpiamos la bandera
PWM1=1; //Activamos el pin del PWM
flag_d=1;
}
//cuadrar ciclo de trabajo
if(flag_d==1){
valTimer0=TMR0L; //Leemos el valor del timer0 y lo almacenamos en la variable valtimer0
valTimer0|=TMR0H<<8;
if(valTimer0>duty_50){
flag_d=0;
PWM1=0;
}
}
}
}