Revisando el código encontré un pequeño problema cuando se daba la orden de cambio de giro el problema es el siguiente
set_pwm2_duty(0);
delay_ms(1000);
Acá hay un problema ya que el micro se queda enclavando y no responde a la orden de cambio de velocidad por lapso de 1 s. El problema se soluciona condicionando la orden de cambio de giro tal y como se muestra a continuación.
if(freno == 2)
{
set_pwm2_duty(0);
delay_ms(1000); // Espero a que se pare el motor
}
El código completo con las respectivas modificaciones se muestra a continuación.
#if defined(__PCM__)
#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock = 4000000)
//#define use_portd_lcd TRUE
#use standard_io(c)
#use standard_io(b)
#use standard_io(d)
int conta,bandera;
#int_ext
void flanco_externo()
{
conta = conta + 1;
if(conta == 1)
{
ext_int_edge(L_TO_H);
}
if(conta ==2)
{
conta = 0;
ext_int_edge(H_TO_L);
bandera = bandera + 1;
if(bandera>2)
{
bandera = 1;
}
}
}
void main()
{
int freno;
long cutil;
cutil = 0;
conta = 0;
bandera = 0;
freno = 0;
set_tris_b(0xff);
set_tris_c(0xF9);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_TO_L);
setup_timer_2(T2_DIV_BY_1, 255, 1);
setup_ccp1(ccp_pwm);
setup_ccp2(ccp_pwm);
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_DIV_32);
set_pwm2_duty(0);
set_pwm1_duty(0);
do
{
if (bandera == 1)
{
if(freno == 2)
{
set_pwm2_duty(0);
delay_ms(1000); // Espero a que se pare el motor
}
set_adc_channel(0);
delay_ms(10);
cutil = read_adc();
delay_ms(10);
set_pwm1_duty(cutil);
set_pwm2_duty(0);
freno = 1;
}
if(bandera == 2)
{
if(freno == 1)
{
set_pwm1_duty(0);
delay_ms(1000); // Espero a que se pare el motor
}
set_adc_channel(0);
delay_ms(10);
cutil = read_adc();
delay_ms(10);
set_pwm2_duty(cutil);
set_pwm1_duty(0);
freno = 2;
}
}
while(true);
}