Hola:
El codigo que veis hace lo siguiente:
Hace aumentar gradualmente la velocidad de un motor DC mostrando en unos displays el tanto por ciento de la señal en alto, es decir, el duty cicle. Despues ejecuta un codigo para luego disminuir la velocidad tambien gradualmente hasta 10 y empezar de nuevo. Pues bien, Proteus lo simula perfectamente pero cuando lo implemento en la realidad no funciona, llega a 10 el duty cicly y literalmente se vueve loco el PIC empezando de nuevo el programa. Este mismo codigo implementado en PBP funciona sin problemas. No encuentro explicacion y por eso me gustaria vuestra opinion.
// ****************** 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>=1250
//
// Frecuencia de la señal PWM=200 Hz
// OSCILADOR= 4MHZ
// TMR2_PREESCALER=16
// T_PWM= 5 ms
// PR2=312
//
// *****************************************************************************
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOPUT,NOCPD
#use delay(clock=4000000)
#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 dig_1,dig_2;
int16 num;
int16 i;
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,312,1);
//set_pwm1_duty(CCP_OFF);
while(1){
setup_ccp1(CCP_PWM);
output_high(PIN_C4);
output_low(PIN_C5);
for(i=10;i<987;i++){
num=(i*10)/125;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(i);
delay_ms(10);
}
output_b(0xFF);
output_d(0xFF);
delay_ms(200);
output_b(0x00);
output_d(0x00);
delay_ms(200);
output_b(0xFF);
output_d(0xFF);
delay_ms(200);
output_b(0x00);
output_d(0x00);
delay_ms(200);
for(i=987;i>10;i--){
num=(i*10)/125;
dig_1=(num/10);
dig_2=(num-(dig_1*10));
output_b(display7seg(dig_1));
output_d(display7seg(dig_2));
set_pwm1_duty(i);
delay_ms(10);
}
output_b(0xFF);
output_d(0xFF);
delay_ms(200);
output_b(0x00);
output_d(0x00);
delay_ms(200);
output_b(0xFF);
output_d(0xFF);
delay_ms(200);
output_b(0x00);
output_d(0x00);
delay_ms(200);
}
}