Autor Tema: Programa en XC8 pero Interrupciones en ASM  (Leído 1402 veces)

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

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Programa en XC8 pero Interrupciones en ASM
« 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:

Código: [Seleccionar]
/********** 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!
-
Leonardo Garberoglio

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Programa en XC8 pero Interrupciones en ASM
« Respuesta #1 en: 06 de Noviembre de 2013, 09:39:53 »
  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

Código: C
  1. IF (TMR0IF == 1)

  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).
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Programa en XC8 pero Interrupciones en ASM
« Respuesta #2 en: 06 de Noviembre de 2013, 11:35:10 »
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!
-
Leonardo Garberoglio


 

anything