Включение внешних прерываний в PIC24F (PIC24F32KA302)

Я пытаюсь включить вывод 23 PIC в качестве входа для запуска внешнего прерывания. Я хотел бы установить вывод 23 как INT2 для срабатывания по переднему фронту и с входом, настроенным с понижающим резистором. Это код того, что я пытаюсь сделать:

void EnableINT2IE()
{
    PORTBbits.RB12=1;            //RB12, pin23 is an input.
    //CNPD1bits.CN14PDE = 0;     //pull down resistor
    //CNEN1bits.CN14IE=1;        //enable change notification.
    IFS1bits.INT2IF = 0;         //clear interrupt flag.
    INTCON2bits.INT2EP =0;       //Interrupt iNT2E is on the positive edge
    IPC7bits.INT2IP =7;          //set highest interrupt priority to INT2
    IEC1bits.INT2IE=1;           //Enable INT2IE interruption
}

Я пробовал как с двумя комментируемыми линиями, так и без них (они предназначены для настройки понижающего резистора). Вектор прерывания выглядит следующим образом. Вызывает некоторые существующие функции и включает / выключает светодиод.

void __attribute__((interrupt,auto_psv)) _INT2Interrupt(void) //External Interrupt 2
{
  PORTBbits.RB3 = 1;  //turn on an led,
  RafraichirPTH();    
  RafraichirE();
  LogAppend();
  SfopAppend();
  IFS1bits.INT2IF=0; //clearing INT2 bit
  PORTBbits.RB3 = 0; //turn off led 
}

Проблема в том, что прерывание никогда не срабатывает (я подключаю кабель с 3,3 В к входу). Я не уверен, что прерывание установлено правильно.

Заранее спасибо за помощь.

2 ответа

Я думаю, что вы пробовали неправильный PIN-код.

Если вы посмотрите страницу 4 " Семейных данных", вы заметите, что устройства PIC24FV xxK302 имеют INT2 для PIN 23 (RB12), но PIC24F xxK302 для PIN 20 (что RA6).

Из таблицы PIC24FV32KA304:

Раскрывающиеся функции включаются отдельно с использованием регистров CNPD1 и CNPD2, которые содержат биты управления для каждого из контактов CN. Установка любого из управляющих битов разрешает слабые опускания для соответствующих контактов.

Поэтому, так как вы фактически никогда не активируете слабые опускания, ваш пин может никогда не перейти в нулевое состояние (или, по крайней мере, не в разумные сроки), если у вас нет ничего, что вытягивает его извне. Следующие изменения в вашем коде включат слабые выпадающие списки и, надеюсь, исправят вашу проблему:

--- //CNPD1bits.CN14PDE = 0;     //pull down resistor
+++ CNPD1bits.CN14PDE = 1;     //pull down resistor

Кроме того, как заявляет epichorns, регистр TRISB - это тот, который устанавливает порт на вход / выход, но по умолчанию используется вход, поэтому он не должен быть причиной вашей проблемы.

Другие вопросы по тегам