TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: elgarbe en 06 de Noviembre de 2013, 00:13:19
-
Buenas, tengo un programa en XC8, el cual maneja 4 interrupciones. Timer 0, 1 y 2 e interrupcion externa. La estructura es esta:
/********** Funcion para la ISR (Rutina de Servicio de Interrupcion) **********/
void interrupt interrupciones (void) {
// se verifica si la interrupcion es externa
// Se produce al pasar la placa por el sensor de luz
if (INTE && INTF){
T_rev=TMR1; //uSeg de período del POV
TMR1=0;
......
contador=0; //Reinicio la cuenta ya que estoy en el origen
INTF=0; //Borro la bandera
}
// se verifica si la interrupcion es por TMR0. Se produce cada 10mseg aprox
if (TMR2IE && TMR2IF){
// AQUI DEBO PONER EL CAMBIO DE UNA SALIDA DEL MICRO PARA REGULAR QUE SE ACTUALICE CADA 10MSEG
.....
TMR2 = i_ADJ_TIME;
TMR2IF = 0; // Pongo en 0 el Flag de interrupcion del TMR0
}
//Interrupcion del Timer 1.
//Se produce entre cada pixel. Aquí devo enviar los datos al display. Aparte
//incremento contador para saber en que columna me encuentro.
if (TMR0IE && TMR0IF){
//port_a=contador<(pixeles/4)?reloj[contador]:0;
TMR0 = T_timer;
......
TMR0IF=0;
}
}
Como ven es la forma típica de manejar interrupciones en XC8.
El problema es que la interrupcion del TMR0 debería ser de entre 83uSeg y 50uSeg (mas o menos), pero estoy simulando en proteus y veo que desde el void interrupt interrupciones (void) hasta el TMR0 = T_timer; ya tengo caso 10useg!!! por lo que la temporizacion se me va un poco de lo esperado....
La duda es, no se puede mezclar ASM para la parte de las interrupciones para evitar todos esos IF? o sino, de que forma se puede optimizar esos IF o eliminar directamente...
Saludos y gracias!
-
En realidad el IF no lo puedes eliminar ya que es la única forma que tienes de saber cual es la interrupción que se generó.
Podrías reducirlo un poco simplemente haciendo
Es decir, sólo evaluar el flag y no evaluar si está activada la interrupción, pero no creo que cambie demasiado el tiempo.
Sí puedes evaluar primeramente el flag del timer0 para ahorrar tiempo, ya que no se hacen las demás evaluaciones en el caso de que el flag de dicho timer esté activado.
Y, mejor aún, si estás utilizando un PIC con dos vectores de interrupción, puedes asignar únicamente el timer0 al vector de alta prioridad y entonces si entras en él, ya sabes que es el timer0 quien lo activo (aunque lo ideal siempre es evaluar).
-
Gracias por la respuesta!
Voy a cambiar el TMR0 de lugar, ya que es el más sensible a pérdidas de tiempo. Aunque en realidad todo es importante.
El pic es un 16f883, creo que no tiene prioridades.
Estoy pensando que tambien puedo poner el micro a 20MHz (lo tengo a 16 ahora)...
Saludos y gracias!