Necesito agregar una rutina de servicio de interrupción (ISR) al código existente en C para un PIC18F4620 y un 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, entonces la pregunta sería: ¿cómo puedo hacer 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 sirve de algo, estoy usando el compilador MPLAB C18, v3.44.
Relacionado: Diseño de codificación C: ¿punteros de función?
Encontrará la información que necesita en el manual del compilador: GUÍA DEL USUARIO DEL COMPILADOR MPLAB C18 C.
De 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,
GOTO
se coloca una instrucción en el vector de interrupción para transferir el control al ISR propiamente dicho. 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 una ISR de alta prioridad, no puede usar el interrupthigh
pragma como esperaría. Tendrá que usar el interrupt
pragma en su lugar, como se describe aquí .
Si puede cambiar el compilador: usar interrupciones es más fácil en los compiladores Microchip XC8 o HI-TECH PICC.
Lundin