Модуль захвата ввода PIC32

Я пытаюсь использовать модуль захвата ввода на PIC32MX250F128B для измерения частоты прямоугольной волны. Результаты, которые я получаю, противоречивы и неверны. Все, что я пытаюсь здесь сделать, это измерить частоту входной прямоугольной волны, считывая значение захвата при каждом прерывании по заднему фронту. Затем я сбрасываю Timer2 и снова считываю значение захвата при следующем прерывании.

Вот мой ISR:

void __ISR(_INPUT_CAPTURE_4_VECTOR, ipl1) Capture4(void) {
    mPORTBToggleBits(BIT_10);
    capture_value = IC4BUF; 
    mIC4ClearIntFlag();
    TMR2 = 0;
}

Вот мои конфигурации модуля:

IC4Rbits.IC4R = 0;     // Assign peripheral pin RPA0 to IC4
mPORTASetPinsDigitalIn(BIT_0);
IC4CONbits.C32 = 0;    // 16-bit source timer
IC4CONbits.ICTMR = 1;  // Use Timer2
IC4CONbits.ICI = 0;    // Interrupt every capture event
IC4CONbits.ICM = 2;    // Simple Capture Event mode - every falling edge
IFS0bits.IC4IF = 0;    // Clear interrupt flag
IFS0bits.IC4IE = 1     // Enable IC interrupt
IFS0bits..IC4IP = 1;   // Set interrupt priority to 1
IC4CONbits.ON = 1;     // Enable IC module

T2CONbits.ON = 0;      // Disable while config
TCONbits.SIDLE  = 0;   // Continue in idle mode
TCONbits.TCS = 0;      // Use internal clock
TCONbits.TCKPS = 0;    // Set 1:1 prescale
TCONbits.TGATE = 0;    // Disable gated time accumulation
PR2 = 0xFFFF;          // set period register
TMR2 = 0;              // start counting at zero
T2CONbits.ON = 1;      // enable module

Вы заметите, что первая строка ISR переключает цифровой выход; Я добавил это, чтобы я мог отслеживать активность, чтобы увидеть, было ли когда-либо вызвано прерывание. Прерывание действительно вызывается, и я просмотрел его на осциллографе. Я ожидаю, что ISR будет вызываться последовательно в соответствии с падающими фронтами входной прямоугольной волны, но это не так. Вместо этого ISR вызывается непоследовательно через кажущиеся случайными интервалы. Кроме того, значения, считываемые с IC4BUF, вообще не коррелируют с какими-либо настройками частоты входного сигнала.

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

Какой диапазон частот вы собираетесь измерять и какова тактовая частота вашего PIC?
Capture_value объявлен как volatile?
PIC работает на частоте 48 МГц. Я ожидаю входы в диапазоне от 0,1 до 100 кГц.
@RogerRowland, да, я пробовал, когда capture_value объявлен как volatile, без изменений

Ответы (1)

Проверьте эту команду: IFS0bits.IC4IE = 1. Здесь IEC0следует использовать регистр IFS0для проверки битов флага, которые получают SET при возникновении любого прерывания. Итак, измените свою команду следующим образом:

IEC0bits.IC4IE = 1

(Если это по-прежнему не работает, проверьте расположение IC4IEбит в таблице данных.)

IFS0bits..IC4IP = 1: эта команда также неверна, вы должны использовать IPC0регистр для установки приоритета захвата ввода.