Hola:
he modificado ligeramente el código empleando las interrupciones pero sigue sin funcionar. Lo adjunto por si le veis algun error.
// ****************** CONFIGURACION DEL MODO PWM ******************************
//
// T_PWM=1/Freq_PWM
// T_PWM=(PR2+1)*4*TOSC*TMR2_PREESCALER
//
// T_PWM
// PR2= (---------------------------)-1
// 4*TOSC*TMR2_PREESCALER
//
// CTPWM=(CCPR1L:CCP1CON<5:4>)*TOSC*TMR2PREEESCALER
//
// CTPWM es el ciclo de trabajo y no puede superar el valor del periodo
// de la señal PWM por lo que es posible que no se utilicen los
// 10 bits de resolución que tiene
//
//
// CTPWM
// CCPR1L:CCP1CON<5:4>= ----------------------
// TOSC*TMR2PREEESCALER
//
// El valor del duty maximo es CCPR1L:CCP1CON<5:4>=1000
//
// Frecuencia de la señal PWM=250 Hz
// OSCILADOR= 4MHZ
// TMR2_PREESCALER=16
// T_PWM= 4 ms
// PR2=250
//
// *****************************************************************************
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,NOCPD,BROWNOUT
#use delay(clock=4000000)
//#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,stream=HOSTPC)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=N)
#use fast_io(c)
#use fast_io(d)
#use fast_io(b)
int8 display7seg(int8 valor){
switch (valor){
case 0:
return 0b11111100;
break;
case 1:
return 0b01100000;
break;
case 2:
return 0b11011010;
break;
case 3:
return 0b11110010;
break;
case 4:
return 0b01100110;
break;
case 5:
return 0b10110110;
break;
case 6:
return 0b00111110;
break;
case 7:
return 0b11100000;
break;
case 8:
return 0b11111110;
break;
case 9:
return 0b11100110;
break;}
}
int8 aux,dig_1,dig_2;
int16 num;
char c;
#int_rda
void serial_isr(){
c=getc();
}
void main(void){
set_tris_c(0x00);
set_tris_d(0x00);
set_tris_b(0x00);
output_c(0x00);
output_d(0x00);
output_b(0x00);
setup_timer_2(T2_DIV_BY_16,249,1);
setup_ccp1(CCP_PWM);
//set_pwm1_duty(CCP_OFF);
enable_interrupts(GLOBAL);
enable_interrupts(int_rda);
while(1){
output_high(PIN_C4);
output_low(PIN_C5);
//c=fgetc(HOSTPC);
aux=(int8)(c-'0');
switch (aux){
case 2:
num = 10;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 4:
num = 20;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 8:
num = 30;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 16:
num = 40;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 32:
num = 50;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 64:
num = 60;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;
case 128:
num = 70;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(num*100);
delay_ms(30);
break;}
}
}