TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: piriots en 25 de Agosto de 2005, 10:51:00

Título: Problema con interrupcion y CAD
Publicado por: piriots en 25 de Agosto de 2005, 10:51:00
Bueno les cuento. Estoy usando un pic 16f877, usa la interrupcion del timer0 para capturar el valor de un encoder de un motor cada 2 segundos. Los pulsos que manda el encoder los meto en un contador dentro de la rutina de atencion a la interrupcion de RB5 y RB6, hasta aqui todo bien. El problema es que tambien tengo que leer 2 sensores de temperatura LM35, en la funcion que se encarga de leer la temperatura desactivo las interrupciones para que no interrupman la conversion. Esto hace que el resultado de los encoders pase de ser de 3600rpm del motor a poco mas de 200.

En la funcion principal del programa solo hay la conversion de temperaturas, la otra info se trata por interrupciones y esto hace que las interrupciones esten la mayor parte del tiempo desactivadas. Como puedo solucionar esto? Seria una solucion hacer la lectura de las sondas dentro de la rutina de interrupcion del timer?? es que si lo hago asin pierdo resolucion de los encoders...

Salu2 y gracias de antemano
Título: RE: Problema con interrupcion y CAD
Publicado por: piriots en 26 de Agosto de 2005, 05:11:00
Nadie???Llorando
Título: RE: Problema con interrupcion y CAD
Publicado por: antoniof en 26 de Agosto de 2005, 08:38:00
Bueno las interrupciones están para eso, es decir, que el programa principal haga algo y la rutina de interrupción haga otra cosa sin interferir una en la otra.

No vas a interferir en el conversor si activas la interrupción del timer, simplemente, cuando salte la interrupción, capturarás el valor del encoder y cuando no, operas con el conversor.

Pon el sódigo aqui a ver como lo tienes hecho.
Título: RE: Problema con interrupcion y CAD
Publicado por: piriots en 26 de Agosto de 2005, 14:46:00
Yo tenia entendido que si saltaba la interrupcion mientras se estaba usando el cad el valor de la conversion era erroneo. El programa estaria mejor en el foro de c pero bueno aqui dejo un trozo del programa.

[code]
///////////////////////////////////////////////////////////////////////////
//   Funcion de interrupcion para el tach de los ventiladores  //
///////////////////////////////////////////////////////////////////////////
#int_rb
void inter_rb()
{
short enc1,enc2;
static short ultim_enc1=1;
static short ultim_enc2=1;
enc1=input(pin_b5);
enc2=input(pin_b6);
if(ultim_enc1 && !enc1) tach1++;
if(ultim_enc2 && !enc2) tach2++;
ultim_enc1=enc1;
ultim_enc2=enc2;
}
///////////////////////////////////////////////////////////////////////////
//           Funcion de interrupcion del timer0                             //
///////////////////////////////////////////////////////////////////////////
#int_timer0
void inter_timer0()
{
static byte timer_0_count=0;
if (timer_0_count<31)timer_0_count++;
else
{
timer_0_count=0;
cont1=tach1;
cont2=tach2;
rpm1=(cont1/4)*60;
rpm2=(cont2/4)*60;
printf(lcd_putc,"fr1=%lu r2=%lu",rpm1,rpm2);
tach1=0;
tach2=0;
temp_int();
}
set_timer0 (8);
}

void temp_int()
{
disable_interrupts(global);              
set_adc_channel(0);                      
delay_ms(16);
temp1=read_adc();                          
set_adc_channel(1);                        
delay_ms(16);                              
temp2=read_adc();                          
enable_interrupts(global);                
}
[code]
Título: RE: Problema con interrupcion y CAD
Publicado por: antoniof en 27 de Agosto de 2005, 13:14:00
Con lo poco que se de C lo único que te puedo decir es que "parece" todo correcto.

Efectivamente, si salta una interrución el valor del CAD NO es erroneo. El CAD trabaja independientemente de lo que haga la CPU del PIC, por lo que no le afectan ni interrupciones, ni nada. Una vez activado, captura la señal analógica, la convierte y la almacena en los registros ADRESH y ADRESL. Lo único que puede afectar a esta operación, es que modifiques los valores de estos registros o de los ADCON0 y ADCON1 desde la rutina de interrupción.
Título: RE: Problema con interrupcion y CAD
Publicado por: todopic en 27 de Agosto de 2005, 21:50:00
Hola Piriots... por lo que veo, lees 3 temperaturas???, si es asi, en la tercera no le das tiempo de conversion, y activas las interrupciones... quizas esa sea la falla?...
(recien empiezo con el C, y aun no C nada je je je..)

Norberto
Título: RE: Problema con interrupcion y CAD
Publicado por: BrunoF en 28 de Agosto de 2005, 02:37:00
Hola, mira...Ese es el problema de las interrupciones, esta todo barbaro, hasta que le tienes que agregar otras tareas simultaneas al PIC y ZAZ! la interrupcion resulta ser una pesadilla.
Lo que dice Norberto puede ser, espero que te hayas fijado en eso.
Pregunta: ¿Por que utilizas la interrupcion y porque utilizas el timer0? ¿Acaso necesitas economizar energia? ¿No es mas simple y rapido hacer un loop que se fije si el CAD  termino  de escribir el valor? y luego pasar a leer los 3 sensores restantes?
Saludos y espero me expliques, porque por ahi entendi todo mal. O simplifique demasiado todo Giño
Título: RE: Problema con interrupcion y CAD
Publicado por: antoniof en 28 de Agosto de 2005, 06:46:00
Bueno chicos no se si estoy equivocado o es que en C la cosa cambia, pero en ASM creo que activar o no las interrupciones no afecta para nada al CAD.
Lo único que hay que hacer bien es salvar y restaurar los registros "w", "pclath", y "status".
Título: RE: Problema con interrupcion y CAD
Publicado por: piriots en 28 de Agosto de 2005, 10:21:00
A ver, tengo la interrupcion del timer0 configurada para que salte cada dos segundos, con esto capturo los pulsos del encoder, que manda 2 por cada revolucion. Asin dividiendolo por 4 obtengo las rpm en un segundo lo miltiplico por 60 y ya tengo las rpm. Lo del CAD lo he metido dentro de la rutina de interrupcion porque si lo meto dentro del bucle principal las interrupciones estan desactivadas casi siempre.

Al final en c la interrupcion afecta al CAD o no?? Si no le afecta leo el cad dento del bucle principal y listos, pero es que me suena haver visto en algun lugar que si que afectaba, a lo mejor estoy equivocado....

Salu2