Rutina de servicio de interrupción en C - función en una dirección específica

6

Necesito agregar una Rutina de servicio de interrupción (ISR) al código existente en C para una PIC18F4620 y PIC18F46K22 . Como puede ver en la sección 9 (de ambas hojas de datos), estos dispositivos tienen múltiples vectores de interrupción: 0x0008 para interrupciones de alta prioridad, 0x0018 para interrupciones de baja prioridad.

Me gustaría tener una respuesta que sea útil en muchos casos, por lo que la pregunta sería: ¿cómo puedo realizar una función en una dirección de memoria de programa específica? Para el ISR, esta dirección sería 0x0008 o 0x0018 .

Si es de alguna utilidad, estoy usando el compilador MPLAB C18, v3.44.

Relacionado: Diseño de codificación C: ¿punteros a funciones?

    
pregunta Keelan

1 respuesta

9

Encontrará la información que necesita en el manual del compilador: MPLAB C18 C GUÍA DEL USUARIO DE LA COMPILITADOR .

Desde la página 37 de la guía del usuario:

  

MPLAB C18 no coloca automáticamente un ISR en el vector de interrupción. Comúnmente, se coloca una instrucción GOTO en el vector de interrupción para transferir el control al ISR apropiado. Por ejemplo:

void lowPriorityISR(void);

#pragma code low_vector=0x18
void interrupt_at_low_vector(void) { 
    _asm GOTO lowPriorityISR _endasm 
}
#pragma code

#pragma interruptlow lowPriorityISR
void lowPriorityISR() {
}

Al implementar un ISR de prioridad alta , no puede utilizar el pragma interrupthigh como cabría esperar. Tendrá que usar interrupt pragma en su lugar, como se describe aquí .

Si puedes cambiar el compilador: usar interrupciones es más fácil en los compiladores Microchip XC8 o HI-TECH PICC.

    
respondido por el m.Alin

Lea otras preguntas en las etiquetas