gracias por sus respuestas, rivale y RALF2; en la simulación en Proteus tenía unos LOGIC TOGGLE que estaban en conflicto con las entradas del puente H (realizado con transistores), los borre y ya corrió
;tienes razón rivale, debería ir 1023(10 bits) para ir a toda marcha, ya lo corregí, vas mas rápido; tambien reduje el periodo del timer2, y también corrió más rápido...pero ahora, con mi rústico control del encoder(usando uno de los canales) mediante RB0, en Proteus el motor no se detiene del todo y no regresa pero veo que titila el pin del ccp2, es decir, mando el pwm para ir a la izquierda
, en el MPLAB hice debugg paso-a-paso(simulando flancos de subida) y la lógica está correcta...dejo mi código modificado, porfavor si me pueden ayudar les agradecería infinitamente
#include <16c63a.h>
#fuses XT,NOPROTECT,NOBROWNOUT,NOWDT
#use delay(clock = 4000000)
#use standard_io(b)
#use standard_io(c)
int pulse = 0;
#int_ext
void encoder()
{
pulse = pulse + 1;
}
void motor_right()
{
set_pwm1_duty(0x3FF); //mover a la derecha a toda marcha
set_pwm2_duty(0);
}
void motor_left()
{
set_pwm1_duty(0);
set_pwm2_duty(0x3FF); //mover a la izquierda a toda marcha
}
void motor_stop()
{
set_pwm1_duty(0); //motor detenido
set_pwm2_duty(0);
}
void main()
{
int right = 0;
set_tris_b(0x01); //RB0 entrada
set_tris_c(0x00); //RC1 y Rc2 como salida
enable_interrupts(INT_EXT); //interrupcion externa por pin RB0 habilitado
enable_interrupts(GLOBAL); //interrupciones globales habilitado
ext_int_edge(L_TO_H); //interrupcion por flanco de subida
setup_timer_2(T2_DIV_BY_1,125,1);
setup_ccp1(CCP_PWM); //mudulo ccp1 como pwm
setup_ccp2(CCP_PWM); //modulo ccp2 como pwm
motor_stop();
while(1)
{
if(right == 0)
{
motor_right();
if(pulse == 12)
{
motor_stop();
delay_ms(1000);
pulse = 0;
right = 1;
motor_left();
}
}
if(right == 1)
{
if(pulse == 12)
{
motor_stop();
delay_ms(1000);
pulse = 0;
right = 0;
}
}
}
}