2016-06-08 9 views
0

Я использую PIC32MZ2048ECH144. У меня есть два переключателя, подключенных к RH8 (контактный номер 81) и RH9 (контактный номер 82). Я не вижу никакой опции в MHC, чтобы установить прерывание на уровне булавки, поэтому я получаю ISR, сгенерированный для порта-H. Мне нужны ISR для каждого вывода, который вызывается отдельно. Следовательно, в функции "system_init.c", в "SYS_Initialize" Я добавил следующие строки,Как написать макрос ISR для 2 контактов на одном и том же порту в PIC32MZ2048ECH144 с помощью Microchip Harmony Configurator (MHC)?

PLIB_PORTS_PinChangeNoticePerPortEnable (PORTS_ID_0, PORT_CHANNEL_H, PORTS_BIT_POS_8); PLIB_PORTS_PinChangeNoticePerPortEnable (PORTS_ID_0, PORT_CHANNEL_H, PORTS_BIT_POS_9);

ИСР порождена MHC в "system_interrupt.c":

void __ISR(_CHANGE_NOTICE_H_VECTOR, ipl3AUTO) _IntHandlerChangeNotification_PortH1(void) 
    { 
     PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_CHANGE_NOTICE_H); 
     APP_SwitchChangeNoticed(); 
    } 

Я заменил выше ISR макрос ниже строки:

void __ISR(_ADC1_DATA22_VECTOR, ipl3AUTO) _IntHandlerChangeNotification_PortH1(void) 
    { 
     PLIB_INT_SourceFlagClear(INT_ID_0, INT_SOURCE_CHANGE_NOTICE); 
     APP_SwitchChangeNoticed(); 
    } 

    void __ISR(_ADC1_DATA23_VECTOR, ipl3AUTO) _IntHandlerChangeNotification_PortH(void) 
    { 
     PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_CHANGE_NOTICE_H); 
     test1(); 
    } 

Это не сработало. Я сослался на ссылку http://microchip.wikidot.com/faq:78. Я чувствую, что ошибаюсь в выборе номеров векторов для макросов ISR из «/pic32mx/include/proc/p32mz2048ech144.h». (Я использовал _ADC1_DATA22_VECTOR и _ADC1_DATA23_VECTOR, думая, что значения против них 81 и 82 являются номерами контактов, что опять не сработало.) Любая помощь или подсказки о том, как установить прерывания уровня булавки (2 контакта на одном и том же порту), будет действительно здорово! Прошу прощения за любые ошибки в моем посте.

Заранее спасибо.

+0

Скорее всего, вам необходимо проверить регистр флага изнутри ISR, чтобы узнать, какой порт вызвал прерывание, а затем выполнить код, специфичный для буфера оттуда. – Lundin

+0

Я думаю, что ISR с вектором (_CHANGE_NOTICE_H_VECTOR) запускается только в случае изменения порта H. Поэтому в этом случае я могу напрямую использовать код, специфичный для PIN-кода, внутри ISR. –

ответ

1

Короткий ответ заключается в том, что то, что вы просите, не может быть достигнуто напрямую с помощью двух отдельных ISR. Для всего порта H доступен только один идентификатор ISR уведомления об изменении. Обычно вы достигаете того, что ищете, с дополнительной проверкой программного обеспечения, чтобы определить, какой из ваших двух контактов находится в другом состоянии. Другим методом является простое перемещение вашего сигнала на другой порт (если ваша плата не завершена).

Имя, которое вы даете этой функции, не имеет отношения к тому, на что реагирует ISR. Реальная магия возникает в макросах __ISR.

Например:

void __ISR(_CHANGE_NOTICE_H_VECTOR, ipl3AUTO) _IntHandler1234() 

Обратите внимание на _CHANGE_NOTICE_H_VECTOR; это означает, что эта процедура обслуживания прерываний вызывается, когда прерывание уведомления об изменении происходит на порту H.

+0

Ваш ответ действительно полезен. Спасибо! Я не смогу изменить порт, поскольку плата завершена. Но я могу использовать проверку программного обеспечения, сохраняя предыдущее состояние каждого булавки и проверяя текущее состояние. Спасибо за быстрый ответ :) –

+0

У меня есть проект, который использует серию PIC32MX, которая имеет только один CN ISR. Я использую sw, чтобы определить, какой штырь изменился на наборе из 4 контактов CN. Это умело. – blsmit5728