Внешний источник прерывания на PIC24F16KA102

Я пытаюсь работать с внешним источником прерывания и написал небольшую программу для проверки прерывания. Когда я запускаю программу, RB0 устанавливается в низкий уровень, а RB1 — в высокий. Если я устанавливаю RB7 в высокий уровень, должно быть сгенерировано прерывание, которое меняет логическое состояние RB0 и RB1. Я не знаю, почему прерывание не работает. Я настроил все регистры, чего-то еще не хватает? Компилятор xc16.

Спасибо.

Вот код:

#include <xc.h>
#include "setup.h"

void main(void) {

    AD1PCFG = 0xFFFF;
    TRISBbits.TRISB7=1;
    TRISBbits.TRISB0=0;
    TRISBbits.TRISB1=0;
    PORTBbits.RB0=0;
    PORTBbits.RB1=0;   

    _INT0IE= 1;    //enable interrupt on RB7
    _INT0IF = 0;    //clear status flag interrupt on RB7
    _INT0IP = 0b010;    /priority level 2 for INT0


    while(1) {
        _RB0=0;
        _RB1=1; 
    }     

}

void _ISR _INT0Interrupt(void) { 

    if(_INT0IF) {
        _INT0IF = 0;
        _RB0=1;
        _RB1=0;
    }   

}

person Fire91    schedule 19.03.2018    source источник
comment
Откуда вы знаете, что он не работает? Цикл while в main() многократно отменяет то, что сделал ISR. Вы можете пропустить изменение, если не наблюдаете с достаточно высоким разрешением.   -  person kkrambo    schedule 19.03.2018
comment
Привет kkrambo, это был пример и я не заметил этой банальной ошибки. Но я сделал тест с другой программой, в которой в main() было пустое время, ISR установил RB0 на высоком уровне. Однако это не работает. Я тестировал программу сначала на протеусе, а потом в реальной схеме.   -  person Fire91    schedule 19.03.2018
comment
Я решил проблему! Ошибка _INT0IP = 0b010; используется для установки приоритета. Компилируется без ошибок, но в рантайме не работает. Пробовал выставлять биты таким образом: IPC0bits.INT0IP2 = 0; IPC0bits.INT0IP1 = 1; IPC0bits.INT0IP0 = 0; и это работает!   -  person Fire91    schedule 19.03.2018
comment
Где определяется _INT0IP? Вы также должны были установить его для структуры/объединения IPC0bits, точно так же, как вы установили отдельные биты, то есть: IPC0bits.INT0IP = 2.   -  person Groo    schedule 21.03.2018


Ответы (2)


Напишите следующий код в своем ISR, как хотите. Просто измените состояние RB0 и RB1, и вы должны включить глобальное и периферийное прерывание, т. Е. GIE и PIE.

    void_ISR_INT0Interrupt(void){
    if(_INT0IF){
    _INT0IF=0;
    _RB0=~_RB0;
    _RB1=~_RB1;
    }
}
person Kalpesh Navadiya    schedule 21.03.2018

как правило, рекомендуется записывать в регистры-защелки, а не в порт. Когда вы выполняете запись, вы фактически читаете порт, изменяете бит(ы), а затем записываете. В зависимости от схемы, чтение вашего порта может не отражать то значение, которое вы думаете. Записав в регистр-защелку, вы прочитаете желаемое состояние вывода и запишете его обратно в порт (через защелку).

person Joe Thomas    schedule 24.03.2018