Внешнее прерывание не устанавливает бит флага

Моя цель - измерить импульсы ШИМ. Но чтобы добиться этого, я делаю маленькие шаги, поэтому моя первая цель — установить булавку при обнаружении фронта сигнала ШИМ. Сигнал ШИМ поступает в микроконтроллер (pic18f25k80, Datasheet ) на вывод INT1 (RB1). Я написал код для инициализации внешнего прерывания:

#include <stdio.h>
#include <stdlib.h>
#include <pic18f25k80.h>
#include "config.h"


void main() {
        TRISB1 = 1;                 // INT1 as input
        LATB1 = 0;                  // Clear INT1
        TRISC6 = 0;                 // RC6 as output
        LATC6 = 0;                  // Clear RC6
    
        //Setup of INT1
        RCONbits.IPEN = 0;          //Disable priorities
        INTCONbits.GIE_GIEH = 1;    //Enable Global interrupt
        INTCONbits.PEIE_GIEL = 1;   //Enable peripheral interrupts
        INTCON2bits.INTEDG1 = 1;    // Edge select for INT1
        INTCON3bits.INT1IE = 1;     // Enable the INT1 external interrupt
        //INTCON3bits.INT1IP = 0;     // Low priority
        INTCON3bits.INT1IF = 0;        //Clear external interrupt flag bit
    
        while(1) {
        }
    }
    //Interrupt Service Routine
    
    #pragma code isr=0x08
    #pragma interrupt isr
    
    void isr(void)
    {
        if(INTCON3bits.INT1IF){
            LATC6 = 1;
        }
    }
    
    #pragma code

Кажется, что флаг прерывания не становится высоким, потому что на выводе RC6 низкий уровень. Я измерил это с помощью осциллографа. Что я делаю не так?

Кстати, это правильный способ вызвать ISR?

Какой компилятор вы используете?
Также этот процессор имеет модуль CCP, который может подойти для того, что вы пытаетесь сделать.

Ответы (1)

Вероятно, это связано с тем, что на контакте B1 есть другие функции, которые необходимо отключить, прежде чем вы сможете использовать его в качестве цифрового входа.

В таблице данных мы находим таблицу 11-4, показанную ниже:

введите описание изображения здесь

Беглый взгляд на этот регистр в таблице данных показывает, что он установлен 1по умолчанию, что означает режим аналогового ввода:

введите описание изображения здесь

Вам нужно будет очистить этот бит, прежде чем вы сможете использовать его в качестве цифрового входа.

Вам также нужно будет выполнить сброс INTCON3bits.INT1IFв 0вашей процедуре обслуживания прерывания, иначе обработчик будет продолжать срабатывать, и вы никогда не сможете избежать его.

Если вы пытаетесь измерить ШИМ, вы можете прочитать раздел 20.2 «Режим захвата» в таблице данных. При этом используется Enhanced Capture and Compare Peripheral. Он действует как прерывание по выбору фронта, но также сохраняет значение TMR1 или TMR3, позволяя вам выполнять измерения периода или рабочего цикла (или того и другого).

Выделение вашей таблицы 11-4 вводит в заблуждение. Столбец «Бит 1» не относится к контакту B1, за исключением первых трех строк. Все остальные строки не имеют ничего общего с B1 в этом столбце. Например, B1 — это INT1, который управляется битами в столбцах 0, 3 и 6. Это AN8, а не AN9, поэтому бит ANSEL8 в бите 0 столбца нуждается в очистке, а не ANSEL9. Лучше выделять отдельные ячейки, а не один столбец.
Надеюсь, исправил @Majenko-notGoogle.
Вы также можете обновить образ регистра 23-9...
Сделал это и @Majenko-notGoogle - спасибо!