Muy buenas compañero, este es el programam que he usadopara generar los pwm que necesito:
//---------------------------------------------------------INICIO---------------------------------------------------------------------------
#byte porta=05//definicion del puerto a
#byte portb=06//definicion del puerto b
#byte ccpr1l=0x15
byte T,ton,toff,tiempo;//declaracion de variables globales
#int_RTCC
RTCC_isr() {
portb=~portb;//controla si entra en la intrrupcion
if(tiempo<t){
tiempo++;
}else{
tiempo=0;
}
set_rtcc(450);//carga en registro del timer un valor para que sea mas rápido
/*cuanto mas alto sea el valor, mas rapido se llega al overflow en el timer*/
}
#int_TIMER2
TIMER2_isr() {
if(tiempo<=ton){
output_high(pin_C0);
}
if(tiempo>ton){
output_low(pin_c0);
}
if(tiempo<t/4){
output_low(pin_c1);}
else{
if(tiempo<=(ton+t/4)){
output_high(pin_C1);
}
if(tiempo>(ton+t/4)){
output_low(pin_c1);
}
}
}
void main() {
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,62,2);
setup_ccp1(CCP_off);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_EXT);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
set_tris_a(0x00);
set_tris_b(0x00);
t=100; //valor que establece el periodo
ton=5;//valor del ciclo de servicio
while(true){
}
}
//----------------------------------------------------------------------FIN------------------------------------------------------------
Bueno, pues este es mi programa, y lo cierto es que funciona, pero lo dicho, hasta 2.5KHz. La velocidad del timer 0 la controlo con la instruccion "set_rtcc(450);". El valor de 450 es el mayor que he podido escribir en el timer obteniendo la señal de salida. Para valores superiores a este, he comprobado que el timer 0 (lo he comprobado porque me cambia el valo del puerto b ), pero por alguna razon, a partir de este valor no entra en la interrupcion del timer 2.
Un saludo desde Huelva, Andalucia, España