Autor Tema: Problema usando PWM y Salidas de Puerto C 16f916  (Leído 1261 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado zagoaristides

  • PIC12
  • **
  • Mensajes: 99
    • deportes de contacto y fitness
Problema usando PWM y Salidas de Puerto C 16f916
« en: 07 de Agosto de 2012, 10:23:25 »
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
}
« Última modificación: 07 de Agosto de 2012, 11:13:44 por zagoaristides »
Nadie nació sabiendo...Que genio ese Nadie!!!

Desconectado zagoaristides

  • PIC12
  • **
  • Mensajes: 99
    • deportes de contacto y fitness
Re: Problema usando PWM y Salidas de Puerto C 16f916
« Respuesta #1 en: 07 de Agosto de 2012, 11:24:48 »
Bueno gente, parece que le encontré una solución... supongo no es la única forma pero hasta ahora funciona.

Si alguien ve que el código anterior estaba mal por algún motivo por favor se agradece el comentario.

Les dejo la parte que cambié.

En lugar de hacer un output_c que obviamente me va a cambiar el puerto (aunque lo enmascaraba igual no funcionaba bien).
hice un simple output_bit con un shift para ir rotando lo que quería que saliera

      for(i = 56; i<60;i++) //PIN_C0 al PIN_C3
         output_bit(i,shift_right(&var_mostrar,1, pin_C0));

Como dije, nada está dicho, lo sigo debbugeando y espero terminar para la noche, me faltan colocar todas las cosas en su gabineta, poner el sensor y llevar la máquina al primer piso  :oops:
Nadie nació sabiendo...Que genio ese Nadie!!!


 

anything