TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: zagoaristides en 12 de Diciembre de 2011, 22:44:03
-
Es así, tengo este bloque de funcion
if (flag_autoconfigurando == FALSE && flag_motores_frenados == TRUE){
var_decrementa_delay_en_slide_timer_1--;
if (var_decrementa_delay_en_slide_timer_1 == 0){
var++;
cambio_de_slide();
var_decrementa_delay_en_slide_timer_1 = delay_en_slide_timer_1;
}
}
que me lleva a la funcion
void cambio_de_slide(void)
{
////controlo primero el numero de slide, si es el último, cambio el sentido
////de giro y reseteo la cuenta. Luego acelero
if (slide_actual == num_de_slides){
sentido_de_giro = !sentido_de_giro;
slide_actual = 0;
}
var_decrementa_arranque = 50; //dependiente de Timer 1
acelerar (sentido_de_giro);
}
y finalmente a este
void acelerar (int sentido)
{
int1 flag_hecho = 0;
//var_decrementa_arranque = 50; //dependiente de Timer 1
flag_motores_frenados = FALSE;
enable_interrupts(INT_TIMER1);
set_timer1(0);
while(var_decrementa_arranque > 1){
if (sentido == sentido_abajo && flag_hecho == 0){
marcha (motor_Sup, sentido, veloc_retencion); //ya que le alcanza para girar sumado el peso de la lona
marcha (motor_Inf, sentido, veloc_baja);
flag_hecho = 1;
}
if (sentido == sentido_arriba && flag_hecho == 0){
marcha (motor_Sup, sentido, veloc_baja); //ya que le alcanza para girar sumado el peso de la lona
marcha (motor_Inf, sentido, veloc_baja);
flag_hecho = 1;
}
}
if (sentido == sentido_abajo){
marcha (motor_Sup, sentido, veloc_baja); //ya que le alcanza para girar sumado el peso de la lona
marcha (motor_Inf, sentido, veloc_media);
}
if (sentido == sentido_arriba){
marcha (motor_Sup, sentido, veloc_media); //ya que le alcanza para girar sumado el peso de la lona
marcha (motor_Inf, sentido, veloc_baja);
}
}
en esta última funcion se queda dando vueltas en el while y nunca salta la Interrupcion del timer 1. Simulando en Proteus me fijo por las dudas todas las banderas y supuestamente están bien. Inclusive probé (se ve en este ultimo código borrar el flag del interrupt pero nada.
void acelerar (int sentido)
{
int1 flag_hecho = 0;
//var_decrementa_arranque = 50; //dependiente de Timer 1
flag_motores_frenados = FALSE;
set_timer1(0);
clear_interrupt(int_timer1);
while(var_decrementa_arranque > 1){
if (sentido == sentido_abajo && flag_hecho == 0){
marcha (motor_Sup, sentido, veloc_retencion); //ya que le alcanza para girar sumado el peso de la lona
marcha (motor_Inf, sentido, veloc_baja);
flag_hecho = 1;
}
if (sentido == sentido_arriba && flag_hecho == 0){
marcha (motor_Sup, sentido, veloc_baja); //ya que le alcanza para girar sumado el peso de la lona
marcha (motor_Inf, sentido, veloc_baja);
flag_hecho = 1;
}
}
if (sentido == sentido_abajo){
marcha (motor_Sup, sentido, veloc_baja); //ya que le alcanza para girar sumado el peso de la lona
marcha (motor_Inf, sentido, veloc_media);
}
if (sentido == sentido_arriba){
marcha (motor_Sup, sentido, veloc_media); //ya que le alcanza para girar sumado el peso de la lona
marcha (motor_Inf, sentido, veloc_baja);
}
}
alguna ayudita... sigo intentando
Grazie mille!
-
Hola, seteaste bien el timer1??
coloca el codigo completo para poder ver mejor en donde podria estar el error.
saludos
-
Hola, seteaste bien el timer1??
coloca el codigo completo para poder ver mejor en donde podria estar el error.
saludos
Sisi, fijate que me faltó poner pero la funcion cambio_de_slide(); se llama desde dentro de Timer 1 (o sea, salta). Será ese el problema?
-
Hola, seteaste bien el timer1??
coloca el codigo completo para poder ver mejor en donde podria estar el error.
saludos
Sisi, fijate que me faltó poner pero la funcion cambio_de_slide(); se llama desde dentro de Timer 1 (o sea, salta). Será ese el problema?
Es así:
#int_TIMER1
void TIMER1_isr(void)
{
var_decrementa_arranque--;
if (flag_autoconfigurando == FALSE && flag_motores_frenados == TRUE){
var_decrementa_delay_en_slide_timer_1--;
if (var_decrementa_delay_en_slide_timer_1 == 0){
var++;
cambio_de_slide();
var_decrementa_delay_en_slide_timer_1 = delay_en_slide_timer_1;
}
}
if (flag_autoconfigurando == FALSE && flag_motores_frenados == FALSE){
if (OPTO1 == TRUE)
desacelerar (sentido_de_giro);
if (FC1 == TRUE)
frenar (sentido_de_giro);
}
que estaría más completo de donde se llama al "camino sin retorno"...
-
Utiliza la interrupcion lo mas eficiente que puedas, para eso usa solo banderas que indiquen que ha ocurrido una interrupcion, no llames a funciones dentro de la interrupcion, en tu caso estas llamado una funcion que llama a otra y esta llama a otra.
Cuando no estes seguro de si entra o no a una interrupcion usa un led que indique, si la interrupcion es muy rapida igual usa un led y mira el pulso en el osciloscopio en proteus
saludos
-
Utiliza la interrupcion lo mas eficiente que puedas, para eso usa solo banderas que indiquen que ha ocurrido una interrupcion, no llames a funciones dentro de la interrupcion, en tu caso estas llamado una funcion que llama a otra y esta llama a otra.
Cuando no estes seguro de si entra o no a una interrupcion usa un led que indique, si la interrupcion es muy rapida igual usa un led y mira el pulso en el osciloscopio en proteus
saludos
Solucionado, era así. Creo que esto que quise hacer es una especie de recursión? Bueno, en todo caso, no hay que hacer procesos largos en una interrupción, eso lo sabía pero... en el frenesí de la programación y en un programa tan largo (voy unas 3000 líneas) era de suponer equivocarse no?
Un abrazo a todos!
-
Que bueno que lo soluciones :).
saludos