Мне нужно добавить подпрограмму обслуживания прерываний (ISR) в существующий код на C для PIC18F4620 и PIC18F46K22 . Как видно из раздела 9 (обоих таблиц), эти устройства имеют несколько векторов прерываний: 0x0008
для прерываний с высоким приоритетом, 0x0018
для прерываний с низким приоритетом.
Я хотел бы получить ответ, который полезен во многих случаях, поэтому вопрос будет таким: как я могу сделать функцию для определенного адреса памяти программы? Для ISR этот адрес будет 0x0008
или 0x0018
.
Если это поможет, я использую компилятор MPLAB C18 версии 3.44.
Связанный: Дизайн кодирования C - указатели функций?
Необходимую информацию вы найдете в руководстве по компилятору: MPLAB C18 C COMPILER USER'S GUIDE .
Со страницы 37 руководства пользователя:
MPLAB C18 не размещает автоматически ISR в векторе прерывания. Обычно
GOTO
в вектор прерывания помещается инструкция для передачи управления собственно ISR. Например:
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() {
}
При реализации ISR с высоким приоритетом вы не можете использовать эту interrupthigh
прагму так, как ожидали. Вместо этого вам придется использовать interrupt
прагму, как описано здесь .
Если вы можете изменить компилятор: использование прерываний проще в компиляторах Microchip XC8 или HI-TECH PICC.
Лундин