Моя цель - измерить импульсы ШИМ. Но чтобы добиться этого, я делаю маленькие шаги, поэтому моя первая цель — установить булавку при обнаружении фронта сигнала ШИМ. Сигнал ШИМ поступает в микроконтроллер (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?
Вероятно, это связано с тем, что на контакте B1 есть другие функции, которые необходимо отключить, прежде чем вы сможете использовать его в качестве цифрового входа.
В таблице данных мы находим таблицу 11-4, показанную ниже:
Беглый взгляд на этот регистр в таблице данных показывает, что он установлен 1
по умолчанию, что означает режим аналогового ввода:
Вам нужно будет очистить этот бит, прежде чем вы сможете использовать его в качестве цифрового входа.
Вам также нужно будет выполнить сброс INTCON3bits.INT1IF
в 0
вашей процедуре обслуживания прерывания, иначе обработчик будет продолжать срабатывать, и вы никогда не сможете избежать его.
Если вы пытаетесь измерить ШИМ, вы можете прочитать раздел 20.2 «Режим захвата» в таблице данных. При этом используется Enhanced Capture and Compare Peripheral. Он действует как прерывание по выбору фронта, но также сохраняет значение TMR1 или TMR3, позволяя вам выполнять измерения периода или рабочего цикла (или того и другого).
Дэйвид
Дэйвид