Bueno gente, antes que nada tanto tiempo. Tratando de completar algunos proyectos olvidados, este es para controlar
un motor DC mediante un L293
2 botones (Start y Stop),
un sensor que detecta presencia de un objeto
2 potenciómetros (velocidad y tiempo de funcionamiento) y un
7 segmentos mediante un 74LS47.
Simple, pero no logro hacer funcionar la salida PWM en conjunto con otros 6 pines del puerto C
4 pines del PortC (0 al 3) para controlar el 74LS47 (números en BCD)
2 para el control del L293 (uno el sentido de giro y otro el Enable del integrado)
En fin, fíjense la parte que hace el control del 7 segmentos que hace salida por el puerto C, cuando lo habilito (no comentado)
se descalabran los cachetes (diría el Chavo) del circuito. Sino todo funciona Ok.
Alguna sugerencia... como extraño trabajar con nibbles!
Aquí el codigo principal, las interrupciones controlan tiempos y retardos por pulsación, nada extraño.
void main()
{
int var, i, Start_Iniciado, var_input, var_mostrar;
int1 var1;
int1 arranque_inicial;
setup_adc_ports(sAN0|sAN1|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8); //1 ms
//setup_wdt(WDT_2304MS|WDT_DIV_16);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //32 ms
setup_timer_2(T2_DIV_BY_1,255,1); //15 Khz
setup_ccp1(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
//set_tris_c(0b00010000); //También intenté con el fast io pero no funcionó
//TODO: User Code
// INICIALIZACION DE VARIABLES, SALIDAS Y ENTRADAS IMPORTANTES
output_high (PIN_OUT_STOP);
var_decremeta_cuenta_xa_1_seg = cuenta_xa_1_seg;
flag_blink_Power_LED = FALSE;
flag_blink_Stop_LED = FALSE;
flag_blink_Sensor_LED = FALSE;
flag_blink_S_Corr_LED = FALSE;
flag_STOP = TRUE;
flag_START = FALSE;
flag_Sobre_Corr = FALSE;
Start_Iniciado = FALSE;
sent_giro = sent_enroscando;
//enable_interrupts(INT_AD);
enable_interrupts (INT_EXT);
enable_interrupts (INT_TIMER1);
//enable_interrupts (INT_TIMER0);
stop();
enable_interrupts(GLOBAL);
flag_SENS_PUNTA = TRUE;
arranque_inicial = TRUE;
for(;
{
restart_wdt();
if ( flag_START == FALSE && flag_STOP == FALSE){
//pot timer
set_adc_channel (1);
delay_us(30);
timer_segs = read_adc();
delay_us(30);
var_decrementa_timer_segs = timer_segs;
}
//Aquí radica el problema, si quito la parte del Output_C funciona como espero
//pero sino hace cualquier cosa.
if (var_BCD_timer_nums != var_BCD_timer_nums_anterior){
//var_decrementa_timer_segs--;
//var_input = input_c();
var_mostrar = var_BCD_timer_nums;
output_c(BCD_numbers[var_mostrar]);
var_BCD_timer_nums_anterior = var_BCD_timer_nums;
}
//
if (var_decrementa_timer_segs == 0 && flag_START == TRUE){
flag_STOP = TRUE;
//flag_START = FALSE;
//var_input = input_c();
var_mostrar = 14; // Letra t = Terminado
output_c(BCD_numbers[var_mostrar]);
delay_ms(1000);
}
// Boton Stop
if (flag_STOP == TRUE || (var_veloc_motor_pote > 120 && var_veloc_motor_pote < 130)){
flag_START = FALSE;
Start_Iniciado = FALSE;
arranque_inicial = FALSE;
stop();
}
if (Start_Iniciado == TRUE && ( (var_veloc_motor_pote_anterior != var_veloc_motor_pote) || arranque_inicial == TRUE ) ){
//disable_interrupts(INT_TIMER1);
arranque_inicial = FALSE;
if (var_veloc_motor_pote > 130){
sent_giro = sent_enroscando;
var_veloc_motor = var_veloc_motor_pote * 2;
veloc_motor();
}
if (var_veloc_motor_pote < 120){
sent_giro = sent_desenroscando;
var_veloc_motor = 255 - var_veloc_motor_pote * 2;
veloc_motor();
}
var_veloc_motor_pote_anterior = var_veloc_motor_pote;
}
// Start
if (flag_START == TRUE && Start_Iniciado == FALSE && flag_STOP == FALSE && flag_SENS_PUNTA == TRUE){
flag_STOP = FALSE;
Start_Iniciado = TRUE;
arranque_inicial = TRUE;
output_LOW(PIN_OUT_STOP_LED);
output_HIGH(PIN_OUT_Power_LED);
flag_blink_Power_LED = TRUE;
}
////// Control de Sobre Corriente ///////////
if (flag_S_Corr == TRUE){
flag_STOP = TRUE;
flag_PITIDO = TRUE;
output_HIGH(PIN_OUT_S_Corr_LED);
flag_blink_Stop_LED = TRUE;
cuenta_xa_S_Corr = 0;
}
if (flag_S_Corr == FALSE && flag_PITIDO == TRUE){
flag_PITIDO = FALSE;
}
}
}
void stop (void){
int var_input, var_mostrar;
var_veloc_motor = 0 ;
veloc_motor();
output_LOW(PIN_OUT_STOP); //ENABLE of L293
flag_STOP = FALSE;
}
void veloc_motor (void)
{
if (sent_giro == sent_enroscando)
output_low(PIN_OUT_Sent_Giro);
if (sent_giro == sent_desenroscando)
output_high(PIN_OUT_Sent_Giro);
if (sent_giro == sent_enroscando)
set_pwm1_duty (var_veloc_motor);
if (sent_giro == sent_desenroscando)
set_pwm1_duty (255 - var_veloc_motor);
output_HIGH(PIN_OUT_STOP); //el ENABLE del Integrado L293
}