2

我正在尝试在 PIC 16LF1827 上使用捕获模块,但从未输入 ISR。我从一个基本的下降沿中断(有效)开始,然后在定时器 1 配置中添加(仍然有效),然后禁用 IOC 中断并配置/启用相关的 CCP 中断(从未进入 ISR)。代码如下:注释部分是原始的基本 IOC 设置。

我已经用 MPLab 调试器验证了没有输入 ISR,并通过将其连接到逻辑分析仪并观察 RB1 来确认这一点。

#include "htc.h"

//config1
//internal osc, no wdt, use power-up timer, enable reset
//  no code protection, brown-out-reset enabled, clkout is gpio, 
//  internal-external switchover off, failsafe clock monitor off
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON 
  & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON 
  & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);

//config2 (following MPLab's complaints when running debugger)
//low-voltage programming off, debug on, brown-out reset at 2.7 v
//  stack over/under flow triggers reset, no 4x pll, 
//  no flash write protection
__CONFIG(LVP_OFF & DEBUG_ON & BORV_27 
  & STVREN_ON & PLLEN_OFF & WRT_OFF);

void interrupt isr(void){
    //bounce pin 1
    LATB ^= 0b10;
    LATB ^= 0b10;
    if(IOCIF && IOCBF0){
        IOCBF0 = 0;
        IOCIF = 0; 
    }
    if (CCP1IF){
        CCP1IF = 0;
    }
}

void main(void){
    //configure internal oscillator: 
    //PLL = 0, source = from config 1, frequency = 4 mhz 
    //0b0: SPLLEN_OFF
    OSCCONbits.SPLLEN = 0b0;
    //0b00: use config word 1
    OSCCONbits.SCS = 0b00;
    //0b1101: 4 mhz frequency
    OSCCONbits.IRCF = 0b1101;

    //configure peripherals
    //PORT A: LEDs (output), digital
    TRISA = 0x00;
    ANSELA = 0;
    //PORT B: digital, 0 = input, 1 = output, rest don't care
    TRISB = 0b11111101;
    ANSELB = 0;

    //configure timer 1 (not needed for basic IOC)
    //source = instruction clock, prescale = 1:1, disable LP osc, do synchronize (DC)
    //0b00: instruction clock
    T1CONbits.TMR1CS = 0b00;
    //0b00: 1:1
    T1CONbits.T1CKPS = 0b00;
    //0b0: lp osc off
    T1OSCEN = 0b0;
    //0b0: synch (ignored)
    nT1SYNC = 0b0;

    //interrupts
    /*
    //IOC enabled on falling edge for port B 0
    IOCBN0 = 0b00000001;
    IOCIE = 1;
    */

    //Capture on falling edge for port B 0
    //notes in 23.1 of DS: disable interrupt, set operating mode, clear flag, enable interrupt
    CCP1IE = 0b0;
    //0b100: every falling edge
    CCP1CONbits.CCP1M = 0b100;
    CCP1IF = 0b0;
    CCP1IE = 0b1;
    //enable peripheral interrupts, global interrupts
    PEIE = 1;
    GIE = 1;

    //start timer 1
    TMR1ON = 1;
    while(1){
        //Toggle led 0
        LATA ^= 0b1;
    }
}

我正在使用在 MPLab 中运行的 HI-TECH C 编译器 (lite)。

任何建议将不胜感激。如果我使用术语,我深表歉意,这是我在 PIC 上的第一个项目。

4

1 回答 1

1

您对 TRISB1 的设置是作为输出。根据数据表,捕获引脚需要配置为输入。对于 GPIO 引脚,将 TRIS 位设置为 0 是输出,1 是输入。

编辑:原谅最初的愚蠢答案,因为我没有意识到您正在使用 PORTB1 作为示波器的 GPIO 指示器。

所以最初你使用 PORTB0 作为你的捕获引脚正确(使用 IOC)?捕捉模块使用不同的 GPIO 端口作为其输入(用于 CCP1 的 PORTB3)。您是否将捕获源的连接移至 PORTB3?

编辑:在仔细查看 PIC 数据表后,我注意到 CCP1 的 GPIO 引脚可以从 PORTB3 移动到 PORTB0,但我没有看到任何关于如何设置 APFCON0.CCP1SEL 位的参考。那将是要检查的其他内容。

于 2011-03-28T23:13:03.420 回答